Bug Summary

File:jdk/src/hotspot/cpu/x86/templateTable_x86.cpp
Warning:line 2128, column 18
Value stored to 'inv_offset' during its initialization is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name templateTable_x86.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -mthread-model posix -fno-delete-null-pointer-checks -mframe-pointer=all -relaxed-aliasing -fmath-errno -fno-rounding-math -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -dwarf-column-info -fno-split-dwarf-inlining -debugger-tuning=gdb -resource-dir /usr/lib/llvm-10/lib/clang/10.0.0 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/libjvm/objs/precompiled -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -D __STDC_CONSTANT_MACROS -D _GNU_SOURCE -D _REENTRANT -D LIBC=gnu -D LINUX -D VM_LITTLE_ENDIAN -D _LP64=1 -D ASSERT -D CHECK_UNHANDLED_OOPS -D TARGET_ARCH_x86 -D INCLUDE_SUFFIX_OS=_linux -D INCLUDE_SUFFIX_CPU=_x86 -D INCLUDE_SUFFIX_COMPILER=_gcc -D TARGET_COMPILER_gcc -D AMD64 -D HOTSPOT_LIB_ARCH="amd64" -D COMPILER1 -D COMPILER2 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc/adfiles -I /home/daniel/Projects/java/jdk/src/hotspot/share -I /home/daniel/Projects/java/jdk/src/hotspot/os/linux -I /home/daniel/Projects/java/jdk/src/hotspot/os/posix -I /home/daniel/Projects/java/jdk/src/hotspot/cpu/x86 -I /home/daniel/Projects/java/jdk/src/hotspot/os_cpu/linux_x86 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc -I /home/daniel/Projects/java/jdk/src/hotspot/share/precompiled -I /home/daniel/Projects/java/jdk/src/hotspot/share/include -I /home/daniel/Projects/java/jdk/src/hotspot/os/posix/include -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/support/modules_include/java.base -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/support/modules_include/java.base/linux -I /home/daniel/Projects/java/jdk/src/java.base/share/native/libjimage -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc/adfiles -I /home/daniel/Projects/java/jdk/src/hotspot/share -I /home/daniel/Projects/java/jdk/src/hotspot/os/linux -I /home/daniel/Projects/java/jdk/src/hotspot/os/posix -I /home/daniel/Projects/java/jdk/src/hotspot/cpu/x86 -I /home/daniel/Projects/java/jdk/src/hotspot/os_cpu/linux_x86 -I /home/daniel/Projects/java/jdk/build/linux-x86_64-server-fastdebug/hotspot/variant-server/gensrc -D _FORTIFY_SOURCE=2 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/c++/7.5.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/x86_64-linux-gnu/c++/7.5.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/x86_64-linux-gnu/c++/7.5.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/7.5.0/../../../../include/c++/7.5.0/backward -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-10/lib/clang/10.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O3 -Wno-format-zero-length -Wno-unused-parameter -Wno-unused -Wno-parentheses -Wno-comment -Wno-unknown-pragmas -Wno-address -Wno-delete-non-virtual-dtor -Wno-char-subscripts -Wno-array-bounds -Wno-int-in-bool-context -Wno-ignored-qualifiers -Wno-missing-field-initializers -Wno-implicit-fallthrough -Wno-empty-body -Wno-strict-overflow -Wno-sequence-point -Wno-maybe-uninitialized -Wno-misleading-indentation -Wno-cast-function-type -Wno-shift-negative-value -std=c++14 -fdeprecated-macro -fdebug-compilation-dir /home/daniel/Projects/java/jdk/make/hotspot -ferror-limit 19 -fmessage-length 0 -fvisibility hidden -stack-protector 1 -fno-rtti -fgnuc-version=4.2.1 -fobjc-runtime=gcc -fdiagnostics-show-option -vectorize-loops -vectorize-slp -analyzer-output=html -faddrsig -o /home/daniel/Projects/java/scan/2021-12-21-193737-8510-1 -x c++ /home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp
1/*
2 * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#include "precompiled.hpp"
26#include "asm/macroAssembler.hpp"
27#include "compiler/disassembler.hpp"
28#include "gc/shared/collectedHeap.hpp"
29#include "gc/shared/tlab_globals.hpp"
30#include "interpreter/interpreter.hpp"
31#include "interpreter/interpreterRuntime.hpp"
32#include "interpreter/interp_masm.hpp"
33#include "interpreter/templateTable.hpp"
34#include "memory/universe.hpp"
35#include "oops/methodData.hpp"
36#include "oops/objArrayKlass.hpp"
37#include "oops/oop.inline.hpp"
38#include "prims/jvmtiExport.hpp"
39#include "prims/methodHandles.hpp"
40#include "runtime/frame.inline.hpp"
41#include "runtime/safepointMechanism.hpp"
42#include "runtime/sharedRuntime.hpp"
43#include "runtime/stubRoutines.hpp"
44#include "runtime/synchronizer.hpp"
45#include "utilities/macros.hpp"
46
47#define __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 47, _masm)->
Disassembler::hook<InterpreterMacroAssembler>(__FILE__"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp", __LINE__47, _masm)->
48
49// Global Register Names
50static const Register rbcp = LP64_ONLY(r13)r13 NOT_LP64(rsi);
51static const Register rlocals = LP64_ONLY(r14)r14 NOT_LP64(rdi);
52
53// Address Computation: local variables
54static inline Address iaddress(int n) {
55 return Address(rlocals, Interpreter::local_offset_in_bytes(n));
56}
57
58static inline Address laddress(int n) {
59 return iaddress(n + 1);
60}
61
62#ifndef _LP641
63static inline Address haddress(int n) {
64 return iaddress(n + 0);
65}
66#endif
67
68static inline Address faddress(int n) {
69 return iaddress(n);
70}
71
72static inline Address daddress(int n) {
73 return laddress(n);
74}
75
76static inline Address aaddress(int n) {
77 return iaddress(n);
78}
79
80static inline Address iaddress(Register r) {
81 return Address(rlocals, r, Address::times_ptr);
82}
83
84static inline Address laddress(Register r) {
85 return Address(rlocals, r, Address::times_ptr, Interpreter::local_offset_in_bytes(1));
86}
87
88#ifndef _LP641
89static inline Address haddress(Register r) {
90 return Address(rlocals, r, Interpreter::stackElementScale(), Interpreter::local_offset_in_bytes(0));
91}
92#endif
93
94static inline Address faddress(Register r) {
95 return iaddress(r);
96}
97
98static inline Address daddress(Register r) {
99 return laddress(r);
100}
101
102static inline Address aaddress(Register r) {
103 return iaddress(r);
104}
105
106
107// expression stack
108// (Note: Must not use symmetric equivalents at_rsp_m1/2 since they store
109// data beyond the rsp which is potentially unsafe in an MT environment;
110// an interrupt may overwrite that data.)
111static inline Address at_rsp () {
112 return Address(rsp, 0);
113}
114
115// At top of Java expression stack which may be different than esp(). It
116// isn't for category 1 objects.
117static inline Address at_tos () {
118 return Address(rsp, Interpreter::expr_offset_in_bytes(0));
119}
120
121static inline Address at_tos_p1() {
122 return Address(rsp, Interpreter::expr_offset_in_bytes(1));
123}
124
125static inline Address at_tos_p2() {
126 return Address(rsp, Interpreter::expr_offset_in_bytes(2));
127}
128
129// Condition conversion
130static Assembler::Condition j_not(TemplateTable::Condition cc) {
131 switch (cc) {
132 case TemplateTable::equal : return Assembler::notEqual;
133 case TemplateTable::not_equal : return Assembler::equal;
134 case TemplateTable::less : return Assembler::greaterEqual;
135 case TemplateTable::less_equal : return Assembler::greater;
136 case TemplateTable::greater : return Assembler::lessEqual;
137 case TemplateTable::greater_equal: return Assembler::less;
138 }
139 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 139); ::breakpoint(); } while (0)
;
140 return Assembler::zero;
141}
142
143
144
145// Miscelaneous helper routines
146// Store an oop (or NULL) at the address described by obj.
147// If val == noreg this means store a NULL
148
149
150static void do_oop_store(InterpreterMacroAssembler* _masm,
151 Address dst,
152 Register val,
153 DecoratorSet decorators = 0) {
154 assert(val == noreg || val == rax, "parameter is just for looks")do { if (!(val == noreg || val == rax)) { (*g_assert_poison) =
'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 154, "assert(" "val == noreg || val == rax" ") failed", "parameter is just for looks"
); ::breakpoint(); } } while (0)
;
155 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 155, _masm)->
store_heap_oop(dst, val, rdx, rbx, decorators);
156}
157
158static void do_oop_load(InterpreterMacroAssembler* _masm,
159 Address src,
160 Register dst,
161 DecoratorSet decorators = 0) {
162 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 162, _masm)->
load_heap_oop(dst, src, rdx, rbx, decorators);
163}
164
165Address TemplateTable::at_bcp(int offset) {
166 assert(_desc->uses_bcp(), "inconsistent uses_bcp information")do { if (!(_desc->uses_bcp())) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 166, "assert(" "_desc->uses_bcp()" ") failed", "inconsistent uses_bcp information"
); ::breakpoint(); } } while (0)
;
167 return Address(rbcp, offset);
168}
169
170
171void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg,
172 Register temp_reg, bool load_bc_into_bc_reg/*=true*/,
173 int byte_no) {
174 if (!RewriteBytecodes) return;
175 Label L_patch_done;
176
177 switch (bc) {
178 case Bytecodes::_fast_aputfield:
179 case Bytecodes::_fast_bputfield:
180 case Bytecodes::_fast_zputfield:
181 case Bytecodes::_fast_cputfield:
182 case Bytecodes::_fast_dputfield:
183 case Bytecodes::_fast_fputfield:
184 case Bytecodes::_fast_iputfield:
185 case Bytecodes::_fast_lputfield:
186 case Bytecodes::_fast_sputfield:
187 {
188 // We skip bytecode quickening for putfield instructions when
189 // the put_code written to the constant pool cache is zero.
190 // This is required so that every execution of this instruction
191 // calls out to InterpreterRuntime::resolve_get_put to do
192 // additional, required work.
193 assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range")do { if (!(byte_no == f1_byte || byte_no == f2_byte)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 193, "assert(" "byte_no == f1_byte || byte_no == f2_byte" ") failed"
, "byte_no out of range"); ::breakpoint(); } } while (0)
;
194 assert(load_bc_into_bc_reg, "we use bc_reg as temp")do { if (!(load_bc_into_bc_reg)) { (*g_assert_poison) = 'X';;
report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 194, "assert(" "load_bc_into_bc_reg" ") failed", "we use bc_reg as temp"
); ::breakpoint(); } } while (0)
;
195 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 195, _masm)->
get_cache_and_index_and_bytecode_at_bcp(temp_reg, bc_reg, temp_reg, byte_no, 1);
196 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 196, _masm)->
movl(bc_reg, bc);
197 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 197, _masm)->
cmpl(temp_reg, (int) 0);
198 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 198, _masm)->
jcc(Assembler::zero, L_patch_done); // don't patch
199 }
200 break;
201 default:
202 assert(byte_no == -1, "sanity")do { if (!(byte_no == -1)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 202, "assert(" "byte_no == -1" ") failed", "sanity"); ::breakpoint
(); } } while (0)
;
203 // the pair bytecodes have already done the load.
204 if (load_bc_into_bc_reg) {
205 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 205, _masm)->
movl(bc_reg, bc);
206 }
207 }
208
209 if (JvmtiExport::can_post_breakpoint()) {
210 Label L_fast_patch;
211 // if a breakpoint is present we can't rewrite the stream directly
212 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 212, _masm)->
movzbl(temp_reg, at_bcp(0));
213 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 213, _masm)->
cmpl(temp_reg, Bytecodes::_breakpoint);
214 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 214, _masm)->
jcc(Assembler::notEqual, L_fast_patch);
215 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 215, _masm)->
get_method(temp_reg);
216 // Let breakpoint table handling rewrite to quicker bytecode
217 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 217, _masm)->
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::set_original_bytecode_at)((address)((address_word)(InterpreterRuntime::set_original_bytecode_at
)))
, temp_reg, rbcp, bc_reg);
218#ifndef ASSERT1
219 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 219, _masm)->
jmpb(L_patch_done)jmpb_0(L_patch_done, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 219)
;
220#else
221 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 221, _masm)->
jmp(L_patch_done);
222#endif
223 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 223, _masm)->
bind(L_fast_patch);
224 }
225
226#ifdef ASSERT1
227 Label L_okay;
228 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 228, _masm)->
load_unsigned_byte(temp_reg, at_bcp(0));
229 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 229, _masm)->
cmpl(temp_reg, (int) Bytecodes::java_code(bc));
230 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 230, _masm)->
jcc(Assembler::equal, L_okay);
231 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 231, _masm)->
cmpl(temp_reg, bc_reg);
232 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 232, _masm)->
jcc(Assembler::equal, L_okay);
233 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 233, _masm)->
stop("patching the wrong bytecode");
234 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 234, _masm)->
bind(L_okay);
235#endif
236
237 // patch bytecode
238 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 238, _masm)->
movb(at_bcp(0), bc_reg);
239 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 239, _masm)->
bind(L_patch_done);
240}
241// Individual instructions
242
243
244void TemplateTable::nop() {
245 transition(vtos, vtos);
246 // nothing to do
247}
248
249void TemplateTable::shouldnotreachhere() {
250 transition(vtos, vtos);
251 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 251, _masm)->
stop("shouldnotreachhere bytecode");
252}
253
254void TemplateTable::aconst_null() {
255 transition(vtos, atos);
256 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 256, _masm)->
xorl(rax, rax);
257}
258
259void TemplateTable::iconst(int value) {
260 transition(vtos, itos);
261 if (value == 0) {
262 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 262, _masm)->
xorl(rax, rax);
263 } else {
264 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 264, _masm)->
movl(rax, value);
265 }
266}
267
268void TemplateTable::lconst(int value) {
269 transition(vtos, ltos);
270 if (value == 0) {
271 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 271, _masm)->
xorl(rax, rax);
272 } else {
273 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 273, _masm)->
movl(rax, value);
274 }
275#ifndef _LP641
276 assert(value >= 0, "check this code")do { if (!(value >= 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 276, "assert(" "value >= 0" ") failed", "check this code"
); ::breakpoint(); } } while (0)
;
277 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 277, _masm)->
xorptr(rdx, rdx);
278#endif
279}
280
281
282
283void TemplateTable::fconst(int value) {
284 transition(vtos, ftos);
285 if (UseSSE >= 1) {
286 static float one = 1.0f, two = 2.0f;
287 switch (value) {
288 case 0:
289 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 289, _masm)->
xorps(xmm0, xmm0);
290 break;
291 case 1:
292 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 292, _masm)->
movflt(xmm0, ExternalAddress((address) &one));
293 break;
294 case 2:
295 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 295, _masm)->
movflt(xmm0, ExternalAddress((address) &two));
296 break;
297 default:
298 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 298); ::breakpoint(); } while (0)
;
299 break;
300 }
301 } else {
302#ifdef _LP641
303 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 303); ::breakpoint(); } while (0)
;
304#else
305 if (value == 0) { __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 305, _masm)->
fldz();
306 } else if (value == 1) { __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 306, _masm)->
fld1();
307 } else if (value == 2) { __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 307, _masm)->
fld1(); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 307, _masm)->
fld1(); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 307, _masm)->
faddp(); // should do a better solution here
308 } else { ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 308); ::breakpoint(); } while (0)
;
309 }
310#endif // _LP64
311 }
312}
313
314void TemplateTable::dconst(int value) {
315 transition(vtos, dtos);
316 if (UseSSE >= 2) {
317 static double one = 1.0;
318 switch (value) {
319 case 0:
320 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 320, _masm)->
xorpd(xmm0, xmm0);
321 break;
322 case 1:
323 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 323, _masm)->
movdbl(xmm0, ExternalAddress((address) &one));
324 break;
325 default:
326 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 326); ::breakpoint(); } while (0)
;
327 break;
328 }
329 } else {
330#ifdef _LP641
331 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 331); ::breakpoint(); } while (0)
;
332#else
333 if (value == 0) { __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 333, _masm)->
fldz();
334 } else if (value == 1) { __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 334, _masm)->
fld1();
335 } else { ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 335); ::breakpoint(); } while (0)
;
336 }
337#endif
338 }
339}
340
341void TemplateTable::bipush() {
342 transition(vtos, itos);
343 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 343, _masm)->
load_signed_byte(rax, at_bcp(1));
344}
345
346void TemplateTable::sipush() {
347 transition(vtos, itos);
348 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 348, _masm)->
load_unsigned_short(rax, at_bcp(1));
349 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 349, _masm)->
bswapl(rax);
350 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 350, _masm)->
sarl(rax, 16);
351}
352
353void TemplateTable::ldc(bool wide) {
354 transition(vtos, vtos);
355 Register rarg = NOT_LP64(rcx) LP64_ONLY(c_rarg1)c_rarg1;
356 Label call_ldc, notFloat, notClass, notInt, Done;
357
358 if (wide) {
359 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 359, _masm)->
get_unsigned_2_byte_index_at_bcp(rbx, 1);
360 } else {
361 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 361, _masm)->
load_unsigned_byte(rbx, at_bcp(1));
362 }
363
364 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 364, _masm)->
get_cpool_and_tags(rcx, rax);
365 const int base_offset = ConstantPool::header_size() * wordSize;
366 const int tags_offset = Array<u1>::base_offset_in_bytes();
367
368 // get type
369 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 369, _masm)->
movzbl(rdx, Address(rax, rbx, Address::times_1, tags_offset));
370
371 // unresolved class - get the resolved class
372 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 372, _masm)->
cmpl(rdx, JVM_CONSTANT_UnresolvedClass);
373 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 373, _masm)->
jccb(Assembler::equal, call_ldc)jccb_0(Assembler::equal, call_ldc, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 373)
;
374
375 // unresolved class in error state - call into runtime to throw the error
376 // from the first resolution attempt
377 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 377, _masm)->
cmpl(rdx, JVM_CONSTANT_UnresolvedClassInError);
378 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 378, _masm)->
jccb(Assembler::equal, call_ldc)jccb_0(Assembler::equal, call_ldc, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 378)
;
379
380 // resolved class - need to call vm to get java mirror of the class
381 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 381, _masm)->
cmpl(rdx, JVM_CONSTANT_Class);
382 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 382, _masm)->
jcc(Assembler::notEqual, notClass);
383
384 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 384, _masm)->
bind(call_ldc);
385
386 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 386, _masm)->
movl(rarg, wide);
387 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::ldc)((address)((address_word)(InterpreterRuntime::ldc))), rarg);
388
389 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 389, _masm)->
push(atos);
390 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 390, _masm)->
jmp(Done);
391
392 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 392, _masm)->
bind(notClass);
393 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 393, _masm)->
cmpl(rdx, JVM_CONSTANT_Float);
394 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 394, _masm)->
jccb(Assembler::notEqual, notFloat)jccb_0(Assembler::notEqual, notFloat, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 394)
;
395
396 // ftos
397 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 397, _masm)->
load_float(Address(rcx, rbx, Address::times_ptr, base_offset));
398 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 398, _masm)->
push(ftos);
399 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 399, _masm)->
jmp(Done);
400
401 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 401, _masm)->
bind(notFloat);
402 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 402, _masm)->
cmpl(rdx, JVM_CONSTANT_Integer);
403 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 403, _masm)->
jccb(Assembler::notEqual, notInt)jccb_0(Assembler::notEqual, notInt, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 403)
;
404
405 // itos
406 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 406, _masm)->
movl(rax, Address(rcx, rbx, Address::times_ptr, base_offset));
407 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 407, _masm)->
push(itos);
408 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 408, _masm)->
jmp(Done);
409
410 // assume the tag is for condy; if not, the VM runtime will tell us
411 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 411, _masm)->
bind(notInt);
412 condy_helper(Done);
413
414 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 414, _masm)->
bind(Done);
415}
416
417// Fast path for caching oop constants.
418void TemplateTable::fast_aldc(bool wide) {
419 transition(vtos, atos);
420
421 Register result = rax;
422 Register tmp = rdx;
423 Register rarg = NOT_LP64(rcx) LP64_ONLY(c_rarg1)c_rarg1;
424 int index_size = wide ? sizeof(u2) : sizeof(u1);
425
426 Label resolved;
427
428 // We are resolved if the resolved reference cache entry contains a
429 // non-null object (String, MethodType, etc.)
430 assert_different_registers(result, tmp);
431 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 431, _masm)->
get_cache_index_at_bcp(tmp, 1, index_size);
432 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 432, _masm)->
load_resolved_reference_at_index(result, tmp);
433 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 433, _masm)->
testptr(result, result);
434 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 434, _masm)->
jcc(Assembler::notZero, resolved);
435
436 address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_ldc)((address)((address_word)(InterpreterRuntime::resolve_ldc)));
437
438 // first time invocation - must resolve first
439 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 439, _masm)->
movl(rarg, (int)bytecode());
440 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 440, _masm)->
call_VM(result, entry, rarg);
441 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 441, _masm)->
bind(resolved);
442
443 { // Check for the null sentinel.
444 // If we just called the VM, it already did the mapping for us,
445 // but it's harmless to retry.
446 Label notNull;
447 ExternalAddress null_sentinel((address)Universe::the_null_sentinel_addr());
448 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 448, _masm)->
movptr(tmp, null_sentinel);
449 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 449, _masm)->
resolve_oop_handle(tmp);
450 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 450, _masm)->
cmpoop(tmp, result);
451 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 451, _masm)->
jccb(Assembler::notEqual, notNull)jccb_0(Assembler::notEqual, notNull, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 451)
;
452 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 452, _masm)->
xorptr(result, result); // NULL object reference
453 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 453, _masm)->
bind(notNull);
454 }
455
456 if (VerifyOops) {
457 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 457, _masm)->
verify_oop(result)_verify_oop_checked(result, "broken oop " "result", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 457)
;
458 }
459}
460
461void TemplateTable::ldc2_w() {
462 transition(vtos, vtos);
463 Label notDouble, notLong, Done;
464 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 464, _masm)->
get_unsigned_2_byte_index_at_bcp(rbx, 1);
465
466 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 466, _masm)->
get_cpool_and_tags(rcx, rax);
467 const int base_offset = ConstantPool::header_size() * wordSize;
468 const int tags_offset = Array<u1>::base_offset_in_bytes();
469
470 // get type
471 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 471, _masm)->
movzbl(rdx, Address(rax, rbx, Address::times_1, tags_offset));
472 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 472, _masm)->
cmpl(rdx, JVM_CONSTANT_Double);
473 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 473, _masm)->
jccb(Assembler::notEqual, notDouble)jccb_0(Assembler::notEqual, notDouble, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 473)
;
474
475 // dtos
476 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 476, _masm)->
load_double(Address(rcx, rbx, Address::times_ptr, base_offset));
477 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 477, _masm)->
push(dtos);
478
479 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 479, _masm)->
jmp(Done);
480 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 480, _masm)->
bind(notDouble);
481 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 481, _masm)->
cmpl(rdx, JVM_CONSTANT_Long);
482 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 482, _masm)->
jccb(Assembler::notEqual, notLong)jccb_0(Assembler::notEqual, notLong, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 482)
;
483
484 // ltos
485 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 485, _masm)->
movptr(rax, Address(rcx, rbx, Address::times_ptr, base_offset + 0 * wordSize));
486 NOT_LP64(__ movptr(rdx, Address(rcx, rbx, Address::times_ptr, base_offset + 1 * wordSize)));
487 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 487, _masm)->
push(ltos);
488 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 488, _masm)->
jmp(Done);
489
490 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 490, _masm)->
bind(notLong);
491 condy_helper(Done);
492
493 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 493, _masm)->
bind(Done);
494}
495
496void TemplateTable::condy_helper(Label& Done) {
497 const Register obj = rax;
498 const Register off = rbx;
499 const Register flags = rcx;
500 const Register rarg = NOT_LP64(rcx) LP64_ONLY(c_rarg1)c_rarg1;
501 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 501, _masm)->
movl(rarg, (int)bytecode());
502 call_VM(obj, CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_ldc)((address)((address_word)(InterpreterRuntime::resolve_ldc))), rarg);
503#ifndef _LP641
504 // borrow rdi from locals
505 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 505, _masm)->
get_thread(rdi);
506 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 506, _masm)->
get_vm_result_2(flags, rdi);
507 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 507, _masm)->
restore_locals();
508#else
509 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 509, _masm)->
get_vm_result_2(flags, r15_thread);
510#endif
511 // VMr = obj = base address to find primitive value to push
512 // VMr2 = flags = (tos, off) using format of CPCE::_flags
513 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 513, _masm)->
movl(off, flags);
514 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 514, _masm)->
andl(off, ConstantPoolCacheEntry::field_index_mask);
515 const Address field(obj, off, Address::times_1, 0*wordSize);
516
517 // What sort of thing are we loading?
518 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 518, _masm)->
shrl(flags, ConstantPoolCacheEntry::tos_state_shift);
519 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 519, _masm)->
andl(flags, ConstantPoolCacheEntry::tos_state_mask);
520
521 switch (bytecode()) {
522 case Bytecodes::_ldc:
523 case Bytecodes::_ldc_w:
524 {
525 // tos in (itos, ftos, stos, btos, ctos, ztos)
526 Label notInt, notFloat, notShort, notByte, notChar, notBool;
527 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 527, _masm)->
cmpl(flags, itos);
528 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 528, _masm)->
jcc(Assembler::notEqual, notInt);
529 // itos
530 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 530, _masm)->
movl(rax, field);
531 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 531, _masm)->
push(itos);
532 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 532, _masm)->
jmp(Done);
533
534 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 534, _masm)->
bind(notInt);
535 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 535, _masm)->
cmpl(flags, ftos);
536 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 536, _masm)->
jcc(Assembler::notEqual, notFloat);
537 // ftos
538 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 538, _masm)->
load_float(field);
539 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 539, _masm)->
push(ftos);
540 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 540, _masm)->
jmp(Done);
541
542 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 542, _masm)->
bind(notFloat);
543 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 543, _masm)->
cmpl(flags, stos);
544 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 544, _masm)->
jcc(Assembler::notEqual, notShort);
545 // stos
546 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 546, _masm)->
load_signed_short(rax, field);
547 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 547, _masm)->
push(stos);
548 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 548, _masm)->
jmp(Done);
549
550 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 550, _masm)->
bind(notShort);
551 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 551, _masm)->
cmpl(flags, btos);
552 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 552, _masm)->
jcc(Assembler::notEqual, notByte);
553 // btos
554 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 554, _masm)->
load_signed_byte(rax, field);
555 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 555, _masm)->
push(btos);
556 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 556, _masm)->
jmp(Done);
557
558 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 558, _masm)->
bind(notByte);
559 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 559, _masm)->
cmpl(flags, ctos);
560 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 560, _masm)->
jcc(Assembler::notEqual, notChar);
561 // ctos
562 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 562, _masm)->
load_unsigned_short(rax, field);
563 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 563, _masm)->
push(ctos);
564 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 564, _masm)->
jmp(Done);
565
566 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 566, _masm)->
bind(notChar);
567 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 567, _masm)->
cmpl(flags, ztos);
568 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 568, _masm)->
jcc(Assembler::notEqual, notBool);
569 // ztos
570 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 570, _masm)->
load_signed_byte(rax, field);
571 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 571, _masm)->
push(ztos);
572 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 572, _masm)->
jmp(Done);
573
574 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 574, _masm)->
bind(notBool);
575 break;
576 }
577
578 case Bytecodes::_ldc2_w:
579 {
580 Label notLong, notDouble;
581 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 581, _masm)->
cmpl(flags, ltos);
582 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 582, _masm)->
jcc(Assembler::notEqual, notLong);
583 // ltos
584 // Loading high word first because movptr clobbers rax
585 NOT_LP64(__ movptr(rdx, field.plus_disp(4)));
586 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 586, _masm)->
movptr(rax, field);
587 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 587, _masm)->
push(ltos);
588 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 588, _masm)->
jmp(Done);
589
590 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 590, _masm)->
bind(notLong);
591 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 591, _masm)->
cmpl(flags, dtos);
592 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 592, _masm)->
jcc(Assembler::notEqual, notDouble);
593 // dtos
594 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 594, _masm)->
load_double(field);
595 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 595, _masm)->
push(dtos);
596 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 596, _masm)->
jmp(Done);
597
598 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 598, _masm)->
bind(notDouble);
599 break;
600 }
601
602 default:
603 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 603); ::breakpoint(); } while (0)
;
604 }
605
606 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 606, _masm)->
stop("bad ldc/condy");
607}
608
609void TemplateTable::locals_index(Register reg, int offset) {
610 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 610, _masm)->
load_unsigned_byte(reg, at_bcp(offset));
611 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 611, _masm)->
negptr(reg);
612}
613
614void TemplateTable::iload() {
615 iload_internal();
616}
617
618void TemplateTable::nofast_iload() {
619 iload_internal(may_not_rewrite);
620}
621
622void TemplateTable::iload_internal(RewriteControl rc) {
623 transition(vtos, itos);
624 if (RewriteFrequentPairs && rc == may_rewrite) {
625 Label rewrite, done;
626 const Register bc = LP64_ONLY(c_rarg3)c_rarg3 NOT_LP64(rcx);
627 LP64_ONLY(assert(rbx != bc, "register damaged"))do { if (!(rbx != bc)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 627, "assert(" "rbx != bc" ") failed", "register damaged");
::breakpoint(); } } while (0)
;
628
629 // get next byte
630 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 630, _masm)->
load_unsigned_byte(rbx,
631 at_bcp(Bytecodes::length_for(Bytecodes::_iload)));
632 // if _iload, wait to rewrite to iload2. We only want to rewrite the
633 // last two iloads in a pair. Comparing against fast_iload means that
634 // the next bytecode is neither an iload or a caload, and therefore
635 // an iload pair.
636 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 636, _masm)->
cmpl(rbx, Bytecodes::_iload);
637 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 637, _masm)->
jcc(Assembler::equal, done);
638
639 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 639, _masm)->
cmpl(rbx, Bytecodes::_fast_iload);
640 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 640, _masm)->
movl(bc, Bytecodes::_fast_iload2);
641
642 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 642, _masm)->
jccb(Assembler::equal, rewrite)jccb_0(Assembler::equal, rewrite, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 642)
;
643
644 // if _caload, rewrite to fast_icaload
645 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 645, _masm)->
cmpl(rbx, Bytecodes::_caload);
646 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 646, _masm)->
movl(bc, Bytecodes::_fast_icaload);
647 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 647, _masm)->
jccb(Assembler::equal, rewrite)jccb_0(Assembler::equal, rewrite, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 647)
;
648
649 // rewrite so iload doesn't check again.
650 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 650, _masm)->
movl(bc, Bytecodes::_fast_iload);
651
652 // rewrite
653 // bc: fast bytecode
654 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 654, _masm)->
bind(rewrite);
655 patch_bytecode(Bytecodes::_iload, bc, rbx, false);
656 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 656, _masm)->
bind(done);
657 }
658
659 // Get the local value into tos
660 locals_index(rbx);
661 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 661, _masm)->
movl(rax, iaddress(rbx));
662}
663
664void TemplateTable::fast_iload2() {
665 transition(vtos, itos);
666 locals_index(rbx);
667 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 667, _masm)->
movl(rax, iaddress(rbx));
668 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 668, _masm)->
push(itos);
669 locals_index(rbx, 3);
670 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 670, _masm)->
movl(rax, iaddress(rbx));
671}
672
673void TemplateTable::fast_iload() {
674 transition(vtos, itos);
675 locals_index(rbx);
676 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 676, _masm)->
movl(rax, iaddress(rbx));
677}
678
679void TemplateTable::lload() {
680 transition(vtos, ltos);
681 locals_index(rbx);
682 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 682, _masm)->
movptr(rax, laddress(rbx));
683 NOT_LP64(__ movl(rdx, haddress(rbx)));
684}
685
686void TemplateTable::fload() {
687 transition(vtos, ftos);
688 locals_index(rbx);
689 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 689, _masm)->
load_float(faddress(rbx));
690}
691
692void TemplateTable::dload() {
693 transition(vtos, dtos);
694 locals_index(rbx);
695 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 695, _masm)->
load_double(daddress(rbx));
696}
697
698void TemplateTable::aload() {
699 transition(vtos, atos);
700 locals_index(rbx);
701 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 701, _masm)->
movptr(rax, aaddress(rbx));
702}
703
704void TemplateTable::locals_index_wide(Register reg) {
705 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 705, _masm)->
load_unsigned_short(reg, at_bcp(2));
706 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 706, _masm)->
bswapl(reg);
707 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 707, _masm)->
shrl(reg, 16);
708 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 708, _masm)->
negptr(reg);
709}
710
711void TemplateTable::wide_iload() {
712 transition(vtos, itos);
713 locals_index_wide(rbx);
714 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 714, _masm)->
movl(rax, iaddress(rbx));
715}
716
717void TemplateTable::wide_lload() {
718 transition(vtos, ltos);
719 locals_index_wide(rbx);
720 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 720, _masm)->
movptr(rax, laddress(rbx));
721 NOT_LP64(__ movl(rdx, haddress(rbx)));
722}
723
724void TemplateTable::wide_fload() {
725 transition(vtos, ftos);
726 locals_index_wide(rbx);
727 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 727, _masm)->
load_float(faddress(rbx));
728}
729
730void TemplateTable::wide_dload() {
731 transition(vtos, dtos);
732 locals_index_wide(rbx);
733 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 733, _masm)->
load_double(daddress(rbx));
734}
735
736void TemplateTable::wide_aload() {
737 transition(vtos, atos);
738 locals_index_wide(rbx);
739 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 739, _masm)->
movptr(rax, aaddress(rbx));
740}
741
742void TemplateTable::index_check(Register array, Register index) {
743 // Pop ptr into array
744 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 744, _masm)->
pop_ptr(array);
745 index_check_without_pop(array, index);
746}
747
748void TemplateTable::index_check_without_pop(Register array, Register index) {
749 // destroys rbx
750 // check array
751 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 751, _masm)->
null_check(array, arrayOopDesc::length_offset_in_bytes());
752 // sign extend index for use by indexed load
753 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 753, _masm)->
movl2ptr(index, index);
754 // check index
755 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 755, _masm)->
cmpl(index, Address(array, arrayOopDesc::length_offset_in_bytes()));
756 if (index != rbx) {
757 // ??? convention: move aberrant index into rbx for exception message
758 assert(rbx != array, "different registers")do { if (!(rbx != array)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 758, "assert(" "rbx != array" ") failed", "different registers"
); ::breakpoint(); } } while (0)
;
759 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 759, _masm)->
movl(rbx, index);
760 }
761 Label skip;
762 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 762, _masm)->
jccb(Assembler::below, skip)jccb_0(Assembler::below, skip, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 762)
;
763 // Pass array to create more detailed exceptions.
764 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 764, _masm)->
mov(NOT_LP64(rax) LP64_ONLY(c_rarg1)c_rarg1, array);
765 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 765, _masm)->
jump(ExternalAddress(Interpreter::_throw_ArrayIndexOutOfBoundsException_entry));
766 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 766, _masm)->
bind(skip);
767}
768
769void TemplateTable::iaload() {
770 transition(itos, itos);
771 // rax: index
772 // rdx: array
773 index_check(rdx, rax); // kills rbx
774 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 774, _masm)->
access_load_at(T_INT, IN_HEAP | IS_ARRAY, rax,
775 Address(rdx, rax, Address::times_4,
776 arrayOopDesc::base_offset_in_bytes(T_INT)),
777 noreg, noreg);
778}
779
780void TemplateTable::laload() {
781 transition(itos, ltos);
782 // rax: index
783 // rdx: array
784 index_check(rdx, rax); // kills rbx
785 NOT_LP64(__ mov(rbx, rax));
786 // rbx,: index
787 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 787, _masm)->
access_load_at(T_LONG, IN_HEAP | IS_ARRAY, noreg /* ltos */,
788 Address(rdx, rbx, Address::times_8,
789 arrayOopDesc::base_offset_in_bytes(T_LONG)),
790 noreg, noreg);
791}
792
793
794
795void TemplateTable::faload() {
796 transition(itos, ftos);
797 // rax: index
798 // rdx: array
799 index_check(rdx, rax); // kills rbx
800 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 800, _masm)->
access_load_at(T_FLOAT, IN_HEAP | IS_ARRAY, noreg /* ftos */,
801 Address(rdx, rax,
802 Address::times_4,
803 arrayOopDesc::base_offset_in_bytes(T_FLOAT)),
804 noreg, noreg);
805}
806
807void TemplateTable::daload() {
808 transition(itos, dtos);
809 // rax: index
810 // rdx: array
811 index_check(rdx, rax); // kills rbx
812 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 812, _masm)->
access_load_at(T_DOUBLE, IN_HEAP | IS_ARRAY, noreg /* dtos */,
813 Address(rdx, rax,
814 Address::times_8,
815 arrayOopDesc::base_offset_in_bytes(T_DOUBLE)),
816 noreg, noreg);
817}
818
819void TemplateTable::aaload() {
820 transition(itos, atos);
821 // rax: index
822 // rdx: array
823 index_check(rdx, rax); // kills rbx
824 do_oop_load(_masm,
825 Address(rdx, rax,
826 UseCompressedOops ? Address::times_4 : Address::times_ptr,
827 arrayOopDesc::base_offset_in_bytes(T_OBJECT)),
828 rax,
829 IS_ARRAY);
830}
831
832void TemplateTable::baload() {
833 transition(itos, itos);
834 // rax: index
835 // rdx: array
836 index_check(rdx, rax); // kills rbx
837 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 837, _masm)->
access_load_at(T_BYTE, IN_HEAP | IS_ARRAY, rax,
838 Address(rdx, rax, Address::times_1, arrayOopDesc::base_offset_in_bytes(T_BYTE)),
839 noreg, noreg);
840}
841
842void TemplateTable::caload() {
843 transition(itos, itos);
844 // rax: index
845 // rdx: array
846 index_check(rdx, rax); // kills rbx
847 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 847, _masm)->
access_load_at(T_CHAR, IN_HEAP | IS_ARRAY, rax,
848 Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)),
849 noreg, noreg);
850}
851
852// iload followed by caload frequent pair
853void TemplateTable::fast_icaload() {
854 transition(vtos, itos);
855 // load index out of locals
856 locals_index(rbx);
857 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 857, _masm)->
movl(rax, iaddress(rbx));
858
859 // rax: index
860 // rdx: array
861 index_check(rdx, rax); // kills rbx
862 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 862, _masm)->
access_load_at(T_CHAR, IN_HEAP | IS_ARRAY, rax,
863 Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)),
864 noreg, noreg);
865}
866
867
868void TemplateTable::saload() {
869 transition(itos, itos);
870 // rax: index
871 // rdx: array
872 index_check(rdx, rax); // kills rbx
873 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 873, _masm)->
access_load_at(T_SHORT, IN_HEAP | IS_ARRAY, rax,
874 Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_SHORT)),
875 noreg, noreg);
876}
877
878void TemplateTable::iload(int n) {
879 transition(vtos, itos);
880 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 880, _masm)->
movl(rax, iaddress(n));
881}
882
883void TemplateTable::lload(int n) {
884 transition(vtos, ltos);
885 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 885, _masm)->
movptr(rax, laddress(n));
886 NOT_LP64(__ movptr(rdx, haddress(n)));
887}
888
889void TemplateTable::fload(int n) {
890 transition(vtos, ftos);
891 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 891, _masm)->
load_float(faddress(n));
892}
893
894void TemplateTable::dload(int n) {
895 transition(vtos, dtos);
896 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 896, _masm)->
load_double(daddress(n));
897}
898
899void TemplateTable::aload(int n) {
900 transition(vtos, atos);
901 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 901, _masm)->
movptr(rax, aaddress(n));
902}
903
904void TemplateTable::aload_0() {
905 aload_0_internal();
906}
907
908void TemplateTable::nofast_aload_0() {
909 aload_0_internal(may_not_rewrite);
910}
911
912void TemplateTable::aload_0_internal(RewriteControl rc) {
913 transition(vtos, atos);
914 // According to bytecode histograms, the pairs:
915 //
916 // _aload_0, _fast_igetfield
917 // _aload_0, _fast_agetfield
918 // _aload_0, _fast_fgetfield
919 //
920 // occur frequently. If RewriteFrequentPairs is set, the (slow)
921 // _aload_0 bytecode checks if the next bytecode is either
922 // _fast_igetfield, _fast_agetfield or _fast_fgetfield and then
923 // rewrites the current bytecode into a pair bytecode; otherwise it
924 // rewrites the current bytecode into _fast_aload_0 that doesn't do
925 // the pair check anymore.
926 //
927 // Note: If the next bytecode is _getfield, the rewrite must be
928 // delayed, otherwise we may miss an opportunity for a pair.
929 //
930 // Also rewrite frequent pairs
931 // aload_0, aload_1
932 // aload_0, iload_1
933 // These bytecodes with a small amount of code are most profitable
934 // to rewrite
935 if (RewriteFrequentPairs && rc == may_rewrite) {
936 Label rewrite, done;
937
938 const Register bc = LP64_ONLY(c_rarg3)c_rarg3 NOT_LP64(rcx);
939 LP64_ONLY(assert(rbx != bc, "register damaged"))do { if (!(rbx != bc)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 939, "assert(" "rbx != bc" ") failed", "register damaged");
::breakpoint(); } } while (0)
;
940
941 // get next byte
942 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 942, _masm)->
load_unsigned_byte(rbx, at_bcp(Bytecodes::length_for(Bytecodes::_aload_0)));
943
944 // if _getfield then wait with rewrite
945 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 945, _masm)->
cmpl(rbx, Bytecodes::_getfield);
946 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 946, _masm)->
jcc(Assembler::equal, done);
947
948 // if _igetfield then rewrite to _fast_iaccess_0
949 assert(Bytecodes::java_code(Bytecodes::_fast_iaccess_0) == Bytecodes::_aload_0, "fix bytecode definition")do { if (!(Bytecodes::java_code(Bytecodes::_fast_iaccess_0) ==
Bytecodes::_aload_0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 949, "assert(" "Bytecodes::java_code(Bytecodes::_fast_iaccess_0) == Bytecodes::_aload_0"
") failed", "fix bytecode definition"); ::breakpoint(); } } while
(0)
;
950 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 950, _masm)->
cmpl(rbx, Bytecodes::_fast_igetfield);
951 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 951, _masm)->
movl(bc, Bytecodes::_fast_iaccess_0);
952 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 952, _masm)->
jccb(Assembler::equal, rewrite)jccb_0(Assembler::equal, rewrite, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 952)
;
953
954 // if _agetfield then rewrite to _fast_aaccess_0
955 assert(Bytecodes::java_code(Bytecodes::_fast_aaccess_0) == Bytecodes::_aload_0, "fix bytecode definition")do { if (!(Bytecodes::java_code(Bytecodes::_fast_aaccess_0) ==
Bytecodes::_aload_0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 955, "assert(" "Bytecodes::java_code(Bytecodes::_fast_aaccess_0) == Bytecodes::_aload_0"
") failed", "fix bytecode definition"); ::breakpoint(); } } while
(0)
;
956 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 956, _masm)->
cmpl(rbx, Bytecodes::_fast_agetfield);
957 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 957, _masm)->
movl(bc, Bytecodes::_fast_aaccess_0);
958 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 958, _masm)->
jccb(Assembler::equal, rewrite)jccb_0(Assembler::equal, rewrite, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 958)
;
959
960 // if _fgetfield then rewrite to _fast_faccess_0
961 assert(Bytecodes::java_code(Bytecodes::_fast_faccess_0) == Bytecodes::_aload_0, "fix bytecode definition")do { if (!(Bytecodes::java_code(Bytecodes::_fast_faccess_0) ==
Bytecodes::_aload_0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 961, "assert(" "Bytecodes::java_code(Bytecodes::_fast_faccess_0) == Bytecodes::_aload_0"
") failed", "fix bytecode definition"); ::breakpoint(); } } while
(0)
;
962 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 962, _masm)->
cmpl(rbx, Bytecodes::_fast_fgetfield);
963 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 963, _masm)->
movl(bc, Bytecodes::_fast_faccess_0);
964 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 964, _masm)->
jccb(Assembler::equal, rewrite)jccb_0(Assembler::equal, rewrite, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 964)
;
965
966 // else rewrite to _fast_aload0
967 assert(Bytecodes::java_code(Bytecodes::_fast_aload_0) == Bytecodes::_aload_0, "fix bytecode definition")do { if (!(Bytecodes::java_code(Bytecodes::_fast_aload_0) == Bytecodes
::_aload_0)) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 967, "assert(" "Bytecodes::java_code(Bytecodes::_fast_aload_0) == Bytecodes::_aload_0"
") failed", "fix bytecode definition"); ::breakpoint(); } } while
(0)
;
968 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 968, _masm)->
movl(bc, Bytecodes::_fast_aload_0);
969
970 // rewrite
971 // bc: fast bytecode
972 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 972, _masm)->
bind(rewrite);
973 patch_bytecode(Bytecodes::_aload_0, bc, rbx, false);
974
975 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 975, _masm)->
bind(done);
976 }
977
978 // Do actual aload_0 (must do this after patch_bytecode which might call VM and GC might change oop).
979 aload(0);
980}
981
982void TemplateTable::istore() {
983 transition(itos, vtos);
984 locals_index(rbx);
985 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 985, _masm)->
movl(iaddress(rbx), rax);
986}
987
988
989void TemplateTable::lstore() {
990 transition(ltos, vtos);
991 locals_index(rbx);
992 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 992, _masm)->
movptr(laddress(rbx), rax);
993 NOT_LP64(__ movptr(haddress(rbx), rdx));
994}
995
996void TemplateTable::fstore() {
997 transition(ftos, vtos);
998 locals_index(rbx);
999 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 999, _masm)->
store_float(faddress(rbx));
1000}
1001
1002void TemplateTable::dstore() {
1003 transition(dtos, vtos);
1004 locals_index(rbx);
1005 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1005, _masm)->
store_double(daddress(rbx));
1006}
1007
1008void TemplateTable::astore() {
1009 transition(vtos, vtos);
1010 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1010, _masm)->
pop_ptr(rax);
1011 locals_index(rbx);
1012 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1012, _masm)->
movptr(aaddress(rbx), rax);
1013}
1014
1015void TemplateTable::wide_istore() {
1016 transition(vtos, vtos);
1017 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1017, _masm)->
pop_i();
1018 locals_index_wide(rbx);
1019 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1019, _masm)->
movl(iaddress(rbx), rax);
1020}
1021
1022void TemplateTable::wide_lstore() {
1023 transition(vtos, vtos);
1024 NOT_LP64(__ pop_l(rax, rdx));
1025 LP64_ONLY(__ pop_l())Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1025, _masm)-> pop_l()
;
1026 locals_index_wide(rbx);
1027 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1027, _masm)->
movptr(laddress(rbx), rax);
1028 NOT_LP64(__ movl(haddress(rbx), rdx));
1029}
1030
1031void TemplateTable::wide_fstore() {
1032#ifdef _LP641
1033 transition(vtos, vtos);
1034 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1034, _masm)->
pop_f(xmm0);
1035 locals_index_wide(rbx);
1036 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1036, _masm)->
movflt(faddress(rbx), xmm0);
1037#else
1038 wide_istore();
1039#endif
1040}
1041
1042void TemplateTable::wide_dstore() {
1043#ifdef _LP641
1044 transition(vtos, vtos);
1045 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1045, _masm)->
pop_d(xmm0);
1046 locals_index_wide(rbx);
1047 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1047, _masm)->
movdbl(daddress(rbx), xmm0);
1048#else
1049 wide_lstore();
1050#endif
1051}
1052
1053void TemplateTable::wide_astore() {
1054 transition(vtos, vtos);
1055 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1055, _masm)->
pop_ptr(rax);
1056 locals_index_wide(rbx);
1057 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1057, _masm)->
movptr(aaddress(rbx), rax);
1058}
1059
1060void TemplateTable::iastore() {
1061 transition(itos, vtos);
1062 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1062, _masm)->
pop_i(rbx);
1063 // rax: value
1064 // rbx: index
1065 // rdx: array
1066 index_check(rdx, rbx); // prefer index in rbx
1067 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1067, _masm)->
access_store_at(T_INT, IN_HEAP | IS_ARRAY,
1068 Address(rdx, rbx, Address::times_4,
1069 arrayOopDesc::base_offset_in_bytes(T_INT)),
1070 rax, noreg, noreg);
1071}
1072
1073void TemplateTable::lastore() {
1074 transition(ltos, vtos);
1075 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1075, _masm)->
pop_i(rbx);
1076 // rax,: low(value)
1077 // rcx: array
1078 // rdx: high(value)
1079 index_check(rcx, rbx); // prefer index in rbx,
1080 // rbx,: index
1081 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1081, _masm)->
access_store_at(T_LONG, IN_HEAP | IS_ARRAY,
1082 Address(rcx, rbx, Address::times_8,
1083 arrayOopDesc::base_offset_in_bytes(T_LONG)),
1084 noreg /* ltos */, noreg, noreg);
1085}
1086
1087
1088void TemplateTable::fastore() {
1089 transition(ftos, vtos);
1090 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1090, _masm)->
pop_i(rbx);
1091 // value is in UseSSE >= 1 ? xmm0 : ST(0)
1092 // rbx: index
1093 // rdx: array
1094 index_check(rdx, rbx); // prefer index in rbx
1095 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1095, _masm)->
access_store_at(T_FLOAT, IN_HEAP | IS_ARRAY,
1096 Address(rdx, rbx, Address::times_4,
1097 arrayOopDesc::base_offset_in_bytes(T_FLOAT)),
1098 noreg /* ftos */, noreg, noreg);
1099}
1100
1101void TemplateTable::dastore() {
1102 transition(dtos, vtos);
1103 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1103, _masm)->
pop_i(rbx);
1104 // value is in UseSSE >= 2 ? xmm0 : ST(0)
1105 // rbx: index
1106 // rdx: array
1107 index_check(rdx, rbx); // prefer index in rbx
1108 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1108, _masm)->
access_store_at(T_DOUBLE, IN_HEAP | IS_ARRAY,
1109 Address(rdx, rbx, Address::times_8,
1110 arrayOopDesc::base_offset_in_bytes(T_DOUBLE)),
1111 noreg /* dtos */, noreg, noreg);
1112}
1113
1114void TemplateTable::aastore() {
1115 Label is_null, ok_is_subtype, done;
1116 transition(vtos, vtos);
1117 // stack: ..., array, index, value
1118 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1118, _masm)->
movptr(rax, at_tos()); // value
1119 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1119, _masm)->
movl(rcx, at_tos_p1()); // index
1120 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1120, _masm)->
movptr(rdx, at_tos_p2()); // array
1121
1122 Address element_address(rdx, rcx,
1123 UseCompressedOops? Address::times_4 : Address::times_ptr,
1124 arrayOopDesc::base_offset_in_bytes(T_OBJECT));
1125
1126 index_check_without_pop(rdx, rcx); // kills rbx
1127 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1127, _masm)->
testptr(rax, rax);
1128 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1128, _masm)->
jcc(Assembler::zero, is_null);
1129
1130 Register tmp_load_klass = LP64_ONLY(rscratch1)rscratch1 NOT_LP64(noreg);
1131 // Move subklass into rbx
1132 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1132, _masm)->
load_klass(rbx, rax, tmp_load_klass);
1133 // Move superklass into rax
1134 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1134, _masm)->
load_klass(rax, rdx, tmp_load_klass);
1135 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1135, _masm)->
movptr(rax, Address(rax,
1136 ObjArrayKlass::element_klass_offset()));
1137
1138 // Generate subtype check. Blows rcx, rdi
1139 // Superklass in rax. Subklass in rbx.
1140 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1140, _masm)->
gen_subtype_check(rbx, ok_is_subtype);
1141
1142 // Come here on failure
1143 // object is at TOS
1144 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1144, _masm)->
jump(ExternalAddress(Interpreter::_throw_ArrayStoreException_entry));
1145
1146 // Come here on success
1147 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1147, _masm)->
bind(ok_is_subtype);
1148
1149 // Get the value we will store
1150 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1150, _masm)->
movptr(rax, at_tos());
1151 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1151, _masm)->
movl(rcx, at_tos_p1()); // index
1152 // Now store using the appropriate barrier
1153 do_oop_store(_masm, element_address, rax, IS_ARRAY);
1154 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1154, _masm)->
jmp(done);
1155
1156 // Have a NULL in rax, rdx=array, ecx=index. Store NULL at ary[idx]
1157 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1157, _masm)->
bind(is_null);
1158 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1158, _masm)->
profile_null_seen(rbx);
1159
1160 // Store a NULL
1161 do_oop_store(_masm, element_address, noreg, IS_ARRAY);
1162
1163 // Pop stack arguments
1164 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1164, _masm)->
bind(done);
1165 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1165, _masm)->
addptr(rsp, 3 * Interpreter::stackElementSize);
1166}
1167
1168void TemplateTable::bastore() {
1169 transition(itos, vtos);
1170 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1170, _masm)->
pop_i(rbx);
1171 // rax: value
1172 // rbx: index
1173 // rdx: array
1174 index_check(rdx, rbx); // prefer index in rbx
1175 // Need to check whether array is boolean or byte
1176 // since both types share the bastore bytecode.
1177 Register tmp_load_klass = LP64_ONLY(rscratch1)rscratch1 NOT_LP64(noreg);
1178 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1178, _masm)->
load_klass(rcx, rdx, tmp_load_klass);
1179 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1179, _masm)->
movl(rcx, Address(rcx, Klass::layout_helper_offset()));
1180 int diffbit = Klass::layout_helper_boolean_diffbit();
1181 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1181, _masm)->
testl(rcx, diffbit);
1182 Label L_skip;
1183 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1183, _masm)->
jccb(Assembler::zero, L_skip)jccb_0(Assembler::zero, L_skip, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1183)
;
1184 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1184, _masm)->
andl(rax, 1); // if it is a T_BOOLEAN array, mask the stored value to 0/1
1185 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1185, _masm)->
bind(L_skip);
1186 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1186, _masm)->
access_store_at(T_BYTE, IN_HEAP | IS_ARRAY,
1187 Address(rdx, rbx,Address::times_1,
1188 arrayOopDesc::base_offset_in_bytes(T_BYTE)),
1189 rax, noreg, noreg);
1190}
1191
1192void TemplateTable::castore() {
1193 transition(itos, vtos);
1194 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1194, _masm)->
pop_i(rbx);
1195 // rax: value
1196 // rbx: index
1197 // rdx: array
1198 index_check(rdx, rbx); // prefer index in rbx
1199 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1199, _masm)->
access_store_at(T_CHAR, IN_HEAP | IS_ARRAY,
1200 Address(rdx, rbx, Address::times_2,
1201 arrayOopDesc::base_offset_in_bytes(T_CHAR)),
1202 rax, noreg, noreg);
1203}
1204
1205
1206void TemplateTable::sastore() {
1207 castore();
1208}
1209
1210void TemplateTable::istore(int n) {
1211 transition(itos, vtos);
1212 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1212, _masm)->
movl(iaddress(n), rax);
1213}
1214
1215void TemplateTable::lstore(int n) {
1216 transition(ltos, vtos);
1217 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1217, _masm)->
movptr(laddress(n), rax);
1218 NOT_LP64(__ movptr(haddress(n), rdx));
1219}
1220
1221void TemplateTable::fstore(int n) {
1222 transition(ftos, vtos);
1223 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1223, _masm)->
store_float(faddress(n));
1224}
1225
1226void TemplateTable::dstore(int n) {
1227 transition(dtos, vtos);
1228 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1228, _masm)->
store_double(daddress(n));
1229}
1230
1231
1232void TemplateTable::astore(int n) {
1233 transition(vtos, vtos);
1234 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1234, _masm)->
pop_ptr(rax);
1235 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1235, _masm)->
movptr(aaddress(n), rax);
1236}
1237
1238void TemplateTable::pop() {
1239 transition(vtos, vtos);
1240 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1240, _masm)->
addptr(rsp, Interpreter::stackElementSize);
1241}
1242
1243void TemplateTable::pop2() {
1244 transition(vtos, vtos);
1245 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1245, _masm)->
addptr(rsp, 2 * Interpreter::stackElementSize);
1246}
1247
1248
1249void TemplateTable::dup() {
1250 transition(vtos, vtos);
1251 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1251, _masm)->
load_ptr(0, rax);
1252 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1252, _masm)->
push_ptr(rax);
1253 // stack: ..., a, a
1254}
1255
1256void TemplateTable::dup_x1() {
1257 transition(vtos, vtos);
1258 // stack: ..., a, b
1259 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1259, _masm)->
load_ptr( 0, rax); // load b
1260 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1260, _masm)->
load_ptr( 1, rcx); // load a
1261 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1261, _masm)->
store_ptr(1, rax); // store b
1262 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1262, _masm)->
store_ptr(0, rcx); // store a
1263 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1263, _masm)->
push_ptr(rax); // push b
1264 // stack: ..., b, a, b
1265}
1266
1267void TemplateTable::dup_x2() {
1268 transition(vtos, vtos);
1269 // stack: ..., a, b, c
1270 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1270, _masm)->
load_ptr( 0, rax); // load c
1271 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1271, _masm)->
load_ptr( 2, rcx); // load a
1272 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1272, _masm)->
store_ptr(2, rax); // store c in a
1273 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1273, _masm)->
push_ptr(rax); // push c
1274 // stack: ..., c, b, c, c
1275 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1275, _masm)->
load_ptr( 2, rax); // load b
1276 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1276, _masm)->
store_ptr(2, rcx); // store a in b
1277 // stack: ..., c, a, c, c
1278 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1278, _masm)->
store_ptr(1, rax); // store b in c
1279 // stack: ..., c, a, b, c
1280}
1281
1282void TemplateTable::dup2() {
1283 transition(vtos, vtos);
1284 // stack: ..., a, b
1285 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1285, _masm)->
load_ptr(1, rax); // load a
1286 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1286, _masm)->
push_ptr(rax); // push a
1287 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1287, _masm)->
load_ptr(1, rax); // load b
1288 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1288, _masm)->
push_ptr(rax); // push b
1289 // stack: ..., a, b, a, b
1290}
1291
1292
1293void TemplateTable::dup2_x1() {
1294 transition(vtos, vtos);
1295 // stack: ..., a, b, c
1296 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1296, _masm)->
load_ptr( 0, rcx); // load c
1297 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1297, _masm)->
load_ptr( 1, rax); // load b
1298 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1298, _masm)->
push_ptr(rax); // push b
1299 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1299, _masm)->
push_ptr(rcx); // push c
1300 // stack: ..., a, b, c, b, c
1301 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1301, _masm)->
store_ptr(3, rcx); // store c in b
1302 // stack: ..., a, c, c, b, c
1303 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1303, _masm)->
load_ptr( 4, rcx); // load a
1304 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1304, _masm)->
store_ptr(2, rcx); // store a in 2nd c
1305 // stack: ..., a, c, a, b, c
1306 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1306, _masm)->
store_ptr(4, rax); // store b in a
1307 // stack: ..., b, c, a, b, c
1308}
1309
1310void TemplateTable::dup2_x2() {
1311 transition(vtos, vtos);
1312 // stack: ..., a, b, c, d
1313 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1313, _masm)->
load_ptr( 0, rcx); // load d
1314 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1314, _masm)->
load_ptr( 1, rax); // load c
1315 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1315, _masm)->
push_ptr(rax); // push c
1316 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1316, _masm)->
push_ptr(rcx); // push d
1317 // stack: ..., a, b, c, d, c, d
1318 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1318, _masm)->
load_ptr( 4, rax); // load b
1319 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1319, _masm)->
store_ptr(2, rax); // store b in d
1320 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1320, _masm)->
store_ptr(4, rcx); // store d in b
1321 // stack: ..., a, d, c, b, c, d
1322 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1322, _masm)->
load_ptr( 5, rcx); // load a
1323 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1323, _masm)->
load_ptr( 3, rax); // load c
1324 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1324, _masm)->
store_ptr(3, rcx); // store a in c
1325 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1325, _masm)->
store_ptr(5, rax); // store c in a
1326 // stack: ..., c, d, a, b, c, d
1327}
1328
1329void TemplateTable::swap() {
1330 transition(vtos, vtos);
1331 // stack: ..., a, b
1332 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1332, _masm)->
load_ptr( 1, rcx); // load a
1333 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1333, _masm)->
load_ptr( 0, rax); // load b
1334 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1334, _masm)->
store_ptr(0, rcx); // store a in b
1335 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1335, _masm)->
store_ptr(1, rax); // store b in a
1336 // stack: ..., b, a
1337}
1338
1339void TemplateTable::iop2(Operation op) {
1340 transition(itos, itos);
1341 switch (op) {
1342 case add : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1342, _masm)->
pop_i(rdx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1342, _masm)->
addl (rax, rdx); break;
1343 case sub : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1343, _masm)->
movl(rdx, rax); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1343, _masm)->
pop_i(rax); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1343, _masm)->
subl (rax, rdx); break;
1344 case mul : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1344, _masm)->
pop_i(rdx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1344, _masm)->
imull(rax, rdx); break;
1345 case _and : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1345, _masm)->
pop_i(rdx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1345, _masm)->
andl (rax, rdx); break;
1346 case _or : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1346, _masm)->
pop_i(rdx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1346, _masm)->
orl (rax, rdx); break;
1347 case _xor : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1347, _masm)->
pop_i(rdx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1347, _masm)->
xorl (rax, rdx); break;
1348 case shl : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1348, _masm)->
movl(rcx, rax); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1348, _masm)->
pop_i(rax); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1348, _masm)->
shll (rax); break;
1349 case shr : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1349, _masm)->
movl(rcx, rax); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1349, _masm)->
pop_i(rax); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1349, _masm)->
sarl (rax); break;
1350 case ushr : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1350, _masm)->
movl(rcx, rax); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1350, _masm)->
pop_i(rax); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1350, _masm)->
shrl (rax); break;
1351 default : ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1351); ::breakpoint(); } while (0)
;
1352 }
1353}
1354
1355void TemplateTable::lop2(Operation op) {
1356 transition(ltos, ltos);
1357#ifdef _LP641
1358 switch (op) {
1359 case add : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1359, _masm)->
pop_l(rdx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1359, _masm)->
addptr(rax, rdx); break;
1360 case sub : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1360, _masm)->
mov(rdx, rax); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1360, _masm)->
pop_l(rax); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1360, _masm)->
subptr(rax, rdx); break;
1361 case _and : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1361, _masm)->
pop_l(rdx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1361, _masm)->
andptr(rax, rdx); break;
1362 case _or : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1362, _masm)->
pop_l(rdx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1362, _masm)->
orptr (rax, rdx); break;
1363 case _xor : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1363, _masm)->
pop_l(rdx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1363, _masm)->
xorptr(rax, rdx); break;
1364 default : ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1364); ::breakpoint(); } while (0)
;
1365 }
1366#else
1367 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1367, _masm)->
pop_l(rbx, rcx);
1368 switch (op) {
1369 case add : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1369, _masm)->
addl(rax, rbx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1369, _masm)->
adcl(rdx, rcx); break;
1370 case sub : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1370, _masm)->
subl(rbx, rax); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1370, _masm)->
sbbl(rcx, rdx);
1371 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1371, _masm)->
mov (rax, rbx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1371, _masm)->
mov (rdx, rcx); break;
1372 case _and : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1372, _masm)->
andl(rax, rbx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1372, _masm)->
andl(rdx, rcx); break;
1373 case _or : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1373, _masm)->
orl (rax, rbx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1373, _masm)->
orl (rdx, rcx); break;
1374 case _xor : __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1374, _masm)->
xorl(rax, rbx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1374, _masm)->
xorl(rdx, rcx); break;
1375 default : ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1375); ::breakpoint(); } while (0)
;
1376 }
1377#endif
1378}
1379
1380void TemplateTable::idiv() {
1381 transition(itos, itos);
1382 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1382, _masm)->
movl(rcx, rax);
1383 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1383, _masm)->
pop_i(rax);
1384 // Note: could xor rax and ecx and compare with (-1 ^ min_int). If
1385 // they are not equal, one could do a normal division (no correction
1386 // needed), which may speed up this implementation for the common case.
1387 // (see also JVM spec., p.243 & p.271)
1388 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1388, _masm)->
corrected_idivl(rcx);
1389}
1390
1391void TemplateTable::irem() {
1392 transition(itos, itos);
1393 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1393, _masm)->
movl(rcx, rax);
1394 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1394, _masm)->
pop_i(rax);
1395 // Note: could xor rax and ecx and compare with (-1 ^ min_int). If
1396 // they are not equal, one could do a normal division (no correction
1397 // needed), which may speed up this implementation for the common case.
1398 // (see also JVM spec., p.243 & p.271)
1399 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1399, _masm)->
corrected_idivl(rcx);
1400 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1400, _masm)->
movl(rax, rdx);
1401}
1402
1403void TemplateTable::lmul() {
1404 transition(ltos, ltos);
1405#ifdef _LP641
1406 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1406, _masm)->
pop_l(rdx);
1407 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1407, _masm)->
imulq(rax, rdx);
1408#else
1409 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1409, _masm)->
pop_l(rbx, rcx);
1410 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1410, _masm)->
push(rcx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1410, _masm)->
push(rbx);
1411 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1411, _masm)->
push(rdx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1411, _masm)->
push(rax);
1412 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1412, _masm)->
lmul(2 * wordSize, 0);
1413 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1413, _masm)->
addptr(rsp, 4 * wordSize); // take off temporaries
1414#endif
1415}
1416
1417void TemplateTable::ldiv() {
1418 transition(ltos, ltos);
1419#ifdef _LP641
1420 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1420, _masm)->
mov(rcx, rax);
1421 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1421, _masm)->
pop_l(rax);
1422 // generate explicit div0 check
1423 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1423, _masm)->
testq(rcx, rcx);
1424 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1424, _masm)->
jump_cc(Assembler::zero,
1425 ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
1426 // Note: could xor rax and rcx and compare with (-1 ^ min_int). If
1427 // they are not equal, one could do a normal division (no correction
1428 // needed), which may speed up this implementation for the common case.
1429 // (see also JVM spec., p.243 & p.271)
1430 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1430, _masm)->
corrected_idivq(rcx); // kills rbx
1431#else
1432 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1432, _masm)->
pop_l(rbx, rcx);
1433 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1433, _masm)->
push(rcx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1433, _masm)->
push(rbx);
1434 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1434, _masm)->
push(rdx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1434, _masm)->
push(rax);
1435 // check if y = 0
1436 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1436, _masm)->
orl(rax, rdx);
1437 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1437, _masm)->
jump_cc(Assembler::zero,
1438 ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
1439 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1439, _masm)->
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::ldiv)((address)((address_word)(SharedRuntime::ldiv))));
1440 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1440, _masm)->
addptr(rsp, 4 * wordSize); // take off temporaries
1441#endif
1442}
1443
1444void TemplateTable::lrem() {
1445 transition(ltos, ltos);
1446#ifdef _LP641
1447 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1447, _masm)->
mov(rcx, rax);
1448 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1448, _masm)->
pop_l(rax);
1449 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1449, _masm)->
testq(rcx, rcx);
1450 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1450, _masm)->
jump_cc(Assembler::zero,
1451 ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
1452 // Note: could xor rax and rcx and compare with (-1 ^ min_int). If
1453 // they are not equal, one could do a normal division (no correction
1454 // needed), which may speed up this implementation for the common case.
1455 // (see also JVM spec., p.243 & p.271)
1456 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1456, _masm)->
corrected_idivq(rcx); // kills rbx
1457 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1457, _masm)->
mov(rax, rdx);
1458#else
1459 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1459, _masm)->
pop_l(rbx, rcx);
1460 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1460, _masm)->
push(rcx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1460, _masm)->
push(rbx);
1461 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1461, _masm)->
push(rdx); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1461, _masm)->
push(rax);
1462 // check if y = 0
1463 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1463, _masm)->
orl(rax, rdx);
1464 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1464, _masm)->
jump_cc(Assembler::zero,
1465 ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
1466 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1466, _masm)->
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::lrem)((address)((address_word)(SharedRuntime::lrem))));
1467 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1467, _masm)->
addptr(rsp, 4 * wordSize);
1468#endif
1469}
1470
1471void TemplateTable::lshl() {
1472 transition(itos, ltos);
1473 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1473, _masm)->
movl(rcx, rax); // get shift count
1474 #ifdef _LP641
1475 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1475, _masm)->
pop_l(rax); // get shift value
1476 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1476, _masm)->
shlq(rax);
1477#else
1478 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1478, _masm)->
pop_l(rax, rdx); // get shift value
1479 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1479, _masm)->
lshl(rdx, rax);
1480#endif
1481}
1482
1483void TemplateTable::lshr() {
1484#ifdef _LP641
1485 transition(itos, ltos);
1486 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1486, _masm)->
movl(rcx, rax); // get shift count
1487 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1487, _masm)->
pop_l(rax); // get shift value
1488 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1488, _masm)->
sarq(rax);
1489#else
1490 transition(itos, ltos);
1491 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1491, _masm)->
mov(rcx, rax); // get shift count
1492 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1492, _masm)->
pop_l(rax, rdx); // get shift value
1493 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1493, _masm)->
lshr(rdx, rax, true);
1494#endif
1495}
1496
1497void TemplateTable::lushr() {
1498 transition(itos, ltos);
1499#ifdef _LP641
1500 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1500, _masm)->
movl(rcx, rax); // get shift count
1501 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1501, _masm)->
pop_l(rax); // get shift value
1502 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1502, _masm)->
shrq(rax);
1503#else
1504 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1504, _masm)->
mov(rcx, rax); // get shift count
1505 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1505, _masm)->
pop_l(rax, rdx); // get shift value
1506 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1506, _masm)->
lshr(rdx, rax);
1507#endif
1508}
1509
1510void TemplateTable::fop2(Operation op) {
1511 transition(ftos, ftos);
1512
1513 if (UseSSE >= 1) {
1514 switch (op) {
1515 case add:
1516 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1516, _masm)->
addss(xmm0, at_rsp());
1517 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1517, _masm)->
addptr(rsp, Interpreter::stackElementSize);
1518 break;
1519 case sub:
1520 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1520, _masm)->
movflt(xmm1, xmm0);
1521 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1521, _masm)->
pop_f(xmm0);
1522 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1522, _masm)->
subss(xmm0, xmm1);
1523 break;
1524 case mul:
1525 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1525, _masm)->
mulss(xmm0, at_rsp());
1526 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1526, _masm)->
addptr(rsp, Interpreter::stackElementSize);
1527 break;
1528 case div:
1529 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1529, _masm)->
movflt(xmm1, xmm0);
1530 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1530, _masm)->
pop_f(xmm0);
1531 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1531, _masm)->
divss(xmm0, xmm1);
1532 break;
1533 case rem:
1534 // On x86_64 platforms the SharedRuntime::frem method is called to perform the
1535 // modulo operation. The frem method calls the function
1536 // double fmod(double x, double y) in math.h. The documentation of fmod states:
1537 // "If x or y is a NaN, a NaN is returned." without specifying what type of NaN
1538 // (signalling or quiet) is returned.
1539 //
1540 // On x86_32 platforms the FPU is used to perform the modulo operation. The
1541 // reason is that on 32-bit Windows the sign of modulo operations diverges from
1542 // what is considered the standard (e.g., -0.0f % -3.14f is 0.0f (and not -0.0f).
1543 // The fprem instruction used on x86_32 is functionally equivalent to
1544 // SharedRuntime::frem in that it returns a NaN.
1545#ifdef _LP641
1546 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1546, _masm)->
movflt(xmm1, xmm0);
1547 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1547, _masm)->
pop_f(xmm0);
1548 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1548, _masm)->
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::frem)((address)((address_word)(SharedRuntime::frem))), 2);
1549#else
1550 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1550, _masm)->
push_f(xmm0);
1551 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1551, _masm)->
pop_f();
1552 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1552, _masm)->
fld_s(at_rsp());
1553 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1553, _masm)->
fremr(rax);
1554 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1554, _masm)->
f2ieee();
1555 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1555, _masm)->
pop(rax); // pop second operand off the stack
1556 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1556, _masm)->
push_f();
1557 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1557, _masm)->
pop_f(xmm0);
1558#endif
1559 break;
1560 default:
1561 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1561); ::breakpoint(); } while (0)
;
1562 break;
1563 }
1564 } else {
1565#ifdef _LP641
1566 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1566); ::breakpoint(); } while (0)
;
1567#else
1568 switch (op) {
1569 case add: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1569, _masm)->
fadd_s (at_rsp()); break;
1570 case sub: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1570, _masm)->
fsubr_s(at_rsp()); break;
1571 case mul: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1571, _masm)->
fmul_s (at_rsp()); break;
1572 case div: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1572, _masm)->
fdivr_s(at_rsp()); break;
1573 case rem: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1573, _masm)->
fld_s (at_rsp()); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1573, _masm)->
fremr(rax); break;
1574 default : ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1574); ::breakpoint(); } while (0)
;
1575 }
1576 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1576, _masm)->
f2ieee();
1577 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1577, _masm)->
pop(rax); // pop second operand off the stack
1578#endif // _LP64
1579 }
1580}
1581
1582void TemplateTable::dop2(Operation op) {
1583 transition(dtos, dtos);
1584 if (UseSSE >= 2) {
1585 switch (op) {
1586 case add:
1587 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1587, _masm)->
addsd(xmm0, at_rsp());
1588 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1588, _masm)->
addptr(rsp, 2 * Interpreter::stackElementSize);
1589 break;
1590 case sub:
1591 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1591, _masm)->
movdbl(xmm1, xmm0);
1592 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1592, _masm)->
pop_d(xmm0);
1593 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1593, _masm)->
subsd(xmm0, xmm1);
1594 break;
1595 case mul:
1596 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1596, _masm)->
mulsd(xmm0, at_rsp());
1597 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1597, _masm)->
addptr(rsp, 2 * Interpreter::stackElementSize);
1598 break;
1599 case div:
1600 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1600, _masm)->
movdbl(xmm1, xmm0);
1601 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1601, _masm)->
pop_d(xmm0);
1602 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1602, _masm)->
divsd(xmm0, xmm1);
1603 break;
1604 case rem:
1605 // Similar to fop2(), the modulo operation is performed using the
1606 // SharedRuntime::drem method (on x86_64 platforms) or using the
1607 // FPU (on x86_32 platforms) for the same reasons as mentioned in fop2().
1608#ifdef _LP641
1609 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1609, _masm)->
movdbl(xmm1, xmm0);
1610 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1610, _masm)->
pop_d(xmm0);
1611 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1611, _masm)->
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::drem)((address)((address_word)(SharedRuntime::drem))), 2);
1612#else
1613 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1613, _masm)->
push_d(xmm0);
1614 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1614, _masm)->
pop_d();
1615 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1615, _masm)->
fld_d(at_rsp());
1616 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1616, _masm)->
fremr(rax);
1617 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1617, _masm)->
d2ieee();
1618 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1618, _masm)->
pop(rax);
1619 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1619, _masm)->
pop(rdx);
1620 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1620, _masm)->
push_d();
1621 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1621, _masm)->
pop_d(xmm0);
1622#endif
1623 break;
1624 default:
1625 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1625); ::breakpoint(); } while (0)
;
1626 break;
1627 }
1628 } else {
1629#ifdef _LP641
1630 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1630); ::breakpoint(); } while (0)
;
1631#else
1632 switch (op) {
1633 case add: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1633, _masm)->
fadd_d (at_rsp()); break;
1634 case sub: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1634, _masm)->
fsubr_d(at_rsp()); break;
1635 case mul: {
1636 // strict semantics
1637 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1637, _masm)->
fld_x(ExternalAddress(StubRoutines::x86::addr_fpu_subnormal_bias1()));
1638 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1638, _masm)->
fmulp();
1639 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1639, _masm)->
fmul_d (at_rsp());
1640 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1640, _masm)->
fld_x(ExternalAddress(StubRoutines::x86::addr_fpu_subnormal_bias2()));
1641 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1641, _masm)->
fmulp();
1642 break;
1643 }
1644 case div: {
1645 // strict semantics
1646 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1646, _masm)->
fld_x(ExternalAddress(StubRoutines::x86::addr_fpu_subnormal_bias1()));
1647 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1647, _masm)->
fmul_d (at_rsp());
1648 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1648, _masm)->
fdivrp();
1649 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1649, _masm)->
fld_x(ExternalAddress(StubRoutines::x86::addr_fpu_subnormal_bias2()));
1650 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1650, _masm)->
fmulp();
1651 break;
1652 }
1653 case rem: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1653, _masm)->
fld_d (at_rsp()); __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1653, _masm)->
fremr(rax); break;
1654 default : ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1654); ::breakpoint(); } while (0)
;
1655 }
1656 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1656, _masm)->
d2ieee();
1657 // Pop double precision number from rsp.
1658 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1658, _masm)->
pop(rax);
1659 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1659, _masm)->
pop(rdx);
1660#endif
1661 }
1662}
1663
1664void TemplateTable::ineg() {
1665 transition(itos, itos);
1666 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1666, _masm)->
negl(rax);
1667}
1668
1669void TemplateTable::lneg() {
1670 transition(ltos, ltos);
1671 LP64_ONLY(__ negq(rax))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1671, _masm)-> negq(rax)
;
1672 NOT_LP64(__ lneg(rdx, rax));
1673}
1674
1675// Note: 'double' and 'long long' have 32-bits alignment on x86.
1676static jlong* double_quadword(jlong *adr, jlong lo, jlong hi) {
1677 // Use the expression (adr)&(~0xF) to provide 128-bits aligned address
1678 // of 128-bits operands for SSE instructions.
1679 jlong *operand = (jlong*)(((intptr_t)adr)&((intptr_t)(~0xF)));
1680 // Store the value to a 128-bits operand.
1681 operand[0] = lo;
1682 operand[1] = hi;
1683 return operand;
1684}
1685
1686// Buffer for 128-bits masks used by SSE instructions.
1687static jlong float_signflip_pool[2*2];
1688static jlong double_signflip_pool[2*2];
1689
1690void TemplateTable::fneg() {
1691 transition(ftos, ftos);
1692 if (UseSSE >= 1) {
1693 static jlong *float_signflip = double_quadword(&float_signflip_pool[1], CONST64(0x8000000080000000)(0x8000000080000000LL), CONST64(0x8000000080000000)(0x8000000080000000LL));
1694 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1694, _masm)->
xorps(xmm0, ExternalAddress((address) float_signflip));
1695 } else {
1696 LP64_ONLY(ShouldNotReachHere())do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1696); ::breakpoint(); } while (0)
;
1697 NOT_LP64(__ fchs());
1698 }
1699}
1700
1701void TemplateTable::dneg() {
1702 transition(dtos, dtos);
1703 if (UseSSE >= 2) {
1704 static jlong *double_signflip =
1705 double_quadword(&double_signflip_pool[1], CONST64(0x8000000000000000)(0x8000000000000000LL), CONST64(0x8000000000000000)(0x8000000000000000LL));
1706 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1706, _masm)->
xorpd(xmm0, ExternalAddress((address) double_signflip));
1707 } else {
1708#ifdef _LP641
1709 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1709); ::breakpoint(); } while (0)
;
1710#else
1711 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1711, _masm)->
fchs();
1712#endif
1713 }
1714}
1715
1716void TemplateTable::iinc() {
1717 transition(vtos, vtos);
1718 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1718, _masm)->
load_signed_byte(rdx, at_bcp(2)); // get constant
1719 locals_index(rbx);
1720 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1720, _masm)->
addl(iaddress(rbx), rdx);
1721}
1722
1723void TemplateTable::wide_iinc() {
1724 transition(vtos, vtos);
1725 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1725, _masm)->
movl(rdx, at_bcp(4)); // get constant
1726 locals_index_wide(rbx);
1727 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1727, _masm)->
bswapl(rdx); // swap bytes & sign-extend constant
1728 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1728, _masm)->
sarl(rdx, 16);
1729 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1729, _masm)->
addl(iaddress(rbx), rdx);
1730 // Note: should probably use only one movl to get both
1731 // the index and the constant -> fix this
1732}
1733
1734void TemplateTable::convert() {
1735#ifdef _LP641
1736 // Checking
1737#ifdef ASSERT1
1738 {
1739 TosState tos_in = ilgl;
1740 TosState tos_out = ilgl;
1741 switch (bytecode()) {
1742 case Bytecodes::_i2l: // fall through
1743 case Bytecodes::_i2f: // fall through
1744 case Bytecodes::_i2d: // fall through
1745 case Bytecodes::_i2b: // fall through
1746 case Bytecodes::_i2c: // fall through
1747 case Bytecodes::_i2s: tos_in = itos; break;
1748 case Bytecodes::_l2i: // fall through
1749 case Bytecodes::_l2f: // fall through
1750 case Bytecodes::_l2d: tos_in = ltos; break;
1751 case Bytecodes::_f2i: // fall through
1752 case Bytecodes::_f2l: // fall through
1753 case Bytecodes::_f2d: tos_in = ftos; break;
1754 case Bytecodes::_d2i: // fall through
1755 case Bytecodes::_d2l: // fall through
1756 case Bytecodes::_d2f: tos_in = dtos; break;
1757 default : ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1757); ::breakpoint(); } while (0)
;
1758 }
1759 switch (bytecode()) {
1760 case Bytecodes::_l2i: // fall through
1761 case Bytecodes::_f2i: // fall through
1762 case Bytecodes::_d2i: // fall through
1763 case Bytecodes::_i2b: // fall through
1764 case Bytecodes::_i2c: // fall through
1765 case Bytecodes::_i2s: tos_out = itos; break;
1766 case Bytecodes::_i2l: // fall through
1767 case Bytecodes::_f2l: // fall through
1768 case Bytecodes::_d2l: tos_out = ltos; break;
1769 case Bytecodes::_i2f: // fall through
1770 case Bytecodes::_l2f: // fall through
1771 case Bytecodes::_d2f: tos_out = ftos; break;
1772 case Bytecodes::_i2d: // fall through
1773 case Bytecodes::_l2d: // fall through
1774 case Bytecodes::_f2d: tos_out = dtos; break;
1775 default : ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1775); ::breakpoint(); } while (0)
;
1776 }
1777 transition(tos_in, tos_out);
1778 }
1779#endif // ASSERT
1780
1781 static const int64_t is_nan = 0x8000000000000000L;
1782
1783 // Conversion
1784 switch (bytecode()) {
1785 case Bytecodes::_i2l:
1786 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1786, _masm)->
movslq(rax, rax);
1787 break;
1788 case Bytecodes::_i2f:
1789 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1789, _masm)->
cvtsi2ssl(xmm0, rax);
1790 break;
1791 case Bytecodes::_i2d:
1792 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1792, _masm)->
cvtsi2sdl(xmm0, rax);
1793 break;
1794 case Bytecodes::_i2b:
1795 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1795, _masm)->
movsbl(rax, rax);
1796 break;
1797 case Bytecodes::_i2c:
1798 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1798, _masm)->
movzwl(rax, rax);
1799 break;
1800 case Bytecodes::_i2s:
1801 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1801, _masm)->
movswl(rax, rax);
1802 break;
1803 case Bytecodes::_l2i:
1804 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1804, _masm)->
movl(rax, rax);
1805 break;
1806 case Bytecodes::_l2f:
1807 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1807, _masm)->
cvtsi2ssq(xmm0, rax);
1808 break;
1809 case Bytecodes::_l2d:
1810 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1810, _masm)->
cvtsi2sdq(xmm0, rax);
1811 break;
1812 case Bytecodes::_f2i:
1813 {
1814 Label L;
1815 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1815, _masm)->
cvttss2sil(rax, xmm0);
1816 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1816, _masm)->
cmpl(rax, 0x80000000); // NaN or overflow/underflow?
1817 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1817, _masm)->
jcc(Assembler::notEqual, L);
1818 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1818, _masm)->
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::f2i)((address)((address_word)(SharedRuntime::f2i))), 1);
1819 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1819, _masm)->
bind(L);
1820 }
1821 break;
1822 case Bytecodes::_f2l:
1823 {
1824 Label L;
1825 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1825, _masm)->
cvttss2siq(rax, xmm0);
1826 // NaN or overflow/underflow?
1827 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1827, _masm)->
cmp64(rax, ExternalAddress((address) &is_nan));
1828 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1828, _masm)->
jcc(Assembler::notEqual, L);
1829 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1829, _masm)->
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::f2l)((address)((address_word)(SharedRuntime::f2l))), 1);
1830 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1830, _masm)->
bind(L);
1831 }
1832 break;
1833 case Bytecodes::_f2d:
1834 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1834, _masm)->
cvtss2sd(xmm0, xmm0);
1835 break;
1836 case Bytecodes::_d2i:
1837 {
1838 Label L;
1839 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1839, _masm)->
cvttsd2sil(rax, xmm0);
1840 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1840, _masm)->
cmpl(rax, 0x80000000); // NaN or overflow/underflow?
1841 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1841, _masm)->
jcc(Assembler::notEqual, L);
1842 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1842, _masm)->
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::d2i)((address)((address_word)(SharedRuntime::d2i))), 1);
1843 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1843, _masm)->
bind(L);
1844 }
1845 break;
1846 case Bytecodes::_d2l:
1847 {
1848 Label L;
1849 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1849, _masm)->
cvttsd2siq(rax, xmm0);
1850 // NaN or overflow/underflow?
1851 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1851, _masm)->
cmp64(rax, ExternalAddress((address) &is_nan));
1852 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1852, _masm)->
jcc(Assembler::notEqual, L);
1853 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1853, _masm)->
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::d2l)((address)((address_word)(SharedRuntime::d2l))), 1);
1854 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1854, _masm)->
bind(L);
1855 }
1856 break;
1857 case Bytecodes::_d2f:
1858 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1858, _masm)->
cvtsd2ss(xmm0, xmm0);
1859 break;
1860 default:
1861 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1861); ::breakpoint(); } while (0)
;
1862 }
1863#else
1864 // Checking
1865#ifdef ASSERT1
1866 { TosState tos_in = ilgl;
1867 TosState tos_out = ilgl;
1868 switch (bytecode()) {
1869 case Bytecodes::_i2l: // fall through
1870 case Bytecodes::_i2f: // fall through
1871 case Bytecodes::_i2d: // fall through
1872 case Bytecodes::_i2b: // fall through
1873 case Bytecodes::_i2c: // fall through
1874 case Bytecodes::_i2s: tos_in = itos; break;
1875 case Bytecodes::_l2i: // fall through
1876 case Bytecodes::_l2f: // fall through
1877 case Bytecodes::_l2d: tos_in = ltos; break;
1878 case Bytecodes::_f2i: // fall through
1879 case Bytecodes::_f2l: // fall through
1880 case Bytecodes::_f2d: tos_in = ftos; break;
1881 case Bytecodes::_d2i: // fall through
1882 case Bytecodes::_d2l: // fall through
1883 case Bytecodes::_d2f: tos_in = dtos; break;
1884 default : ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1884); ::breakpoint(); } while (0)
;
1885 }
1886 switch (bytecode()) {
1887 case Bytecodes::_l2i: // fall through
1888 case Bytecodes::_f2i: // fall through
1889 case Bytecodes::_d2i: // fall through
1890 case Bytecodes::_i2b: // fall through
1891 case Bytecodes::_i2c: // fall through
1892 case Bytecodes::_i2s: tos_out = itos; break;
1893 case Bytecodes::_i2l: // fall through
1894 case Bytecodes::_f2l: // fall through
1895 case Bytecodes::_d2l: tos_out = ltos; break;
1896 case Bytecodes::_i2f: // fall through
1897 case Bytecodes::_l2f: // fall through
1898 case Bytecodes::_d2f: tos_out = ftos; break;
1899 case Bytecodes::_i2d: // fall through
1900 case Bytecodes::_l2d: // fall through
1901 case Bytecodes::_f2d: tos_out = dtos; break;
1902 default : ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1902); ::breakpoint(); } while (0)
;
1903 }
1904 transition(tos_in, tos_out);
1905 }
1906#endif // ASSERT
1907
1908 // Conversion
1909 // (Note: use push(rcx)/pop(rcx) for 1/2-word stack-ptr manipulation)
1910 switch (bytecode()) {
1911 case Bytecodes::_i2l:
1912 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1912, _masm)->
extend_sign(rdx, rax);
1913 break;
1914 case Bytecodes::_i2f:
1915 if (UseSSE >= 1) {
1916 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1916, _masm)->
cvtsi2ssl(xmm0, rax);
1917 } else {
1918 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1918, _masm)->
push(rax); // store int on tos
1919 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1919, _masm)->
fild_s(at_rsp()); // load int to ST0
1920 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1920, _masm)->
f2ieee(); // truncate to float size
1921 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1921, _masm)->
pop(rcx); // adjust rsp
1922 }
1923 break;
1924 case Bytecodes::_i2d:
1925 if (UseSSE >= 2) {
1926 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1926, _masm)->
cvtsi2sdl(xmm0, rax);
1927 } else {
1928 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1928, _masm)->
push(rax); // add one slot for d2ieee()
1929 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1929, _masm)->
push(rax); // store int on tos
1930 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1930, _masm)->
fild_s(at_rsp()); // load int to ST0
1931 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1931, _masm)->
d2ieee(); // truncate to double size
1932 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1932, _masm)->
pop(rcx); // adjust rsp
1933 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1933, _masm)->
pop(rcx);
1934 }
1935 break;
1936 case Bytecodes::_i2b:
1937 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1937, _masm)->
shll(rax, 24); // truncate upper 24 bits
1938 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1938, _masm)->
sarl(rax, 24); // and sign-extend byte
1939 LP64_ONLY(__ movsbl(rax, rax))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1939, _masm)-> movsbl(rax, rax)
;
1940 break;
1941 case Bytecodes::_i2c:
1942 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1942, _masm)->
andl(rax, 0xFFFF); // truncate upper 16 bits
1943 LP64_ONLY(__ movzwl(rax, rax))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1943, _masm)-> movzwl(rax, rax)
;
1944 break;
1945 case Bytecodes::_i2s:
1946 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1946, _masm)->
shll(rax, 16); // truncate upper 16 bits
1947 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1947, _masm)->
sarl(rax, 16); // and sign-extend short
1948 LP64_ONLY(__ movswl(rax, rax))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1948, _masm)-> movswl(rax, rax)
;
1949 break;
1950 case Bytecodes::_l2i:
1951 /* nothing to do */
1952 break;
1953 case Bytecodes::_l2f:
1954 // On 64-bit platforms, the cvtsi2ssq instruction is used to convert
1955 // 64-bit long values to floats. On 32-bit platforms it is not possible
1956 // to use that instruction with 64-bit operands, therefore the FPU is
1957 // used to perform the conversion.
1958 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1958, _masm)->
push(rdx); // store long on tos
1959 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1959, _masm)->
push(rax);
1960 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1960, _masm)->
fild_d(at_rsp()); // load long to ST0
1961 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1961, _masm)->
f2ieee(); // truncate to float size
1962 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1962, _masm)->
pop(rcx); // adjust rsp
1963 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1963, _masm)->
pop(rcx);
1964 if (UseSSE >= 1) {
1965 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1965, _masm)->
push_f();
1966 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1966, _masm)->
pop_f(xmm0);
1967 }
1968 break;
1969 case Bytecodes::_l2d:
1970 // On 32-bit platforms the FPU is used for conversion because on
1971 // 32-bit platforms it is not not possible to use the cvtsi2sdq
1972 // instruction with 64-bit operands.
1973 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1973, _masm)->
push(rdx); // store long on tos
1974 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1974, _masm)->
push(rax);
1975 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1975, _masm)->
fild_d(at_rsp()); // load long to ST0
1976 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1976, _masm)->
d2ieee(); // truncate to double size
1977 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1977, _masm)->
pop(rcx); // adjust rsp
1978 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1978, _masm)->
pop(rcx);
1979 if (UseSSE >= 2) {
1980 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1980, _masm)->
push_d();
1981 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1981, _masm)->
pop_d(xmm0);
1982 }
1983 break;
1984 case Bytecodes::_f2i:
1985 // SharedRuntime::f2i does not differentiate between sNaNs and qNaNs
1986 // as it returns 0 for any NaN.
1987 if (UseSSE >= 1) {
1988 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1988, _masm)->
push_f(xmm0);
1989 } else {
1990 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1990, _masm)->
push(rcx); // reserve space for argument
1991 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1991, _masm)->
fstp_s(at_rsp()); // pass float argument on stack
1992 }
1993 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1993, _masm)->
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::f2i)((address)((address_word)(SharedRuntime::f2i))), 1);
1994 break;
1995 case Bytecodes::_f2l:
1996 // SharedRuntime::f2l does not differentiate between sNaNs and qNaNs
1997 // as it returns 0 for any NaN.
1998 if (UseSSE >= 1) {
1999 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 1999, _masm)->
push_f(xmm0);
2000 } else {
2001 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2001, _masm)->
push(rcx); // reserve space for argument
2002 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2002, _masm)->
fstp_s(at_rsp()); // pass float argument on stack
2003 }
2004 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2004, _masm)->
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::f2l)((address)((address_word)(SharedRuntime::f2l))), 1);
2005 break;
2006 case Bytecodes::_f2d:
2007 if (UseSSE < 1) {
2008 /* nothing to do */
2009 } else if (UseSSE == 1) {
2010 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2010, _masm)->
push_f(xmm0);
2011 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2011, _masm)->
pop_f();
2012 } else { // UseSSE >= 2
2013 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2013, _masm)->
cvtss2sd(xmm0, xmm0);
2014 }
2015 break;
2016 case Bytecodes::_d2i:
2017 if (UseSSE >= 2) {
2018 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2018, _masm)->
push_d(xmm0);
2019 } else {
2020 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2020, _masm)->
push(rcx); // reserve space for argument
2021 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2021, _masm)->
push(rcx);
2022 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2022, _masm)->
fstp_d(at_rsp()); // pass double argument on stack
2023 }
2024 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2024, _masm)->
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::d2i)((address)((address_word)(SharedRuntime::d2i))), 2);
2025 break;
2026 case Bytecodes::_d2l:
2027 if (UseSSE >= 2) {
2028 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2028, _masm)->
push_d(xmm0);
2029 } else {
2030 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2030, _masm)->
push(rcx); // reserve space for argument
2031 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2031, _masm)->
push(rcx);
2032 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2032, _masm)->
fstp_d(at_rsp()); // pass double argument on stack
2033 }
2034 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2034, _masm)->
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::d2l)((address)((address_word)(SharedRuntime::d2l))), 2);
2035 break;
2036 case Bytecodes::_d2f:
2037 if (UseSSE <= 1) {
2038 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2038, _masm)->
push(rcx); // reserve space for f2ieee()
2039 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2039, _masm)->
f2ieee(); // truncate to float size
2040 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2040, _masm)->
pop(rcx); // adjust rsp
2041 if (UseSSE == 1) {
2042 // The cvtsd2ss instruction is not available if UseSSE==1, therefore
2043 // the conversion is performed using the FPU in this case.
2044 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2044, _masm)->
push_f();
2045 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2045, _masm)->
pop_f(xmm0);
2046 }
2047 } else { // UseSSE >= 2
2048 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2048, _masm)->
cvtsd2ss(xmm0, xmm0);
2049 }
2050 break;
2051 default :
2052 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2052); ::breakpoint(); } while (0)
;
2053 }
2054#endif
2055}
2056
2057void TemplateTable::lcmp() {
2058 transition(ltos, itos);
2059#ifdef _LP641
2060 Label done;
2061 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2061, _masm)->
pop_l(rdx);
2062 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2062, _masm)->
cmpq(rdx, rax);
2063 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2063, _masm)->
movl(rax, -1);
2064 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2064, _masm)->
jccb(Assembler::less, done)jccb_0(Assembler::less, done, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2064)
;
2065 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2065, _masm)->
setb(Assembler::notEqual, rax);
2066 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2066, _masm)->
movzbl(rax, rax);
2067 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2067, _masm)->
bind(done);
2068#else
2069
2070 // y = rdx:rax
2071 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2071, _masm)->
pop_l(rbx, rcx); // get x = rcx:rbx
2072 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2072, _masm)->
lcmp2int(rcx, rbx, rdx, rax);// rcx := cmp(x, y)
2073 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2073, _masm)->
mov(rax, rcx);
2074#endif
2075}
2076
2077void TemplateTable::float_cmp(bool is_float, int unordered_result) {
2078 if ((is_float && UseSSE >= 1) ||
2079 (!is_float && UseSSE >= 2)) {
2080 Label done;
2081 if (is_float) {
2082 // XXX get rid of pop here, use ... reg, mem32
2083 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2083, _masm)->
pop_f(xmm1);
2084 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2084, _masm)->
ucomiss(xmm1, xmm0);
2085 } else {
2086 // XXX get rid of pop here, use ... reg, mem64
2087 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2087, _masm)->
pop_d(xmm1);
2088 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2088, _masm)->
ucomisd(xmm1, xmm0);
2089 }
2090 if (unordered_result < 0) {
2091 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2091, _masm)->
movl(rax, -1);
2092 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2092, _masm)->
jccb(Assembler::parity, done)jccb_0(Assembler::parity, done, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2092)
;
2093 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2093, _masm)->
jccb(Assembler::below, done)jccb_0(Assembler::below, done, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2093)
;
2094 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2094, _masm)->
setb(Assembler::notEqual, rdx);
2095 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2095, _masm)->
movzbl(rax, rdx);
2096 } else {
2097 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2097, _masm)->
movl(rax, 1);
2098 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2098, _masm)->
jccb(Assembler::parity, done)jccb_0(Assembler::parity, done, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2098)
;
2099 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2099, _masm)->
jccb(Assembler::above, done)jccb_0(Assembler::above, done, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2099)
;
2100 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2100, _masm)->
movl(rax, 0);
2101 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2101, _masm)->
jccb(Assembler::equal, done)jccb_0(Assembler::equal, done, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2101)
;
2102 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2102, _masm)->
decrementl(rax);
2103 }
2104 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2104, _masm)->
bind(done);
2105 } else {
2106#ifdef _LP641
2107 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2107); ::breakpoint(); } while (0)
;
2108#else
2109 if (is_float) {
2110 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2110, _masm)->
fld_s(at_rsp());
2111 } else {
2112 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2112, _masm)->
fld_d(at_rsp());
2113 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2113, _masm)->
pop(rdx);
2114 }
2115 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2115, _masm)->
pop(rcx);
2116 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2116, _masm)->
fcmp2int(rax, unordered_result < 0);
2117#endif // _LP64
2118 }
2119}
2120
2121void TemplateTable::branch(bool is_jsr, bool is_wide) {
2122 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2122, _masm)->
get_method(rcx); // rcx holds method
2123 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2123, _masm)->
profile_taken_branch(rax, rbx); // rax holds updated MDP, rbx
2124 // holds bumped taken count
2125
2126 const ByteSize be_offset = MethodCounters::backedge_counter_offset() +
2127 InvocationCounter::counter_offset();
2128 const ByteSize inv_offset = MethodCounters::invocation_counter_offset() +
Value stored to 'inv_offset' during its initialization is never read
2129 InvocationCounter::counter_offset();
2130
2131 // Load up edx with the branch displacement
2132 if (is_wide) {
2133 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2133, _masm)->
movl(rdx, at_bcp(1));
2134 } else {
2135 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2135, _masm)->
load_signed_short(rdx, at_bcp(1));
2136 }
2137 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2137, _masm)->
bswapl(rdx);
2138
2139 if (!is_wide) {
2140 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2140, _masm)->
sarl(rdx, 16);
2141 }
2142 LP64_ONLY(__ movl2ptr(rdx, rdx))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2142, _masm)-> movl2ptr(rdx, rdx)
;
2143
2144 // Handle all the JSR stuff here, then exit.
2145 // It's much shorter and cleaner than intermingling with the non-JSR
2146 // normal-branch stuff occurring below.
2147 if (is_jsr) {
2148 // Pre-load the next target bytecode into rbx
2149 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2149, _masm)->
load_unsigned_byte(rbx, Address(rbcp, rdx, Address::times_1, 0));
2150
2151 // compute return address as bci in rax
2152 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2152, _masm)->
lea(rax, at_bcp((is_wide ? 5 : 3) -
2153 in_bytes(ConstMethod::codes_offset())));
2154 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2154, _masm)->
subptr(rax, Address(rcx, Method::const_offset()));
2155 // Adjust the bcp in r13 by the displacement in rdx
2156 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2156, _masm)->
addptr(rbcp, rdx);
2157 // jsr returns atos that is not an oop
2158 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2158, _masm)->
push_i(rax);
2159 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2159, _masm)->
dispatch_only(vtos, true);
2160 return;
2161 }
2162
2163 // Normal (non-jsr) branch handling
2164
2165 // Adjust the bcp in r13 by the displacement in rdx
2166 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2166, _masm)->
addptr(rbcp, rdx);
2167
2168 assert(UseLoopCounter || !UseOnStackReplacement,do { if (!(UseLoopCounter || !UseOnStackReplacement)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2169, "assert(" "UseLoopCounter || !UseOnStackReplacement" ") failed"
, "on-stack-replacement requires loop counters"); ::breakpoint
(); } } while (0)
2169 "on-stack-replacement requires loop counters")do { if (!(UseLoopCounter || !UseOnStackReplacement)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2169, "assert(" "UseLoopCounter || !UseOnStackReplacement" ") failed"
, "on-stack-replacement requires loop counters"); ::breakpoint
(); } } while (0)
;
2170 Label backedge_counter_overflow;
2171 Label dispatch;
2172 if (UseLoopCounter) {
2173 // increment backedge counter for backward branches
2174 // rax: MDO
2175 // rbx: MDO bumped taken-count
2176 // rcx: method
2177 // rdx: target offset
2178 // r13: target bcp
2179 // r14: locals pointer
2180 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2180, _masm)->
testl(rdx, rdx); // check if forward or backward branch
2181 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2181, _masm)->
jcc(Assembler::positive, dispatch); // count only if backward branch
2182
2183 // check if MethodCounters exists
2184 Label has_counters;
2185 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2185, _masm)->
movptr(rax, Address(rcx, Method::method_counters_offset()));
2186 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2186, _masm)->
testptr(rax, rax);
2187 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2187, _masm)->
jcc(Assembler::notZero, has_counters);
2188 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2188, _masm)->
push(rdx);
2189 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2189, _masm)->
push(rcx);
2190 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2190, _masm)->
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::build_method_counters)((address)((address_word)(InterpreterRuntime::build_method_counters
)))
,
2191 rcx);
2192 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2192, _masm)->
pop(rcx);
2193 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2193, _masm)->
pop(rdx);
2194 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2194, _masm)->
movptr(rax, Address(rcx, Method::method_counters_offset()));
2195 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2195, _masm)->
testptr(rax, rax);
2196 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2196, _masm)->
jcc(Assembler::zero, dispatch);
2197 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2197, _masm)->
bind(has_counters);
2198
2199 Label no_mdo;
2200 int increment = InvocationCounter::count_increment;
2201 if (ProfileInterpreter) {
2202 // Are we profiling?
2203 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2203, _masm)->
movptr(rbx, Address(rcx, in_bytes(Method::method_data_offset())));
2204 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2204, _masm)->
testptr(rbx, rbx);
2205 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2205, _masm)->
jccb(Assembler::zero, no_mdo)jccb_0(Assembler::zero, no_mdo, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2205)
;
2206 // Increment the MDO backedge counter
2207 const Address mdo_backedge_counter(rbx, in_bytes(MethodData::backedge_counter_offset()) +
2208 in_bytes(InvocationCounter::counter_offset()));
2209 const Address mask(rbx, in_bytes(MethodData::backedge_mask_offset()));
2210 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2210, _masm)->
increment_mask_and_jump(mdo_backedge_counter, increment, mask, rax, false, Assembler::zero,
2211 UseOnStackReplacement ? &backedge_counter_overflow : NULL__null);
2212 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2212, _masm)->
jmp(dispatch);
2213 }
2214 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2214, _masm)->
bind(no_mdo);
2215 // Increment backedge counter in MethodCounters*
2216 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2216, _masm)->
movptr(rcx, Address(rcx, Method::method_counters_offset()));
2217 const Address mask(rcx, in_bytes(MethodCounters::backedge_mask_offset()));
2218 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2218, _masm)->
increment_mask_and_jump(Address(rcx, be_offset), increment, mask,
2219 rax, false, Assembler::zero, UseOnStackReplacement ? &backedge_counter_overflow : NULL__null);
2220 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2220, _masm)->
bind(dispatch);
2221 }
2222
2223 // Pre-load the next target bytecode into rbx
2224 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2224, _masm)->
load_unsigned_byte(rbx, Address(rbcp, 0));
2225
2226 // continue with the bytecode @ target
2227 // rax: return bci for jsr's, unused otherwise
2228 // rbx: target bytecode
2229 // r13: target bcp
2230 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2230, _masm)->
dispatch_only(vtos, true);
2231
2232 if (UseLoopCounter) {
2233 if (UseOnStackReplacement) {
2234 Label set_mdp;
2235 // invocation counter overflow
2236 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2236, _masm)->
bind(backedge_counter_overflow);
2237 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2237, _masm)->
negptr(rdx);
2238 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2238, _masm)->
addptr(rdx, rbcp); // branch bcp
2239 // IcoResult frequency_counter_overflow([JavaThread*], address branch_bcp)
2240 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2240, _masm)->
call_VM(noreg,
2241 CAST_FROM_FN_PTR(address,((address)((address_word)(InterpreterRuntime::frequency_counter_overflow
)))
2242 InterpreterRuntime::frequency_counter_overflow)((address)((address_word)(InterpreterRuntime::frequency_counter_overflow
)))
,
2243 rdx);
2244
2245 // rax: osr nmethod (osr ok) or NULL (osr not possible)
2246 // rdx: scratch
2247 // r14: locals pointer
2248 // r13: bcp
2249 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2249, _masm)->
testptr(rax, rax); // test result
2250 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2250, _masm)->
jcc(Assembler::zero, dispatch); // no osr if null
2251 // nmethod may have been invalidated (VM may block upon call_VM return)
2252 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2252, _masm)->
cmpb(Address(rax, nmethod::state_offset()), nmethod::in_use);
2253 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2253, _masm)->
jcc(Assembler::notEqual, dispatch);
2254
2255 // We have the address of an on stack replacement routine in rax.
2256 // In preparation of invoking it, first we must migrate the locals
2257 // and monitors from off the interpreter frame on the stack.
2258 // Ensure to save the osr nmethod over the migration call,
2259 // it will be preserved in rbx.
2260 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2260, _masm)->
mov(rbx, rax);
2261
2262 NOT_LP64(__ get_thread(rcx));
2263
2264 call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin)((address)((address_word)(SharedRuntime::OSR_migration_begin)
))
);
2265
2266 // rax is OSR buffer, move it to expected parameter location
2267 LP64_ONLY(__ mov(j_rarg0, rax))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2267, _masm)-> mov(j_rarg0, rax)
;
2268 NOT_LP64(__ mov(rcx, rax));
2269 // We use j_rarg definitions here so that registers don't conflict as parameter
2270 // registers change across platforms as we are in the midst of a calling
2271 // sequence to the OSR nmethod and we don't want collision. These are NOT parameters.
2272
2273 const Register retaddr = LP64_ONLY(j_rarg2)j_rarg2 NOT_LP64(rdi);
2274 const Register sender_sp = LP64_ONLY(j_rarg1)j_rarg1 NOT_LP64(rdx);
2275
2276 // pop the interpreter frame
2277 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2277, _masm)->
movptr(sender_sp, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); // get sender sp
2278 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2278, _masm)->
leave(); // remove frame anchor
2279 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2279, _masm)->
pop(retaddr); // get return address
2280 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2280, _masm)->
mov(rsp, sender_sp); // set sp to sender sp
2281 // Ensure compiled code always sees stack at proper alignment
2282 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2282, _masm)->
andptr(rsp, -(StackAlignmentInBytes));
2283
2284 // unlike x86 we need no specialized return from compiled code
2285 // to the interpreter or the call stub.
2286
2287 // push the return address
2288 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2288, _masm)->
push(retaddr);
2289
2290 // and begin the OSR nmethod
2291 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2291, _masm)->
jmp(Address(rbx, nmethod::osr_entry_point_offset()));
2292 }
2293 }
2294}
2295
2296void TemplateTable::if_0cmp(Condition cc) {
2297 transition(itos, vtos);
2298 // assume branch is more often taken than not (loops use backward branches)
2299 Label not_taken;
2300 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2300, _masm)->
testl(rax, rax);
2301 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2301, _masm)->
jcc(j_not(cc), not_taken);
2302 branch(false, false);
2303 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2303, _masm)->
bind(not_taken);
2304 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2304, _masm)->
profile_not_taken_branch(rax);
2305}
2306
2307void TemplateTable::if_icmp(Condition cc) {
2308 transition(itos, vtos);
2309 // assume branch is more often taken than not (loops use backward branches)
2310 Label not_taken;
2311 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2311, _masm)->
pop_i(rdx);
2312 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2312, _masm)->
cmpl(rdx, rax);
2313 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2313, _masm)->
jcc(j_not(cc), not_taken);
2314 branch(false, false);
2315 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2315, _masm)->
bind(not_taken);
2316 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2316, _masm)->
profile_not_taken_branch(rax);
2317}
2318
2319void TemplateTable::if_nullcmp(Condition cc) {
2320 transition(atos, vtos);
2321 // assume branch is more often taken than not (loops use backward branches)
2322 Label not_taken;
2323 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2323, _masm)->
testptr(rax, rax);
2324 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2324, _masm)->
jcc(j_not(cc), not_taken);
2325 branch(false, false);
2326 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2326, _masm)->
bind(not_taken);
2327 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2327, _masm)->
profile_not_taken_branch(rax);
2328}
2329
2330void TemplateTable::if_acmp(Condition cc) {
2331 transition(atos, vtos);
2332 // assume branch is more often taken than not (loops use backward branches)
2333 Label not_taken;
2334 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2334, _masm)->
pop_ptr(rdx);
2335 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2335, _masm)->
cmpoop(rdx, rax);
2336 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2336, _masm)->
jcc(j_not(cc), not_taken);
2337 branch(false, false);
2338 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2338, _masm)->
bind(not_taken);
2339 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2339, _masm)->
profile_not_taken_branch(rax);
2340}
2341
2342void TemplateTable::ret() {
2343 transition(vtos, vtos);
2344 locals_index(rbx);
2345 LP64_ONLY(__ movslq(rbx, iaddress(rbx)))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2345, _masm)-> movslq(rbx, iaddress(rbx))
; // get return bci, compute return bcp
2346 NOT_LP64(__ movptr(rbx, iaddress(rbx)));
2347 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2347, _masm)->
profile_ret(rbx, rcx);
2348 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2348, _masm)->
get_method(rax);
2349 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2349, _masm)->
movptr(rbcp, Address(rax, Method::const_offset()));
2350 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2350, _masm)->
lea(rbcp, Address(rbcp, rbx, Address::times_1,
2351 ConstMethod::codes_offset()));
2352 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2352, _masm)->
dispatch_next(vtos, 0, true);
2353}
2354
2355void TemplateTable::wide_ret() {
2356 transition(vtos, vtos);
2357 locals_index_wide(rbx);
2358 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2358, _masm)->
movptr(rbx, aaddress(rbx)); // get return bci, compute return bcp
2359 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2359, _masm)->
profile_ret(rbx, rcx);
2360 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2360, _masm)->
get_method(rax);
2361 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2361, _masm)->
movptr(rbcp, Address(rax, Method::const_offset()));
2362 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2362, _masm)->
lea(rbcp, Address(rbcp, rbx, Address::times_1, ConstMethod::codes_offset()));
2363 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2363, _masm)->
dispatch_next(vtos, 0, true);
2364}
2365
2366void TemplateTable::tableswitch() {
2367 Label default_case, continue_execution;
2368 transition(itos, vtos);
2369
2370 // align r13/rsi
2371 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2371, _masm)->
lea(rbx, at_bcp(BytesPerInt));
2372 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2372, _masm)->
andptr(rbx, -BytesPerInt);
2373 // load lo & hi
2374 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2374, _masm)->
movl(rcx, Address(rbx, BytesPerInt));
2375 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2375, _masm)->
movl(rdx, Address(rbx, 2 * BytesPerInt));
2376 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2376, _masm)->
bswapl(rcx);
2377 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2377, _masm)->
bswapl(rdx);
2378 // check against lo & hi
2379 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2379, _masm)->
cmpl(rax, rcx);
2380 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2380, _masm)->
jcc(Assembler::less, default_case);
2381 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2381, _masm)->
cmpl(rax, rdx);
2382 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2382, _masm)->
jcc(Assembler::greater, default_case);
2383 // lookup dispatch offset
2384 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2384, _masm)->
subl(rax, rcx);
2385 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2385, _masm)->
movl(rdx, Address(rbx, rax, Address::times_4, 3 * BytesPerInt));
2386 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2386, _masm)->
profile_switch_case(rax, rbx, rcx);
2387 // continue execution
2388 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2388, _masm)->
bind(continue_execution);
2389 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2389, _masm)->
bswapl(rdx);
2390 LP64_ONLY(__ movl2ptr(rdx, rdx))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2390, _masm)-> movl2ptr(rdx, rdx)
;
2391 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2391, _masm)->
load_unsigned_byte(rbx, Address(rbcp, rdx, Address::times_1));
2392 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2392, _masm)->
addptr(rbcp, rdx);
2393 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2393, _masm)->
dispatch_only(vtos, true);
2394 // handle default
2395 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2395, _masm)->
bind(default_case);
2396 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2396, _masm)->
profile_switch_default(rax);
2397 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2397, _masm)->
movl(rdx, Address(rbx, 0));
2398 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2398, _masm)->
jmp(continue_execution);
2399}
2400
2401void TemplateTable::lookupswitch() {
2402 transition(itos, itos);
2403 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2403, _masm)->
stop("lookupswitch bytecode should have been rewritten");
2404}
2405
2406void TemplateTable::fast_linearswitch() {
2407 transition(itos, vtos);
2408 Label loop_entry, loop, found, continue_execution;
2409 // bswap rax so we can avoid bswapping the table entries
2410 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2410, _masm)->
bswapl(rax);
2411 // align r13
2412 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2412, _masm)->
lea(rbx, at_bcp(BytesPerInt)); // btw: should be able to get rid of
2413 // this instruction (change offsets
2414 // below)
2415 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2415, _masm)->
andptr(rbx, -BytesPerInt);
2416 // set counter
2417 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2417, _masm)->
movl(rcx, Address(rbx, BytesPerInt));
2418 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2418, _masm)->
bswapl(rcx);
2419 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2419, _masm)->
jmpb(loop_entry)jmpb_0(loop_entry, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2419)
;
2420 // table search
2421 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2421, _masm)->
bind(loop);
2422 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2422, _masm)->
cmpl(rax, Address(rbx, rcx, Address::times_8, 2 * BytesPerInt));
2423 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2423, _masm)->
jcc(Assembler::equal, found);
2424 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2424, _masm)->
bind(loop_entry);
2425 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2425, _masm)->
decrementl(rcx);
2426 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2426, _masm)->
jcc(Assembler::greaterEqual, loop);
2427 // default case
2428 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2428, _masm)->
profile_switch_default(rax);
2429 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2429, _masm)->
movl(rdx, Address(rbx, 0));
2430 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2430, _masm)->
jmp(continue_execution);
2431 // entry found -> get offset
2432 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2432, _masm)->
bind(found);
2433 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2433, _masm)->
movl(rdx, Address(rbx, rcx, Address::times_8, 3 * BytesPerInt));
2434 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2434, _masm)->
profile_switch_case(rcx, rax, rbx);
2435 // continue execution
2436 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2436, _masm)->
bind(continue_execution);
2437 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2437, _masm)->
bswapl(rdx);
2438 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2438, _masm)->
movl2ptr(rdx, rdx);
2439 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2439, _masm)->
load_unsigned_byte(rbx, Address(rbcp, rdx, Address::times_1));
2440 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2440, _masm)->
addptr(rbcp, rdx);
2441 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2441, _masm)->
dispatch_only(vtos, true);
2442}
2443
2444void TemplateTable::fast_binaryswitch() {
2445 transition(itos, vtos);
2446 // Implementation using the following core algorithm:
2447 //
2448 // int binary_search(int key, LookupswitchPair* array, int n) {
2449 // // Binary search according to "Methodik des Programmierens" by
2450 // // Edsger W. Dijkstra and W.H.J. Feijen, Addison Wesley Germany 1985.
2451 // int i = 0;
2452 // int j = n;
2453 // while (i+1 < j) {
2454 // // invariant P: 0 <= i < j <= n and (a[i] <= key < a[j] or Q)
2455 // // with Q: for all i: 0 <= i < n: key < a[i]
2456 // // where a stands for the array and assuming that the (inexisting)
2457 // // element a[n] is infinitely big.
2458 // int h = (i + j) >> 1;
2459 // // i < h < j
2460 // if (key < array[h].fast_match()) {
2461 // j = h;
2462 // } else {
2463 // i = h;
2464 // }
2465 // }
2466 // // R: a[i] <= key < a[i+1] or Q
2467 // // (i.e., if key is within array, i is the correct index)
2468 // return i;
2469 // }
2470
2471 // Register allocation
2472 const Register key = rax; // already set (tosca)
2473 const Register array = rbx;
2474 const Register i = rcx;
2475 const Register j = rdx;
2476 const Register h = rdi;
2477 const Register temp = rsi;
2478
2479 // Find array start
2480 NOT_LP64(__ save_bcp());
2481
2482 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2482, _masm)->
lea(array, at_bcp(3 * BytesPerInt)); // btw: should be able to
2483 // get rid of this
2484 // instruction (change
2485 // offsets below)
2486 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2486, _masm)->
andptr(array, -BytesPerInt);
2487
2488 // Initialize i & j
2489 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2489, _masm)->
xorl(i, i); // i = 0;
2490 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2490, _masm)->
movl(j, Address(array, -BytesPerInt)); // j = length(array);
2491
2492 // Convert j into native byteordering
2493 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2493, _masm)->
bswapl(j);
2494
2495 // And start
2496 Label entry;
2497 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2497, _masm)->
jmp(entry);
2498
2499 // binary search loop
2500 {
2501 Label loop;
2502 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2502, _masm)->
bind(loop);
2503 // int h = (i + j) >> 1;
2504 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2504, _masm)->
leal(h, Address(i, j, Address::times_1)); // h = i + j;
2505 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2505, _masm)->
sarl(h, 1); // h = (i + j) >> 1;
2506 // if (key < array[h].fast_match()) {
2507 // j = h;
2508 // } else {
2509 // i = h;
2510 // }
2511 // Convert array[h].match to native byte-ordering before compare
2512 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2512, _masm)->
movl(temp, Address(array, h, Address::times_8));
2513 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2513, _masm)->
bswapl(temp);
2514 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2514, _masm)->
cmpl(key, temp);
2515 // j = h if (key < array[h].fast_match())
2516 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2516, _masm)->
cmov32(Assembler::less, j, h);
2517 // i = h if (key >= array[h].fast_match())
2518 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2518, _masm)->
cmov32(Assembler::greaterEqual, i, h);
2519 // while (i+1 < j)
2520 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2520, _masm)->
bind(entry);
2521 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2521, _masm)->
leal(h, Address(i, 1)); // i+1
2522 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2522, _masm)->
cmpl(h, j); // i+1 < j
2523 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2523, _masm)->
jcc(Assembler::less, loop);
2524 }
2525
2526 // end of binary search, result index is i (must check again!)
2527 Label default_case;
2528 // Convert array[i].match to native byte-ordering before compare
2529 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2529, _masm)->
movl(temp, Address(array, i, Address::times_8));
2530 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2530, _masm)->
bswapl(temp);
2531 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2531, _masm)->
cmpl(key, temp);
2532 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2532, _masm)->
jcc(Assembler::notEqual, default_case);
2533
2534 // entry found -> j = offset
2535 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2535, _masm)->
movl(j , Address(array, i, Address::times_8, BytesPerInt));
2536 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2536, _masm)->
profile_switch_case(i, key, array);
2537 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2537, _masm)->
bswapl(j);
2538 LP64_ONLY(__ movslq(j, j))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2538, _masm)-> movslq(j, j)
;
2539
2540 NOT_LP64(__ restore_bcp());
2541 NOT_LP64(__ restore_locals()); // restore rdi
2542
2543 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2543, _masm)->
load_unsigned_byte(rbx, Address(rbcp, j, Address::times_1));
2544 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2544, _masm)->
addptr(rbcp, j);
2545 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2545, _masm)->
dispatch_only(vtos, true);
2546
2547 // default case -> j = default offset
2548 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2548, _masm)->
bind(default_case);
2549 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2549, _masm)->
profile_switch_default(i);
2550 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2550, _masm)->
movl(j, Address(array, -2 * BytesPerInt));
2551 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2551, _masm)->
bswapl(j);
2552 LP64_ONLY(__ movslq(j, j))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2552, _masm)-> movslq(j, j)
;
2553
2554 NOT_LP64(__ restore_bcp());
2555 NOT_LP64(__ restore_locals());
2556
2557 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2557, _masm)->
load_unsigned_byte(rbx, Address(rbcp, j, Address::times_1));
2558 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2558, _masm)->
addptr(rbcp, j);
2559 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2559, _masm)->
dispatch_only(vtos, true);
2560}
2561
2562void TemplateTable::_return(TosState state) {
2563 transition(state, state);
2564
2565 assert(_desc->calls_vm(),do { if (!(_desc->calls_vm())) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2566, "assert(" "_desc->calls_vm()" ") failed", "inconsistent calls_vm information"
); ::breakpoint(); } } while (0)
2566 "inconsistent calls_vm information")do { if (!(_desc->calls_vm())) { (*g_assert_poison) = 'X';
; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2566, "assert(" "_desc->calls_vm()" ") failed", "inconsistent calls_vm information"
); ::breakpoint(); } } while (0)
; // call in remove_activation
2567
2568 if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
2569 assert(state == vtos, "only valid state")do { if (!(state == vtos)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2569, "assert(" "state == vtos" ") failed", "only valid state"
); ::breakpoint(); } } while (0)
;
2570 Register robj = LP64_ONLY(c_rarg1)c_rarg1 NOT_LP64(rax);
2571 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2571, _masm)->
movptr(robj, aaddress(0));
2572 Register tmp_load_klass = LP64_ONLY(rscratch1)rscratch1 NOT_LP64(noreg);
2573 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2573, _masm)->
load_klass(rdi, robj, tmp_load_klass);
2574 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2574, _masm)->
movl(rdi, Address(rdi, Klass::access_flags_offset()));
2575 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2575, _masm)->
testl(rdi, JVM_ACC_HAS_FINALIZER);
2576 Label skip_register_finalizer;
2577 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2577, _masm)->
jcc(Assembler::zero, skip_register_finalizer);
2578
2579 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2579, _masm)->
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer)((address)((address_word)(InterpreterRuntime::register_finalizer
)))
, robj);
2580
2581 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2581, _masm)->
bind(skip_register_finalizer);
2582 }
2583
2584 if (_desc->bytecode() != Bytecodes::_return_register_finalizer) {
2585 Label no_safepoint;
2586 NOT_PRODUCT(__ block_comment("Thread-local Safepoint poll"))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2586, _masm)-> block_comment("Thread-local Safepoint poll"
)
;
2587#ifdef _LP641
2588 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2588, _masm)->
testb(Address(r15_thread, JavaThread::polling_word_offset()), SafepointMechanism::poll_bit());
2589#else
2590 const Register thread = rdi;
2591 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2591, _masm)->
get_thread(thread);
2592 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2592, _masm)->
testb(Address(thread, JavaThread::polling_word_offset()), SafepointMechanism::poll_bit());
2593#endif
2594 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2594, _masm)->
jcc(Assembler::zero, no_safepoint);
2595 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2595, _masm)->
push(state);
2596 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2596, _masm)->
call_VM(noreg, CAST_FROM_FN_PTR(address,((address)((address_word)(InterpreterRuntime::at_safepoint)))
2597 InterpreterRuntime::at_safepoint)((address)((address_word)(InterpreterRuntime::at_safepoint))));
2598 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2598, _masm)->
pop(state);
2599 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2599, _masm)->
bind(no_safepoint);
2600 }
2601
2602 // Narrow result if state is itos but result type is smaller.
2603 // Need to narrow in the return bytecode rather than in generate_return_entry
2604 // since compiled code callers expect the result to already be narrowed.
2605 if (state == itos) {
2606 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2606, _masm)->
narrow(rax);
2607 }
2608 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2608, _masm)->
remove_activation(state, rbcp);
2609
2610 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2610, _masm)->
jmp(rbcp);
2611}
2612
2613// ----------------------------------------------------------------------------
2614// Volatile variables demand their effects be made known to all CPU's
2615// in order. Store buffers on most chips allow reads & writes to
2616// reorder; the JMM's ReadAfterWrite.java test fails in -Xint mode
2617// without some kind of memory barrier (i.e., it's not sufficient that
2618// the interpreter does not reorder volatile references, the hardware
2619// also must not reorder them).
2620//
2621// According to the new Java Memory Model (JMM):
2622// (1) All volatiles are serialized wrt to each other. ALSO reads &
2623// writes act as aquire & release, so:
2624// (2) A read cannot let unrelated NON-volatile memory refs that
2625// happen after the read float up to before the read. It's OK for
2626// non-volatile memory refs that happen before the volatile read to
2627// float down below it.
2628// (3) Similar a volatile write cannot let unrelated NON-volatile
2629// memory refs that happen BEFORE the write float down to after the
2630// write. It's OK for non-volatile memory refs that happen after the
2631// volatile write to float up before it.
2632//
2633// We only put in barriers around volatile refs (they are expensive),
2634// not _between_ memory refs (that would require us to track the
2635// flavor of the previous memory refs). Requirements (2) and (3)
2636// require some barriers before volatile stores and after volatile
2637// loads. These nearly cover requirement (1) but miss the
2638// volatile-store-volatile-load case. This final case is placed after
2639// volatile-stores although it could just as well go before
2640// volatile-loads.
2641
2642void TemplateTable::volatile_barrier(Assembler::Membar_mask_bits order_constraint ) {
2643 // Helper function to insert a is-volatile test and memory barrier
2644 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2644, _masm)->
membar(order_constraint);
2645}
2646
2647void TemplateTable::resolve_cache_and_index(int byte_no,
2648 Register cache,
2649 Register index,
2650 size_t index_size) {
2651 const Register temp = rbx;
2652 assert_different_registers(cache, index, temp);
2653
2654 Label L_clinit_barrier_slow;
2655 Label resolved;
2656
2657 Bytecodes::Code code = bytecode();
2658 switch (code) {
2659 case Bytecodes::_nofast_getfield: code = Bytecodes::_getfield; break;
2660 case Bytecodes::_nofast_putfield: code = Bytecodes::_putfield; break;
2661 default: break;
2662 }
2663
2664 assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range")do { if (!(byte_no == f1_byte || byte_no == f2_byte)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2664, "assert(" "byte_no == f1_byte || byte_no == f2_byte" ") failed"
, "byte_no out of range"); ::breakpoint(); } } while (0)
;
2665 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2665, _masm)->
get_cache_and_index_and_bytecode_at_bcp(cache, index, temp, byte_no, 1, index_size);
2666 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2666, _masm)->
cmpl(temp, code); // have we resolved this bytecode?
2667 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2667, _masm)->
jcc(Assembler::equal, resolved);
2668
2669 // resolve first time through
2670 // Class initialization barrier slow path lands here as well.
2671 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2671, _masm)->
bind(L_clinit_barrier_slow);
2672 address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache)((address)((address_word)(InterpreterRuntime::resolve_from_cache
)))
;
2673 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2673, _masm)->
movl(temp, code);
2674 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2674, _masm)->
call_VM(noreg, entry, temp);
2675 // Update registers with resolved info
2676 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2676, _masm)->
get_cache_and_index_at_bcp(cache, index, 1, index_size);
2677
2678 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2678, _masm)->
bind(resolved);
2679
2680 // Class initialization barrier for static methods
2681 if (VM_Version::supports_fast_class_init_checks() && bytecode() == Bytecodes::_invokestatic) {
2682 const Register method = temp;
2683 const Register klass = temp;
2684 const Register thread = LP64_ONLY(r15_thread)r15_thread NOT_LP64(noreg);
2685 assert(thread != noreg, "x86_32 not supported")do { if (!(thread != noreg)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2685, "assert(" "thread != noreg" ") failed", "x86_32 not supported"
); ::breakpoint(); } } while (0)
;
2686
2687 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2687, _masm)->
load_resolved_method_at_index(byte_no, method, cache, index);
2688 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2688, _masm)->
load_method_holder(klass, method);
2689 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2689, _masm)->
clinit_barrier(klass, thread, NULL__null /*L_fast_path*/, &L_clinit_barrier_slow);
2690 }
2691}
2692
2693// The cache and index registers must be set before call
2694void TemplateTable::load_field_cp_cache_entry(Register obj,
2695 Register cache,
2696 Register index,
2697 Register off,
2698 Register flags,
2699 bool is_static = false) {
2700 assert_different_registers(cache, index, flags, off);
2701
2702 ByteSize cp_base_offset = ConstantPoolCache::base_offset();
2703 // Field offset
2704 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2704, _masm)->
movptr(off, Address(cache, index, Address::times_ptr,
2705 in_bytes(cp_base_offset +
2706 ConstantPoolCacheEntry::f2_offset())));
2707 // Flags
2708 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2708, _masm)->
movl(flags, Address(cache, index, Address::times_ptr,
2709 in_bytes(cp_base_offset +
2710 ConstantPoolCacheEntry::flags_offset())));
2711
2712 // klass overwrite register
2713 if (is_static) {
2714 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2714, _masm)->
movptr(obj, Address(cache, index, Address::times_ptr,
2715 in_bytes(cp_base_offset +
2716 ConstantPoolCacheEntry::f1_offset())));
2717 const int mirror_offset = in_bytes(Klass::java_mirror_offset());
2718 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2718, _masm)->
movptr(obj, Address(obj, mirror_offset));
2719 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2719, _masm)->
resolve_oop_handle(obj);
2720 }
2721}
2722
2723void TemplateTable::load_invoke_cp_cache_entry(int byte_no,
2724 Register method,
2725 Register itable_index,
2726 Register flags,
2727 bool is_invokevirtual,
2728 bool is_invokevfinal, /*unused*/
2729 bool is_invokedynamic) {
2730 // setup registers
2731 const Register cache = rcx;
2732 const Register index = rdx;
2733 assert_different_registers(method, flags);
2734 assert_different_registers(method, cache, index);
2735 assert_different_registers(itable_index, flags);
2736 assert_different_registers(itable_index, cache, index);
2737 // determine constant pool cache field offsets
2738 assert(is_invokevirtual == (byte_no == f2_byte), "is_invokevirtual flag redundant")do { if (!(is_invokevirtual == (byte_no == f2_byte))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2738, "assert(" "is_invokevirtual == (byte_no == f2_byte)" ") failed"
, "is_invokevirtual flag redundant"); ::breakpoint(); } } while
(0)
;
2739 const int flags_offset = in_bytes(ConstantPoolCache::base_offset() +
2740 ConstantPoolCacheEntry::flags_offset());
2741 // access constant pool cache fields
2742 const int index_offset = in_bytes(ConstantPoolCache::base_offset() +
2743 ConstantPoolCacheEntry::f2_offset());
2744
2745 size_t index_size = (is_invokedynamic ? sizeof(u4) : sizeof(u2));
2746 resolve_cache_and_index(byte_no, cache, index, index_size);
2747 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2747, _masm)->
load_resolved_method_at_index(byte_no, method, cache, index);
2748
2749 if (itable_index != noreg) {
2750 // pick up itable or appendix index from f2 also:
2751 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2751, _masm)->
movptr(itable_index, Address(cache, index, Address::times_ptr, index_offset));
2752 }
2753 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2753, _masm)->
movl(flags, Address(cache, index, Address::times_ptr, flags_offset));
2754}
2755
2756// The registers cache and index expected to be set before call.
2757// Correct values of the cache and index registers are preserved.
2758void TemplateTable::jvmti_post_field_access(Register cache,
2759 Register index,
2760 bool is_static,
2761 bool has_tos) {
2762 if (JvmtiExport::can_post_field_access()) {
2763 // Check to see if a field access watch has been set before we take
2764 // the time to call into the VM.
2765 Label L1;
2766 assert_different_registers(cache, index, rax);
2767 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2767, _masm)->
mov32(rax, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
2768 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2768, _masm)->
testl(rax,rax);
2769 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2769, _masm)->
jcc(Assembler::zero, L1);
2770
2771 // cache entry pointer
2772 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2772, _masm)->
addptr(cache, in_bytes(ConstantPoolCache::base_offset()));
2773 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2773, _masm)->
shll(index, LogBytesPerWord);
2774 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2774, _masm)->
addptr(cache, index);
2775 if (is_static) {
2776 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2776, _masm)->
xorptr(rax, rax); // NULL object reference
2777 } else {
2778 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2778, _masm)->
pop(atos); // Get the object
2779 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2779, _masm)->
verify_oop(rax)_verify_oop_checked(rax, "broken oop " "rax", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2779)
;
2780 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2780, _masm)->
push(atos); // Restore stack state
2781 }
2782 // rax,: object pointer or NULL
2783 // cache: cache entry pointer
2784 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2784, _masm)->
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access)((address)((address_word)(InterpreterRuntime::post_field_access
)))
,
2785 rax, cache);
2786 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2786, _masm)->
get_cache_and_index_at_bcp(cache, index, 1);
2787 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2787, _masm)->
bind(L1);
2788 }
2789}
2790
2791void TemplateTable::pop_and_check_object(Register r) {
2792 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2792, _masm)->
pop_ptr(r);
2793 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2793, _masm)->
null_check(r); // for field access must check obj.
2794 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2794, _masm)->
verify_oop(r)_verify_oop_checked(r, "broken oop " "r", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2794)
;
2795}
2796
2797void TemplateTable::getfield_or_static(int byte_no, bool is_static, RewriteControl rc) {
2798 transition(vtos, vtos);
2799
2800 const Register cache = rcx;
2801 const Register index = rdx;
2802 const Register obj = LP64_ONLY(c_rarg3)c_rarg3 NOT_LP64(rcx);
2803 const Register off = rbx;
2804 const Register flags = rax;
2805 const Register bc = LP64_ONLY(c_rarg3)c_rarg3 NOT_LP64(rcx); // uses same reg as obj, so don't mix them
2806
2807 resolve_cache_and_index(byte_no, cache, index, sizeof(u2));
2808 jvmti_post_field_access(cache, index, is_static, false);
2809 load_field_cp_cache_entry(obj, cache, index, off, flags, is_static);
2810
2811 if (!is_static) pop_and_check_object(obj);
2812
2813 const Address field(obj, off, Address::times_1, 0*wordSize);
2814
2815 Label Done, notByte, notBool, notInt, notShort, notChar, notLong, notFloat, notObj;
2816
2817 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2817, _masm)->
shrl(flags, ConstantPoolCacheEntry::tos_state_shift);
2818 // Make sure we don't need to mask edx after the above shift
2819 assert(btos == 0, "change code, btos != 0")do { if (!(btos == 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2819, "assert(" "btos == 0" ") failed", "change code, btos != 0"
); ::breakpoint(); } } while (0)
;
2820
2821 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2821, _masm)->
andl(flags, ConstantPoolCacheEntry::tos_state_mask);
2822
2823 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2823, _masm)->
jcc(Assembler::notZero, notByte);
2824 // btos
2825 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2825, _masm)->
access_load_at(T_BYTE, IN_HEAP, rax, field, noreg, noreg);
2826 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2826, _masm)->
push(btos);
2827 // Rewrite bytecode to be faster
2828 if (!is_static && rc == may_rewrite) {
2829 patch_bytecode(Bytecodes::_fast_bgetfield, bc, rbx);
2830 }
2831 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2831, _masm)->
jmp(Done);
2832
2833 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2833, _masm)->
bind(notByte);
2834 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2834, _masm)->
cmpl(flags, ztos);
2835 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2835, _masm)->
jcc(Assembler::notEqual, notBool);
2836
2837 // ztos (same code as btos)
2838 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2838, _masm)->
access_load_at(T_BOOLEAN, IN_HEAP, rax, field, noreg, noreg);
2839 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2839, _masm)->
push(ztos);
2840 // Rewrite bytecode to be faster
2841 if (!is_static && rc == may_rewrite) {
2842 // use btos rewriting, no truncating to t/f bit is needed for getfield.
2843 patch_bytecode(Bytecodes::_fast_bgetfield, bc, rbx);
2844 }
2845 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2845, _masm)->
jmp(Done);
2846
2847 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2847, _masm)->
bind(notBool);
2848 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2848, _masm)->
cmpl(flags, atos);
2849 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2849, _masm)->
jcc(Assembler::notEqual, notObj);
2850 // atos
2851 do_oop_load(_masm, field, rax);
2852 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2852, _masm)->
push(atos);
2853 if (!is_static && rc == may_rewrite) {
2854 patch_bytecode(Bytecodes::_fast_agetfield, bc, rbx);
2855 }
2856 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2856, _masm)->
jmp(Done);
2857
2858 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2858, _masm)->
bind(notObj);
2859 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2859, _masm)->
cmpl(flags, itos);
2860 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2860, _masm)->
jcc(Assembler::notEqual, notInt);
2861 // itos
2862 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2862, _masm)->
access_load_at(T_INT, IN_HEAP, rax, field, noreg, noreg);
2863 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2863, _masm)->
push(itos);
2864 // Rewrite bytecode to be faster
2865 if (!is_static && rc == may_rewrite) {
2866 patch_bytecode(Bytecodes::_fast_igetfield, bc, rbx);
2867 }
2868 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2868, _masm)->
jmp(Done);
2869
2870 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2870, _masm)->
bind(notInt);
2871 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2871, _masm)->
cmpl(flags, ctos);
2872 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2872, _masm)->
jcc(Assembler::notEqual, notChar);
2873 // ctos
2874 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2874, _masm)->
access_load_at(T_CHAR, IN_HEAP, rax, field, noreg, noreg);
2875 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2875, _masm)->
push(ctos);
2876 // Rewrite bytecode to be faster
2877 if (!is_static && rc == may_rewrite) {
2878 patch_bytecode(Bytecodes::_fast_cgetfield, bc, rbx);
2879 }
2880 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2880, _masm)->
jmp(Done);
2881
2882 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2882, _masm)->
bind(notChar);
2883 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2883, _masm)->
cmpl(flags, stos);
2884 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2884, _masm)->
jcc(Assembler::notEqual, notShort);
2885 // stos
2886 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2886, _masm)->
access_load_at(T_SHORT, IN_HEAP, rax, field, noreg, noreg);
2887 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2887, _masm)->
push(stos);
2888 // Rewrite bytecode to be faster
2889 if (!is_static && rc == may_rewrite) {
2890 patch_bytecode(Bytecodes::_fast_sgetfield, bc, rbx);
2891 }
2892 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2892, _masm)->
jmp(Done);
2893
2894 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2894, _masm)->
bind(notShort);
2895 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2895, _masm)->
cmpl(flags, ltos);
2896 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2896, _masm)->
jcc(Assembler::notEqual, notLong);
2897 // ltos
2898 // Generate code as if volatile (x86_32). There just aren't enough registers to
2899 // save that information and this code is faster than the test.
2900 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2900, _masm)->
access_load_at(T_LONG, IN_HEAP | MO_RELAXED, noreg /* ltos */, field, noreg, noreg);
2901 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2901, _masm)->
push(ltos);
2902 // Rewrite bytecode to be faster
2903 LP64_ONLY(if (!is_static && rc == may_rewrite) patch_bytecode(Bytecodes::_fast_lgetfield, bc, rbx))if (!is_static && rc == may_rewrite) patch_bytecode(Bytecodes
::_fast_lgetfield, bc, rbx)
;
2904 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2904, _masm)->
jmp(Done);
2905
2906 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2906, _masm)->
bind(notLong);
2907 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2907, _masm)->
cmpl(flags, ftos);
2908 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2908, _masm)->
jcc(Assembler::notEqual, notFloat);
2909 // ftos
2910
2911 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2911, _masm)->
access_load_at(T_FLOAT, IN_HEAP, noreg /* ftos */, field, noreg, noreg);
2912 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2912, _masm)->
push(ftos);
2913 // Rewrite bytecode to be faster
2914 if (!is_static && rc == may_rewrite) {
2915 patch_bytecode(Bytecodes::_fast_fgetfield, bc, rbx);
2916 }
2917 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2917, _masm)->
jmp(Done);
2918
2919 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2919, _masm)->
bind(notFloat);
2920#ifdef ASSERT1
2921 Label notDouble;
2922 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2922, _masm)->
cmpl(flags, dtos);
2923 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2923, _masm)->
jcc(Assembler::notEqual, notDouble);
2924#endif
2925 // dtos
2926 // MO_RELAXED: for the case of volatile field, in fact it adds no extra work for the underlying implementation
2927 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2927, _masm)->
access_load_at(T_DOUBLE, IN_HEAP | MO_RELAXED, noreg /* dtos */, field, noreg, noreg);
2928 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2928, _masm)->
push(dtos);
2929 // Rewrite bytecode to be faster
2930 if (!is_static && rc == may_rewrite) {
2931 patch_bytecode(Bytecodes::_fast_dgetfield, bc, rbx);
2932 }
2933#ifdef ASSERT1
2934 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2934, _masm)->
jmp(Done);
2935
2936 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2936, _masm)->
bind(notDouble);
2937 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2937, _masm)->
stop("Bad state");
2938#endif
2939
2940 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2940, _masm)->
bind(Done);
2941 // [jk] not needed currently
2942 // volatile_barrier(Assembler::Membar_mask_bits(Assembler::LoadLoad |
2943 // Assembler::LoadStore));
2944}
2945
2946void TemplateTable::getfield(int byte_no) {
2947 getfield_or_static(byte_no, false);
2948}
2949
2950void TemplateTable::nofast_getfield(int byte_no) {
2951 getfield_or_static(byte_no, false, may_not_rewrite);
2952}
2953
2954void TemplateTable::getstatic(int byte_no) {
2955 getfield_or_static(byte_no, true);
2956}
2957
2958
2959// The registers cache and index expected to be set before call.
2960// The function may destroy various registers, just not the cache and index registers.
2961void TemplateTable::jvmti_post_field_mod(Register cache, Register index, bool is_static) {
2962
2963 const Register robj = LP64_ONLY(c_rarg2)c_rarg2 NOT_LP64(rax);
2964 const Register RBX = LP64_ONLY(c_rarg1)c_rarg1 NOT_LP64(rbx);
2965 const Register RCX = LP64_ONLY(c_rarg3)c_rarg3 NOT_LP64(rcx);
2966 const Register RDX = LP64_ONLY(rscratch1)rscratch1 NOT_LP64(rdx);
2967
2968 ByteSize cp_base_offset = ConstantPoolCache::base_offset();
2969
2970 if (JvmtiExport::can_post_field_modification()) {
2971 // Check to see if a field modification watch has been set before
2972 // we take the time to call into the VM.
2973 Label L1;
2974 assert_different_registers(cache, index, rax);
2975 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2975, _masm)->
mov32(rax, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr()));
2976 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2976, _masm)->
testl(rax, rax);
2977 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2977, _masm)->
jcc(Assembler::zero, L1);
2978
2979 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2979, _masm)->
get_cache_and_index_at_bcp(robj, RDX, 1);
2980
2981
2982 if (is_static) {
2983 // Life is simple. Null out the object pointer.
2984 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2984, _masm)->
xorl(RBX, RBX);
2985
2986 } else {
2987 // Life is harder. The stack holds the value on top, followed by
2988 // the object. We don't know the size of the value, though; it
2989 // could be one or two words depending on its type. As a result,
2990 // we must find the type to determine where the object is.
2991#ifndef _LP641
2992 Label two_word, valsize_known;
2993#endif
2994 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2994, _masm)->
movl(RCX, Address(robj, RDX,
2995 Address::times_ptr,
2996 in_bytes(cp_base_offset +
2997 ConstantPoolCacheEntry::flags_offset())));
2998 NOT_LP64(__ mov(rbx, rsp));
2999 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 2999, _masm)->
shrl(RCX, ConstantPoolCacheEntry::tos_state_shift);
3000
3001 // Make sure we don't need to mask rcx after the above shift
3002 ConstantPoolCacheEntry::verify_tos_state_shift();
3003#ifdef _LP641
3004 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3004, _masm)->
movptr(c_rarg1, at_tos_p1()); // initially assume a one word jvalue
3005 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3005, _masm)->
cmpl(c_rarg3, ltos);
3006 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3006, _masm)->
cmovptr(Assembler::equal,
3007 c_rarg1, at_tos_p2()); // ltos (two word jvalue)
3008 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3008, _masm)->
cmpl(c_rarg3, dtos);
3009 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3009, _masm)->
cmovptr(Assembler::equal,
3010 c_rarg1, at_tos_p2()); // dtos (two word jvalue)
3011#else
3012 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3012, _masm)->
cmpl(rcx, ltos);
3013 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3013, _masm)->
jccb(Assembler::equal, two_word)jccb_0(Assembler::equal, two_word, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3013)
;
3014 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3014, _masm)->
cmpl(rcx, dtos);
3015 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3015, _masm)->
jccb(Assembler::equal, two_word)jccb_0(Assembler::equal, two_word, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3015)
;
3016 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3016, _masm)->
addptr(rbx, Interpreter::expr_offset_in_bytes(1)); // one word jvalue (not ltos, dtos)
3017 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3017, _masm)->
jmpb(valsize_known)jmpb_0(valsize_known, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3017)
;
3018
3019 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3019, _masm)->
bind(two_word);
3020 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3020, _masm)->
addptr(rbx, Interpreter::expr_offset_in_bytes(2)); // two words jvalue
3021
3022 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3022, _masm)->
bind(valsize_known);
3023 // setup object pointer
3024 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3024, _masm)->
movptr(rbx, Address(rbx, 0));
3025#endif
3026 }
3027 // cache entry pointer
3028 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3028, _masm)->
addptr(robj, in_bytes(cp_base_offset));
3029 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3029, _masm)->
shll(RDX, LogBytesPerWord);
3030 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3030, _masm)->
addptr(robj, RDX);
3031 // object (tos)
3032 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3032, _masm)->
mov(RCX, rsp);
3033 // c_rarg1: object pointer set up above (NULL if static)
3034 // c_rarg2: cache entry pointer
3035 // c_rarg3: jvalue object on the stack
3036 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3036, _masm)->
call_VM(noreg,
3037 CAST_FROM_FN_PTR(address,((address)((address_word)(InterpreterRuntime::post_field_modification
)))
3038 InterpreterRuntime::post_field_modification)((address)((address_word)(InterpreterRuntime::post_field_modification
)))
,
3039 RBX, robj, RCX);
3040 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3040, _masm)->
get_cache_and_index_at_bcp(cache, index, 1);
3041 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3041, _masm)->
bind(L1);
3042 }
3043}
3044
3045void TemplateTable::putfield_or_static(int byte_no, bool is_static, RewriteControl rc) {
3046 transition(vtos, vtos);
3047
3048 const Register cache = rcx;
3049 const Register index = rdx;
3050 const Register obj = rcx;
3051 const Register off = rbx;
3052 const Register flags = rax;
3053
3054 resolve_cache_and_index(byte_no, cache, index, sizeof(u2));
3055 jvmti_post_field_mod(cache, index, is_static);
3056 load_field_cp_cache_entry(obj, cache, index, off, flags, is_static);
3057
3058 // [jk] not needed currently
3059 // volatile_barrier(Assembler::Membar_mask_bits(Assembler::LoadStore |
3060 // Assembler::StoreStore));
3061
3062 Label notVolatile, Done;
3063 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3063, _masm)->
movl(rdx, flags);
3064 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3064, _masm)->
shrl(rdx, ConstantPoolCacheEntry::is_volatile_shift);
3065 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3065, _masm)->
andl(rdx, 0x1);
3066
3067 // Check for volatile store
3068 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3068, _masm)->
testl(rdx, rdx);
3069 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3069, _masm)->
jcc(Assembler::zero, notVolatile);
3070
3071 putfield_or_static_helper(byte_no, is_static, rc, obj, off, flags);
3072 volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad |
3073 Assembler::StoreStore));
3074 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3074, _masm)->
jmp(Done);
3075 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3075, _masm)->
bind(notVolatile);
3076
3077 putfield_or_static_helper(byte_no, is_static, rc, obj, off, flags);
3078
3079 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3079, _masm)->
bind(Done);
3080}
3081
3082void TemplateTable::putfield_or_static_helper(int byte_no, bool is_static, RewriteControl rc,
3083 Register obj, Register off, Register flags) {
3084
3085 // field addresses
3086 const Address field(obj, off, Address::times_1, 0*wordSize);
3087 NOT_LP64( const Address hi(obj, off, Address::times_1, 1*wordSize);)
3088
3089 Label notByte, notBool, notInt, notShort, notChar,
3090 notLong, notFloat, notObj;
3091 Label Done;
3092
3093 const Register bc = LP64_ONLY(c_rarg3)c_rarg3 NOT_LP64(rcx);
3094
3095 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3095, _masm)->
shrl(flags, ConstantPoolCacheEntry::tos_state_shift);
3096
3097 assert(btos == 0, "change code, btos != 0")do { if (!(btos == 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3097, "assert(" "btos == 0" ") failed", "change code, btos != 0"
); ::breakpoint(); } } while (0)
;
3098 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3098, _masm)->
andl(flags, ConstantPoolCacheEntry::tos_state_mask);
3099 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3099, _masm)->
jcc(Assembler::notZero, notByte);
3100
3101 // btos
3102 {
3103 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3103, _masm)->
pop(btos);
3104 if (!is_static) pop_and_check_object(obj);
3105 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3105, _masm)->
access_store_at(T_BYTE, IN_HEAP, field, rax, noreg, noreg);
3106 if (!is_static && rc == may_rewrite) {
3107 patch_bytecode(Bytecodes::_fast_bputfield, bc, rbx, true, byte_no);
3108 }
3109 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3109, _masm)->
jmp(Done);
3110 }
3111
3112 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3112, _masm)->
bind(notByte);
3113 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3113, _masm)->
cmpl(flags, ztos);
3114 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3114, _masm)->
jcc(Assembler::notEqual, notBool);
3115
3116 // ztos
3117 {
3118 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3118, _masm)->
pop(ztos);
3119 if (!is_static) pop_and_check_object(obj);
3120 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3120, _masm)->
access_store_at(T_BOOLEAN, IN_HEAP, field, rax, noreg, noreg);
3121 if (!is_static && rc == may_rewrite) {
3122 patch_bytecode(Bytecodes::_fast_zputfield, bc, rbx, true, byte_no);
3123 }
3124 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3124, _masm)->
jmp(Done);
3125 }
3126
3127 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3127, _masm)->
bind(notBool);
3128 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3128, _masm)->
cmpl(flags, atos);
3129 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3129, _masm)->
jcc(Assembler::notEqual, notObj);
3130
3131 // atos
3132 {
3133 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3133, _masm)->
pop(atos);
3134 if (!is_static) pop_and_check_object(obj);
3135 // Store into the field
3136 do_oop_store(_masm, field, rax);
3137 if (!is_static && rc == may_rewrite) {
3138 patch_bytecode(Bytecodes::_fast_aputfield, bc, rbx, true, byte_no);
3139 }
3140 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3140, _masm)->
jmp(Done);
3141 }
3142
3143 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3143, _masm)->
bind(notObj);
3144 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3144, _masm)->
cmpl(flags, itos);
3145 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3145, _masm)->
jcc(Assembler::notEqual, notInt);
3146
3147 // itos
3148 {
3149 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3149, _masm)->
pop(itos);
3150 if (!is_static) pop_and_check_object(obj);
3151 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3151, _masm)->
access_store_at(T_INT, IN_HEAP, field, rax, noreg, noreg);
3152 if (!is_static && rc == may_rewrite) {
3153 patch_bytecode(Bytecodes::_fast_iputfield, bc, rbx, true, byte_no);
3154 }
3155 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3155, _masm)->
jmp(Done);
3156 }
3157
3158 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3158, _masm)->
bind(notInt);
3159 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3159, _masm)->
cmpl(flags, ctos);
3160 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3160, _masm)->
jcc(Assembler::notEqual, notChar);
3161
3162 // ctos
3163 {
3164 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3164, _masm)->
pop(ctos);
3165 if (!is_static) pop_and_check_object(obj);
3166 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3166, _masm)->
access_store_at(T_CHAR, IN_HEAP, field, rax, noreg, noreg);
3167 if (!is_static && rc == may_rewrite) {
3168 patch_bytecode(Bytecodes::_fast_cputfield, bc, rbx, true, byte_no);
3169 }
3170 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3170, _masm)->
jmp(Done);
3171 }
3172
3173 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3173, _masm)->
bind(notChar);
3174 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3174, _masm)->
cmpl(flags, stos);
3175 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3175, _masm)->
jcc(Assembler::notEqual, notShort);
3176
3177 // stos
3178 {
3179 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3179, _masm)->
pop(stos);
3180 if (!is_static) pop_and_check_object(obj);
3181 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3181, _masm)->
access_store_at(T_SHORT, IN_HEAP, field, rax, noreg, noreg);
3182 if (!is_static && rc == may_rewrite) {
3183 patch_bytecode(Bytecodes::_fast_sputfield, bc, rbx, true, byte_no);
3184 }
3185 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3185, _masm)->
jmp(Done);
3186 }
3187
3188 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3188, _masm)->
bind(notShort);
3189 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3189, _masm)->
cmpl(flags, ltos);
3190 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3190, _masm)->
jcc(Assembler::notEqual, notLong);
3191
3192 // ltos
3193 {
3194 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3194, _masm)->
pop(ltos);
3195 if (!is_static) pop_and_check_object(obj);
3196 // MO_RELAXED: generate atomic store for the case of volatile field (important for x86_32)
3197 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3197, _masm)->
access_store_at(T_LONG, IN_HEAP | MO_RELAXED, field, noreg /* ltos*/, noreg, noreg);
3198#ifdef _LP641
3199 if (!is_static && rc == may_rewrite) {
3200 patch_bytecode(Bytecodes::_fast_lputfield, bc, rbx, true, byte_no);
3201 }
3202#endif // _LP64
3203 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3203, _masm)->
jmp(Done);
3204 }
3205
3206 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3206, _masm)->
bind(notLong);
3207 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3207, _masm)->
cmpl(flags, ftos);
3208 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3208, _masm)->
jcc(Assembler::notEqual, notFloat);
3209
3210 // ftos
3211 {
3212 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3212, _masm)->
pop(ftos);
3213 if (!is_static) pop_and_check_object(obj);
3214 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3214, _masm)->
access_store_at(T_FLOAT, IN_HEAP, field, noreg /* ftos */, noreg, noreg);
3215 if (!is_static && rc == may_rewrite) {
3216 patch_bytecode(Bytecodes::_fast_fputfield, bc, rbx, true, byte_no);
3217 }
3218 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3218, _masm)->
jmp(Done);
3219 }
3220
3221 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3221, _masm)->
bind(notFloat);
3222#ifdef ASSERT1
3223 Label notDouble;
3224 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3224, _masm)->
cmpl(flags, dtos);
3225 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3225, _masm)->
jcc(Assembler::notEqual, notDouble);
3226#endif
3227
3228 // dtos
3229 {
3230 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3230, _masm)->
pop(dtos);
3231 if (!is_static) pop_and_check_object(obj);
3232 // MO_RELAXED: for the case of volatile field, in fact it adds no extra work for the underlying implementation
3233 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3233, _masm)->
access_store_at(T_DOUBLE, IN_HEAP | MO_RELAXED, field, noreg /* dtos */, noreg, noreg);
3234 if (!is_static && rc == may_rewrite) {
3235 patch_bytecode(Bytecodes::_fast_dputfield, bc, rbx, true, byte_no);
3236 }
3237 }
3238
3239#ifdef ASSERT1
3240 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3240, _masm)->
jmp(Done);
3241
3242 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3242, _masm)->
bind(notDouble);
3243 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3243, _masm)->
stop("Bad state");
3244#endif
3245
3246 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3246, _masm)->
bind(Done);
3247}
3248
3249void TemplateTable::putfield(int byte_no) {
3250 putfield_or_static(byte_no, false);
3251}
3252
3253void TemplateTable::nofast_putfield(int byte_no) {
3254 putfield_or_static(byte_no, false, may_not_rewrite);
3255}
3256
3257void TemplateTable::putstatic(int byte_no) {
3258 putfield_or_static(byte_no, true);
3259}
3260
3261void TemplateTable::jvmti_post_fast_field_mod() {
3262
3263 const Register scratch = LP64_ONLY(c_rarg3)c_rarg3 NOT_LP64(rcx);
3264
3265 if (JvmtiExport::can_post_field_modification()) {
3266 // Check to see if a field modification watch has been set before
3267 // we take the time to call into the VM.
3268 Label L2;
3269 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3269, _masm)->
mov32(scratch, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr()));
3270 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3270, _masm)->
testl(scratch, scratch);
3271 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3271, _masm)->
jcc(Assembler::zero, L2);
3272 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3272, _masm)->
pop_ptr(rbx); // copy the object pointer from tos
3273 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3273, _masm)->
verify_oop(rbx)_verify_oop_checked(rbx, "broken oop " "rbx", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3273)
;
3274 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3274, _masm)->
push_ptr(rbx); // put the object pointer back on tos
3275 // Save tos values before call_VM() clobbers them. Since we have
3276 // to do it for every data type, we use the saved values as the
3277 // jvalue object.
3278 switch (bytecode()) { // load values into the jvalue object
3279 case Bytecodes::_fast_aputfield: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3279, _masm)->
push_ptr(rax); break;
3280 case Bytecodes::_fast_bputfield: // fall through
3281 case Bytecodes::_fast_zputfield: // fall through
3282 case Bytecodes::_fast_sputfield: // fall through
3283 case Bytecodes::_fast_cputfield: // fall through
3284 case Bytecodes::_fast_iputfield: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3284, _masm)->
push_i(rax); break;
3285 case Bytecodes::_fast_dputfield: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3285, _masm)->
push(dtos); break;
3286 case Bytecodes::_fast_fputfield: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3286, _masm)->
push(ftos); break;
3287 case Bytecodes::_fast_lputfield: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3287, _masm)->
push_l(rax); break;
3288
3289 default:
3290 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3290); ::breakpoint(); } while (0)
;
3291 }
3292 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3292, _masm)->
mov(scratch, rsp); // points to jvalue on the stack
3293 // access constant pool cache entry
3294 LP64_ONLY(__ get_cache_entry_pointer_at_bcp(c_rarg2, rax, 1))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3294, _masm)-> get_cache_entry_pointer_at_bcp(c_rarg2, rax
, 1)
;
3295 NOT_LP64(__ get_cache_entry_pointer_at_bcp(rax, rdx, 1));
3296 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3296, _masm)->
verify_oop(rbx)_verify_oop_checked(rbx, "broken oop " "rbx", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3296)
;
3297 // rbx: object pointer copied above
3298 // c_rarg2: cache entry pointer
3299 // c_rarg3: jvalue object on the stack
3300 LP64_ONLY(__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification), rbx, c_rarg2, c_rarg3))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3300, _masm)-> call_VM(noreg, ((address)((address_word)(
InterpreterRuntime::post_field_modification))), rbx, c_rarg2,
c_rarg3)
;
3301 NOT_LP64(__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification), rbx, rax, rcx));
3302
3303 switch (bytecode()) { // restore tos values
3304 case Bytecodes::_fast_aputfield: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3304, _masm)->
pop_ptr(rax); break;
3305 case Bytecodes::_fast_bputfield: // fall through
3306 case Bytecodes::_fast_zputfield: // fall through
3307 case Bytecodes::_fast_sputfield: // fall through
3308 case Bytecodes::_fast_cputfield: // fall through
3309 case Bytecodes::_fast_iputfield: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3309, _masm)->
pop_i(rax); break;
3310 case Bytecodes::_fast_dputfield: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3310, _masm)->
pop(dtos); break;
3311 case Bytecodes::_fast_fputfield: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3311, _masm)->
pop(ftos); break;
3312 case Bytecodes::_fast_lputfield: __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3312, _masm)->
pop_l(rax); break;
3313 default: break;
3314 }
3315 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3315, _masm)->
bind(L2);
3316 }
3317}
3318
3319void TemplateTable::fast_storefield(TosState state) {
3320 transition(state, vtos);
3321
3322 ByteSize base = ConstantPoolCache::base_offset();
3323
3324 jvmti_post_fast_field_mod();
3325
3326 // access constant pool cache
3327 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3327, _masm)->
get_cache_and_index_at_bcp(rcx, rbx, 1);
3328
3329 // test for volatile with rdx but rdx is tos register for lputfield.
3330 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3330, _masm)->
movl(rdx, Address(rcx, rbx, Address::times_ptr,
3331 in_bytes(base +
3332 ConstantPoolCacheEntry::flags_offset())));
3333
3334 // replace index with field offset from cache entry
3335 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3335, _masm)->
movptr(rbx, Address(rcx, rbx, Address::times_ptr,
3336 in_bytes(base + ConstantPoolCacheEntry::f2_offset())));
3337
3338 // [jk] not needed currently
3339 // volatile_barrier(Assembler::Membar_mask_bits(Assembler::LoadStore |
3340 // Assembler::StoreStore));
3341
3342 Label notVolatile, Done;
3343 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3343, _masm)->
shrl(rdx, ConstantPoolCacheEntry::is_volatile_shift);
3344 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3344, _masm)->
andl(rdx, 0x1);
3345
3346 // Get object from stack
3347 pop_and_check_object(rcx);
3348
3349 // field address
3350 const Address field(rcx, rbx, Address::times_1);
3351
3352 // Check for volatile store
3353 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3353, _masm)->
testl(rdx, rdx);
3354 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3354, _masm)->
jcc(Assembler::zero, notVolatile);
3355
3356 fast_storefield_helper(field, rax);
3357 volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad |
3358 Assembler::StoreStore));
3359 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3359, _masm)->
jmp(Done);
3360 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3360, _masm)->
bind(notVolatile);
3361
3362 fast_storefield_helper(field, rax);
3363
3364 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3364, _masm)->
bind(Done);
3365}
3366
3367void TemplateTable::fast_storefield_helper(Address field, Register rax) {
3368
3369 // access field
3370 switch (bytecode()) {
3371 case Bytecodes::_fast_aputfield:
3372 do_oop_store(_masm, field, rax);
3373 break;
3374 case Bytecodes::_fast_lputfield:
3375#ifdef _LP641
3376 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3376, _masm)->
access_store_at(T_LONG, IN_HEAP, field, noreg /* ltos */, noreg, noreg);
3377#else
3378 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3378, _masm)->
stop("should not be rewritten");
3379#endif
3380 break;
3381 case Bytecodes::_fast_iputfield:
3382 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3382, _masm)->
access_store_at(T_INT, IN_HEAP, field, rax, noreg, noreg);
3383 break;
3384 case Bytecodes::_fast_zputfield:
3385 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3385, _masm)->
access_store_at(T_BOOLEAN, IN_HEAP, field, rax, noreg, noreg);
3386 break;
3387 case Bytecodes::_fast_bputfield:
3388 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3388, _masm)->
access_store_at(T_BYTE, IN_HEAP, field, rax, noreg, noreg);
3389 break;
3390 case Bytecodes::_fast_sputfield:
3391 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3391, _masm)->
access_store_at(T_SHORT, IN_HEAP, field, rax, noreg, noreg);
3392 break;
3393 case Bytecodes::_fast_cputfield:
3394 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3394, _masm)->
access_store_at(T_CHAR, IN_HEAP, field, rax, noreg, noreg);
3395 break;
3396 case Bytecodes::_fast_fputfield:
3397 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3397, _masm)->
access_store_at(T_FLOAT, IN_HEAP, field, noreg /* ftos*/, noreg, noreg);
3398 break;
3399 case Bytecodes::_fast_dputfield:
3400 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3400, _masm)->
access_store_at(T_DOUBLE, IN_HEAP, field, noreg /* dtos*/, noreg, noreg);
3401 break;
3402 default:
3403 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3403); ::breakpoint(); } while (0)
;
3404 }
3405}
3406
3407void TemplateTable::fast_accessfield(TosState state) {
3408 transition(atos, state);
3409
3410 // Do the JVMTI work here to avoid disturbing the register state below
3411 if (JvmtiExport::can_post_field_access()) {
3412 // Check to see if a field access watch has been set before we
3413 // take the time to call into the VM.
3414 Label L1;
3415 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3415, _masm)->
mov32(rcx, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
3416 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3416, _masm)->
testl(rcx, rcx);
3417 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3417, _masm)->
jcc(Assembler::zero, L1);
3418 // access constant pool cache entry
3419 LP64_ONLY(__ get_cache_entry_pointer_at_bcp(c_rarg2, rcx, 1))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3419, _masm)-> get_cache_entry_pointer_at_bcp(c_rarg2, rcx
, 1)
;
3420 NOT_LP64(__ get_cache_entry_pointer_at_bcp(rcx, rdx, 1));
3421 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3421, _masm)->
verify_oop(rax)_verify_oop_checked(rax, "broken oop " "rax", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3421)
;
3422 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3422, _masm)->
push_ptr(rax); // save object pointer before call_VM() clobbers it
3423 LP64_ONLY(__ mov(c_rarg1, rax))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3423, _masm)-> mov(c_rarg1, rax)
;
3424 // c_rarg1: object pointer copied above
3425 // c_rarg2: cache entry pointer
3426 LP64_ONLY(__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access), c_rarg1, c_rarg2))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3426, _masm)-> call_VM(noreg, ((address)((address_word)(
InterpreterRuntime::post_field_access))), c_rarg1, c_rarg2)
;
3427 NOT_LP64(__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access), rax, rcx));
3428 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3428, _masm)->
pop_ptr(rax); // restore object pointer
3429 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3429, _masm)->
bind(L1);
3430 }
3431
3432 // access constant pool cache
3433 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3433, _masm)->
get_cache_and_index_at_bcp(rcx, rbx, 1);
3434 // replace index with field offset from cache entry
3435 // [jk] not needed currently
3436 // __ movl(rdx, Address(rcx, rbx, Address::times_8,
3437 // in_bytes(ConstantPoolCache::base_offset() +
3438 // ConstantPoolCacheEntry::flags_offset())));
3439 // __ shrl(rdx, ConstantPoolCacheEntry::is_volatile_shift);
3440 // __ andl(rdx, 0x1);
3441 //
3442 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3442, _masm)->
movptr(rbx, Address(rcx, rbx, Address::times_ptr,
3443 in_bytes(ConstantPoolCache::base_offset() +
3444 ConstantPoolCacheEntry::f2_offset())));
3445
3446 // rax: object
3447 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3447, _masm)->
verify_oop(rax)_verify_oop_checked(rax, "broken oop " "rax", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3447)
;
3448 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3448, _masm)->
null_check(rax);
3449 Address field(rax, rbx, Address::times_1);
3450
3451 // access field
3452 switch (bytecode()) {
3453 case Bytecodes::_fast_agetfield:
3454 do_oop_load(_masm, field, rax);
3455 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3455, _masm)->
verify_oop(rax)_verify_oop_checked(rax, "broken oop " "rax", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3455)
;
3456 break;
3457 case Bytecodes::_fast_lgetfield:
3458#ifdef _LP641
3459 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3459, _masm)->
access_load_at(T_LONG, IN_HEAP, noreg /* ltos */, field, noreg, noreg);
3460#else
3461 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3461, _masm)->
stop("should not be rewritten");
3462#endif
3463 break;
3464 case Bytecodes::_fast_igetfield:
3465 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3465, _masm)->
access_load_at(T_INT, IN_HEAP, rax, field, noreg, noreg);
3466 break;
3467 case Bytecodes::_fast_bgetfield:
3468 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3468, _masm)->
access_load_at(T_BYTE, IN_HEAP, rax, field, noreg, noreg);
3469 break;
3470 case Bytecodes::_fast_sgetfield:
3471 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3471, _masm)->
access_load_at(T_SHORT, IN_HEAP, rax, field, noreg, noreg);
3472 break;
3473 case Bytecodes::_fast_cgetfield:
3474 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3474, _masm)->
access_load_at(T_CHAR, IN_HEAP, rax, field, noreg, noreg);
3475 break;
3476 case Bytecodes::_fast_fgetfield:
3477 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3477, _masm)->
access_load_at(T_FLOAT, IN_HEAP, noreg /* ftos */, field, noreg, noreg);
3478 break;
3479 case Bytecodes::_fast_dgetfield:
3480 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3480, _masm)->
access_load_at(T_DOUBLE, IN_HEAP, noreg /* dtos */, field, noreg, noreg);
3481 break;
3482 default:
3483 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3483); ::breakpoint(); } while (0)
;
3484 }
3485 // [jk] not needed currently
3486 // Label notVolatile;
3487 // __ testl(rdx, rdx);
3488 // __ jcc(Assembler::zero, notVolatile);
3489 // __ membar(Assembler::LoadLoad);
3490 // __ bind(notVolatile);
3491}
3492
3493void TemplateTable::fast_xaccess(TosState state) {
3494 transition(vtos, state);
3495
3496 // get receiver
3497 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3497, _masm)->
movptr(rax, aaddress(0));
3498 // access constant pool cache
3499 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3499, _masm)->
get_cache_and_index_at_bcp(rcx, rdx, 2);
3500 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3500, _masm)->
movptr(rbx,
3501 Address(rcx, rdx, Address::times_ptr,
3502 in_bytes(ConstantPoolCache::base_offset() +
3503 ConstantPoolCacheEntry::f2_offset())));
3504 // make sure exception is reported in correct bcp range (getfield is
3505 // next instruction)
3506 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3506, _masm)->
increment(rbcp);
3507 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3507, _masm)->
null_check(rax);
3508 const Address field = Address(rax, rbx, Address::times_1, 0*wordSize);
3509 switch (state) {
3510 case itos:
3511 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3511, _masm)->
access_load_at(T_INT, IN_HEAP, rax, field, noreg, noreg);
3512 break;
3513 case atos:
3514 do_oop_load(_masm, field, rax);
3515 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3515, _masm)->
verify_oop(rax)_verify_oop_checked(rax, "broken oop " "rax", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3515)
;
3516 break;
3517 case ftos:
3518 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3518, _masm)->
access_load_at(T_FLOAT, IN_HEAP, noreg /* ftos */, field, noreg, noreg);
3519 break;
3520 default:
3521 ShouldNotReachHere()do { (*g_assert_poison) = 'X';; report_should_not_reach_here(
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3521); ::breakpoint(); } while (0)
;
3522 }
3523
3524 // [jk] not needed currently
3525 // Label notVolatile;
3526 // __ movl(rdx, Address(rcx, rdx, Address::times_8,
3527 // in_bytes(ConstantPoolCache::base_offset() +
3528 // ConstantPoolCacheEntry::flags_offset())));
3529 // __ shrl(rdx, ConstantPoolCacheEntry::is_volatile_shift);
3530 // __ testl(rdx, 0x1);
3531 // __ jcc(Assembler::zero, notVolatile);
3532 // __ membar(Assembler::LoadLoad);
3533 // __ bind(notVolatile);
3534
3535 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3535, _masm)->
decrement(rbcp);
3536}
3537
3538//-----------------------------------------------------------------------------
3539// Calls
3540
3541void TemplateTable::prepare_invoke(int byte_no,
3542 Register method, // linked method (or i-klass)
3543 Register index, // itable index, MethodType, etc.
3544 Register recv, // if caller wants to see it
3545 Register flags // if caller wants to test it
3546 ) {
3547 // determine flags
3548 const Bytecodes::Code code = bytecode();
3549 const bool is_invokeinterface = code == Bytecodes::_invokeinterface;
3550 const bool is_invokedynamic = code == Bytecodes::_invokedynamic;
3551 const bool is_invokehandle = code == Bytecodes::_invokehandle;
3552 const bool is_invokevirtual = code == Bytecodes::_invokevirtual;
3553 const bool is_invokespecial = code == Bytecodes::_invokespecial;
3554 const bool load_receiver = (recv != noreg);
3555 const bool save_flags = (flags != noreg);
3556 assert(load_receiver == (code != Bytecodes::_invokestatic && code != Bytecodes::_invokedynamic), "")do { if (!(load_receiver == (code != Bytecodes::_invokestatic
&& code != Bytecodes::_invokedynamic))) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3556, "assert(" "load_receiver == (code != Bytecodes::_invokestatic && code != Bytecodes::_invokedynamic)"
") failed", ""); ::breakpoint(); } } while (0)
;
3557 assert(save_flags == (is_invokeinterface || is_invokevirtual), "need flags for vfinal")do { if (!(save_flags == (is_invokeinterface || is_invokevirtual
))) { (*g_assert_poison) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3557, "assert(" "save_flags == (is_invokeinterface || is_invokevirtual)"
") failed", "need flags for vfinal"); ::breakpoint(); } } while
(0)
;
3558 assert(flags == noreg || flags == rdx, "")do { if (!(flags == noreg || flags == rdx)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3558, "assert(" "flags == noreg || flags == rdx" ") failed"
, ""); ::breakpoint(); } } while (0)
;
3559 assert(recv == noreg || recv == rcx, "")do { if (!(recv == noreg || recv == rcx)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3559, "assert(" "recv == noreg || recv == rcx" ") failed", ""
); ::breakpoint(); } } while (0)
;
3560
3561 // setup registers & access constant pool cache
3562 if (recv == noreg) recv = rcx;
3563 if (flags == noreg) flags = rdx;
3564 assert_different_registers(method, index, recv, flags);
3565
3566 // save 'interpreter return address'
3567 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3567, _masm)->
save_bcp();
3568
3569 load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual, false, is_invokedynamic);
3570
3571 // maybe push appendix to arguments (just before return address)
3572 if (is_invokedynamic || is_invokehandle) {
3573 Label L_no_push;
3574 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3574, _masm)->
testl(flags, (1 << ConstantPoolCacheEntry::has_appendix_shift));
3575 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3575, _masm)->
jcc(Assembler::zero, L_no_push);
3576 // Push the appendix as a trailing parameter.
3577 // This must be done before we get the receiver,
3578 // since the parameter_size includes it.
3579 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3579, _masm)->
push(rbx);
3580 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3580, _masm)->
mov(rbx, index);
3581 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3581, _masm)->
load_resolved_reference_at_index(index, rbx);
3582 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3582, _masm)->
pop(rbx);
3583 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3583, _masm)->
push(index); // push appendix (MethodType, CallSite, etc.)
3584 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3584, _masm)->
bind(L_no_push);
3585 }
3586
3587 // load receiver if needed (after appendix is pushed so parameter size is correct)
3588 // Note: no return address pushed yet
3589 if (load_receiver) {
3590 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3590, _masm)->
movl(recv, flags);
3591 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3591, _masm)->
andl(recv, ConstantPoolCacheEntry::parameter_size_mask);
3592 const int no_return_pc_pushed_yet = -1; // argument slot correction before we push return address
3593 const int receiver_is_at_end = -1; // back off one slot to get receiver
3594 Address recv_addr = __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3594, _masm)->
argument_address(recv, no_return_pc_pushed_yet + receiver_is_at_end);
3595 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3595, _masm)->
movptr(recv, recv_addr);
3596 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3596, _masm)->
verify_oop(recv)_verify_oop_checked(recv, "broken oop " "recv", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3596)
;
3597 }
3598
3599 if (save_flags) {
3600 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3600, _masm)->
movl(rbcp, flags);
3601 }
3602
3603 // compute return type
3604 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3604, _masm)->
shrl(flags, ConstantPoolCacheEntry::tos_state_shift);
3605 // Make sure we don't need to mask flags after the above shift
3606 ConstantPoolCacheEntry::verify_tos_state_shift();
3607 // load return address
3608 {
3609 const address table_addr = (address) Interpreter::invoke_return_entry_table_for(code);
3610 ExternalAddress table(table_addr);
3611 LP64_ONLY(__ lea(rscratch1, table))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3611, _masm)-> lea(rscratch1, table)
;
3612 LP64_ONLY(__ movptr(flags, Address(rscratch1, flags, Address::times_ptr)))Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3612, _masm)-> movptr(flags, Address(rscratch1, flags, Address
::times_ptr))
;
3613 NOT_LP64(__ movptr(flags, ArrayAddress(table, Address(noreg, flags, Address::times_ptr))));
3614 }
3615
3616 // push return address
3617 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3617, _masm)->
push(flags);
3618
3619 // Restore flags value from the constant pool cache, and restore rsi
3620 // for later null checks. r13 is the bytecode pointer
3621 if (save_flags) {
3622 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3622, _masm)->
movl(flags, rbcp);
3623 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3623, _masm)->
restore_bcp();
3624 }
3625}
3626
3627void TemplateTable::invokevirtual_helper(Register index,
3628 Register recv,
3629 Register flags) {
3630 // Uses temporary registers rax, rdx
3631 assert_different_registers(index, recv, rax, rdx);
3632 assert(index == rbx, "")do { if (!(index == rbx)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3632, "assert(" "index == rbx" ") failed", ""); ::breakpoint
(); } } while (0)
;
3633 assert(recv == rcx, "")do { if (!(recv == rcx)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3633, "assert(" "recv == rcx" ") failed", ""); ::breakpoint
(); } } while (0)
;
3634
3635 // Test for an invoke of a final method
3636 Label notFinal;
3637 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3637, _masm)->
movl(rax, flags);
3638 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3638, _masm)->
andl(rax, (1 << ConstantPoolCacheEntry::is_vfinal_shift));
3639 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3639, _masm)->
jcc(Assembler::zero, notFinal);
3640
3641 const Register method = index; // method must be rbx
3642 assert(method == rbx,do { if (!(method == rbx)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3643, "assert(" "method == rbx" ") failed", "Method* must be rbx for interpreter calling convention"
); ::breakpoint(); } } while (0)
3643 "Method* must be rbx for interpreter calling convention")do { if (!(method == rbx)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3643, "assert(" "method == rbx" ") failed", "Method* must be rbx for interpreter calling convention"
); ::breakpoint(); } } while (0)
;
3644
3645 // do the call - the index is actually the method to call
3646 // that is, f2 is a vtable index if !is_vfinal, else f2 is a Method*
3647
3648 // It's final, need a null check here!
3649 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3649, _masm)->
null_check(recv);
3650
3651 // profile this call
3652 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3652, _masm)->
profile_final_call(rax);
3653 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3653, _masm)->
profile_arguments_type(rax, method, rbcp, true);
3654
3655 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3655, _masm)->
jump_from_interpreted(method, rax);
3656
3657 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3657, _masm)->
bind(notFinal);
3658
3659 // get receiver klass
3660 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3660, _masm)->
null_check(recv, oopDesc::klass_offset_in_bytes());
3661 Register tmp_load_klass = LP64_ONLY(rscratch1)rscratch1 NOT_LP64(noreg);
3662 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3662, _masm)->
load_klass(rax, recv, tmp_load_klass);
3663
3664 // profile this call
3665 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3665, _masm)->
profile_virtual_call(rax, rlocals, rdx);
3666 // get target Method* & entry point
3667 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3667, _masm)->
lookup_virtual_method(rax, index, method);
3668
3669 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3669, _masm)->
profile_arguments_type(rdx, method, rbcp, true);
3670 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3670, _masm)->
jump_from_interpreted(method, rdx);
3671}
3672
3673void TemplateTable::invokevirtual(int byte_no) {
3674 transition(vtos, vtos);
3675 assert(byte_no == f2_byte, "use this argument")do { if (!(byte_no == f2_byte)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3675, "assert(" "byte_no == f2_byte" ") failed", "use this argument"
); ::breakpoint(); } } while (0)
;
3676 prepare_invoke(byte_no,
3677 rbx, // method or vtable index
3678 noreg, // unused itable index
3679 rcx, rdx); // recv, flags
3680
3681 // rbx: index
3682 // rcx: receiver
3683 // rdx: flags
3684
3685 invokevirtual_helper(rbx, rcx, rdx);
3686}
3687
3688void TemplateTable::invokespecial(int byte_no) {
3689 transition(vtos, vtos);
3690 assert(byte_no == f1_byte, "use this argument")do { if (!(byte_no == f1_byte)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3690, "assert(" "byte_no == f1_byte" ") failed", "use this argument"
); ::breakpoint(); } } while (0)
;
3691 prepare_invoke(byte_no, rbx, noreg, // get f1 Method*
3692 rcx); // get receiver also for null check
3693 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3693, _masm)->
verify_oop(rcx)_verify_oop_checked(rcx, "broken oop " "rcx", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3693)
;
3694 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3694, _masm)->
null_check(rcx);
3695 // do the call
3696 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3696, _masm)->
profile_call(rax);
3697 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3697, _masm)->
profile_arguments_type(rax, rbx, rbcp, false);
3698 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3698, _masm)->
jump_from_interpreted(rbx, rax);
3699}
3700
3701void TemplateTable::invokestatic(int byte_no) {
3702 transition(vtos, vtos);
3703 assert(byte_no == f1_byte, "use this argument")do { if (!(byte_no == f1_byte)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3703, "assert(" "byte_no == f1_byte" ") failed", "use this argument"
); ::breakpoint(); } } while (0)
;
3704 prepare_invoke(byte_no, rbx); // get f1 Method*
3705 // do the call
3706 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3706, _masm)->
profile_call(rax);
3707 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3707, _masm)->
profile_arguments_type(rax, rbx, rbcp, false);
3708 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3708, _masm)->
jump_from_interpreted(rbx, rax);
3709}
3710
3711
3712void TemplateTable::fast_invokevfinal(int byte_no) {
3713 transition(vtos, vtos);
3714 assert(byte_no == f2_byte, "use this argument")do { if (!(byte_no == f2_byte)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3714, "assert(" "byte_no == f2_byte" ") failed", "use this argument"
); ::breakpoint(); } } while (0)
;
3715 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3715, _masm)->
stop("fast_invokevfinal not used on x86");
3716}
3717
3718
3719void TemplateTable::invokeinterface(int byte_no) {
3720 transition(vtos, vtos);
3721 assert(byte_no == f1_byte, "use this argument")do { if (!(byte_no == f1_byte)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3721, "assert(" "byte_no == f1_byte" ") failed", "use this argument"
); ::breakpoint(); } } while (0)
;
3722 prepare_invoke(byte_no, rax, rbx, // get f1 Klass*, f2 Method*
3723 rcx, rdx); // recv, flags
3724
3725 // rax: reference klass (from f1) if interface method
3726 // rbx: method (from f2)
3727 // rcx: receiver
3728 // rdx: flags
3729
3730 // First check for Object case, then private interface method,
3731 // then regular interface method.
3732
3733 // Special case of invokeinterface called for virtual method of
3734 // java.lang.Object. See cpCache.cpp for details.
3735 Label notObjectMethod;
3736 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3736, _masm)->
movl(rlocals, rdx);
3737 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3737, _masm)->
andl(rlocals, (1 << ConstantPoolCacheEntry::is_forced_virtual_shift));
3738 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3738, _masm)->
jcc(Assembler::zero, notObjectMethod);
3739 invokevirtual_helper(rbx, rcx, rdx);
3740 // no return from above
3741 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3741, _masm)->
bind(notObjectMethod);
3742
3743 Label no_such_interface; // for receiver subtype check
3744 Register recvKlass; // used for exception processing
3745
3746 // Check for private method invocation - indicated by vfinal
3747 Label notVFinal;
3748 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3748, _masm)->
movl(rlocals, rdx);
3749 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3749, _masm)->
andl(rlocals, (1 << ConstantPoolCacheEntry::is_vfinal_shift));
3750 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3750, _masm)->
jcc(Assembler::zero, notVFinal);
3751
3752 // Get receiver klass into rlocals - also a null check
3753 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3753, _masm)->
null_check(rcx, oopDesc::klass_offset_in_bytes());
3754 Register tmp_load_klass = LP64_ONLY(rscratch1)rscratch1 NOT_LP64(noreg);
3755 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3755, _masm)->
load_klass(rlocals, rcx, tmp_load_klass);
3756
3757 Label subtype;
3758 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3758, _masm)->
check_klass_subtype(rlocals, rax, rbcp, subtype);
3759 // If we get here the typecheck failed
3760 recvKlass = rdx;
3761 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3761, _masm)->
mov(recvKlass, rlocals); // shuffle receiver class for exception use
3762 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3762, _masm)->
jmp(no_such_interface);
3763
3764 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3764, _masm)->
bind(subtype);
3765
3766 // do the call - rbx is actually the method to call
3767
3768 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3768, _masm)->
profile_final_call(rdx);
3769 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3769, _masm)->
profile_arguments_type(rdx, rbx, rbcp, true);
3770
3771 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3771, _masm)->
jump_from_interpreted(rbx, rdx);
3772 // no return from above
3773 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3773, _masm)->
bind(notVFinal);
3774
3775 // Get receiver klass into rdx - also a null check
3776 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3776, _masm)->
restore_locals(); // restore r14
3777 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3777, _masm)->
null_check(rcx, oopDesc::klass_offset_in_bytes());
3778 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3778, _masm)->
load_klass(rdx, rcx, tmp_load_klass);
3779
3780 Label no_such_method;
3781
3782 // Preserve method for throw_AbstractMethodErrorVerbose.
3783 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3783, _masm)->
mov(rcx, rbx);
3784 // Receiver subtype check against REFC.
3785 // Superklass in rax. Subklass in rdx. Blows rcx, rdi.
3786 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3786, _masm)->
lookup_interface_method(// inputs: rec. class, interface, itable index
3787 rdx, rax, noreg,
3788 // outputs: scan temp. reg, scan temp. reg
3789 rbcp, rlocals,
3790 no_such_interface,
3791 /*return_method=*/false);
3792
3793 // profile this call
3794 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3794, _masm)->
restore_bcp(); // rbcp was destroyed by receiver type check
3795 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3795, _masm)->
profile_virtual_call(rdx, rbcp, rlocals);
3796
3797 // Get declaring interface class from method, and itable index
3798 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3798, _masm)->
load_method_holder(rax, rbx);
3799 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3799, _masm)->
movl(rbx, Address(rbx, Method::itable_index_offset()));
3800 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3800, _masm)->
subl(rbx, Method::itable_index_max);
3801 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3801, _masm)->
negl(rbx);
3802
3803 // Preserve recvKlass for throw_AbstractMethodErrorVerbose.
3804 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3804, _masm)->
mov(rlocals, rdx);
3805 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3805, _masm)->
lookup_interface_method(// inputs: rec. class, interface, itable index
3806 rlocals, rax, rbx,
3807 // outputs: method, scan temp. reg
3808 rbx, rbcp,
3809 no_such_interface);
3810
3811 // rbx: Method* to call
3812 // rcx: receiver
3813 // Check for abstract method error
3814 // Note: This should be done more efficiently via a throw_abstract_method_error
3815 // interpreter entry point and a conditional jump to it in case of a null
3816 // method.
3817 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3817, _masm)->
testptr(rbx, rbx);
3818 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3818, _masm)->
jcc(Assembler::zero, no_such_method);
3819
3820 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3820, _masm)->
profile_arguments_type(rdx, rbx, rbcp, true);
3821
3822 // do the call
3823 // rcx: receiver
3824 // rbx,: Method*
3825 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3825, _masm)->
jump_from_interpreted(rbx, rdx);
3826 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3826, _masm)->
should_not_reach_here();
3827
3828 // exception handling code follows...
3829 // note: must restore interpreter registers to canonical
3830 // state for exception handling to work correctly!
3831
3832 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3832, _masm)->
bind(no_such_method);
3833 // throw exception
3834 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3834, _masm)->
pop(rbx); // pop return address (pushed by prepare_invoke)
3835 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3835, _masm)->
restore_bcp(); // rbcp must be correct for exception handler (was destroyed)
3836 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3836, _masm)->
restore_locals(); // make sure locals pointer is correct as well (was destroyed)
3837 // Pass arguments for generating a verbose error message.
3838#ifdef _LP641
3839 recvKlass = c_rarg1;
3840 Register method = c_rarg2;
3841 if (recvKlass != rdx) { __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3841, _masm)->
movq(recvKlass, rdx); }
3842 if (method != rcx) { __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3842, _masm)->
movq(method, rcx); }
3843#else
3844 recvKlass = rdx;
3845 Register method = rcx;
3846#endif
3847 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3847, _masm)->
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodErrorVerbose)((address)((address_word)(InterpreterRuntime::throw_AbstractMethodErrorVerbose
)))
,
3848 recvKlass, method);
3849 // The call_VM checks for exception, so we should never return here.
3850 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3850, _masm)->
should_not_reach_here();
3851
3852 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3852, _masm)->
bind(no_such_interface);
3853 // throw exception
3854 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3854, _masm)->
pop(rbx); // pop return address (pushed by prepare_invoke)
3855 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3855, _masm)->
restore_bcp(); // rbcp must be correct for exception handler (was destroyed)
3856 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3856, _masm)->
restore_locals(); // make sure locals pointer is correct as well (was destroyed)
3857 // Pass arguments for generating a verbose error message.
3858 LP64_ONLY( if (recvKlass != rdx) { __ movq(recvKlass, rdx); } )if (recvKlass != rdx) { Disassembler::hook<InterpreterMacroAssembler
>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3858, _masm)-> movq(recvKlass, rdx); }
3859 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3859, _masm)->
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeErrorVerbose)((address)((address_word)(InterpreterRuntime::throw_IncompatibleClassChangeErrorVerbose
)))
,
3860 recvKlass, rax);
3861 // the call_VM checks for exception, so we should never return here.
3862 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3862, _masm)->
should_not_reach_here();
3863}
3864
3865void TemplateTable::invokehandle(int byte_no) {
3866 transition(vtos, vtos);
3867 assert(byte_no == f1_byte, "use this argument")do { if (!(byte_no == f1_byte)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3867, "assert(" "byte_no == f1_byte" ") failed", "use this argument"
); ::breakpoint(); } } while (0)
;
3868 const Register rbx_method = rbx;
3869 const Register rax_mtype = rax;
3870 const Register rcx_recv = rcx;
3871 const Register rdx_flags = rdx;
3872
3873 prepare_invoke(byte_no, rbx_method, rax_mtype, rcx_recv);
3874 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3874, _masm)->
verify_method_ptr(rbx_method)_verify_method_ptr(rbx_method, "broken method " "rbx_method",
"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3874)
;
3875 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3875, _masm)->
verify_oop(rcx_recv)_verify_oop_checked(rcx_recv, "broken oop " "rcx_recv", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3875)
;
3876 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3876, _masm)->
null_check(rcx_recv);
3877
3878 // rax: MethodType object (from cpool->resolved_references[f1], if necessary)
3879 // rbx: MH.invokeExact_MT method (from f2)
3880
3881 // Note: rax_mtype is already pushed (if necessary) by prepare_invoke
3882
3883 // FIXME: profile the LambdaForm also
3884 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3884, _masm)->
profile_final_call(rax);
3885 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3885, _masm)->
profile_arguments_type(rdx, rbx_method, rbcp, true);
3886
3887 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3887, _masm)->
jump_from_interpreted(rbx_method, rdx);
3888}
3889
3890void TemplateTable::invokedynamic(int byte_no) {
3891 transition(vtos, vtos);
3892 assert(byte_no == f1_byte, "use this argument")do { if (!(byte_no == f1_byte)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3892, "assert(" "byte_no == f1_byte" ") failed", "use this argument"
); ::breakpoint(); } } while (0)
;
3893
3894 const Register rbx_method = rbx;
3895 const Register rax_callsite = rax;
3896
3897 prepare_invoke(byte_no, rbx_method, rax_callsite);
3898
3899 // rax: CallSite object (from cpool->resolved_references[f1])
3900 // rbx: MH.linkToCallSite method (from f2)
3901
3902 // Note: rax_callsite is already pushed by prepare_invoke
3903
3904 // %%% should make a type profile for any invokedynamic that takes a ref argument
3905 // profile this call
3906 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3906, _masm)->
profile_call(rbcp);
3907 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3907, _masm)->
profile_arguments_type(rdx, rbx_method, rbcp, false);
3908
3909 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3909, _masm)->
verify_oop(rax_callsite)_verify_oop_checked(rax_callsite, "broken oop " "rax_callsite"
, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3909)
;
3910
3911 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3911, _masm)->
jump_from_interpreted(rbx_method, rdx);
3912}
3913
3914//-----------------------------------------------------------------------------
3915// Allocation
3916
3917void TemplateTable::_new() {
3918 transition(vtos, atos);
3919 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3919, _masm)->
get_unsigned_2_byte_index_at_bcp(rdx, 1);
3920 Label slow_case;
3921 Label slow_case_no_pop;
3922 Label done;
3923 Label initialize_header;
3924 Label initialize_object; // including clearing the fields
3925
3926 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3926, _masm)->
get_cpool_and_tags(rcx, rax);
3927
3928 // Make sure the class we're about to instantiate has been resolved.
3929 // This is done before loading InstanceKlass to be consistent with the order
3930 // how Constant Pool is updated (see ConstantPool::klass_at_put)
3931 const int tags_offset = Array<u1>::base_offset_in_bytes();
3932 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3932, _masm)->
cmpb(Address(rax, rdx, Address::times_1, tags_offset), JVM_CONSTANT_Class);
3933 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3933, _masm)->
jcc(Assembler::notEqual, slow_case_no_pop);
3934
3935 // get InstanceKlass
3936 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3936, _masm)->
load_resolved_klass_at_index(rcx, rcx, rdx);
3937 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3937, _masm)->
push(rcx); // save the contexts of klass for initializing the header
3938
3939 // make sure klass is initialized & doesn't have finalizer
3940 // make sure klass is fully initialized
3941 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3941, _masm)->
cmpb(Address(rcx, InstanceKlass::init_state_offset()), InstanceKlass::fully_initialized);
3942 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3942, _masm)->
jcc(Assembler::notEqual, slow_case);
3943
3944 // get instance_size in InstanceKlass (scaled to a count of bytes)
3945 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3945, _masm)->
movl(rdx, Address(rcx, Klass::layout_helper_offset()));
3946 // test to see if it has a finalizer or is malformed in some way
3947 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3947, _masm)->
testl(rdx, Klass::_lh_instance_slow_path_bit);
3948 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3948, _masm)->
jcc(Assembler::notZero, slow_case);
3949
3950 // Allocate the instance:
3951 // If TLAB is enabled:
3952 // Try to allocate in the TLAB.
3953 // If fails, go to the slow path.
3954 // Else If inline contiguous allocations are enabled:
3955 // Try to allocate in eden.
3956 // If fails due to heap end, go to slow path.
3957 //
3958 // If TLAB is enabled OR inline contiguous is enabled:
3959 // Initialize the allocation.
3960 // Exit.
3961 //
3962 // Go to slow path.
3963
3964 const bool allow_shared_alloc =
3965 Universe::heap()->supports_inline_contig_alloc();
3966
3967 const Register thread = LP64_ONLY(r15_thread)r15_thread NOT_LP64(rcx);
3968#ifndef _LP641
3969 if (UseTLAB || allow_shared_alloc) {
3970 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3970, _masm)->
get_thread(thread);
3971 }
3972#endif // _LP64
3973
3974 if (UseTLAB) {
3975 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3975, _masm)->
tlab_allocate(thread, rax, rdx, 0, rcx, rbx, slow_case);
3976 if (ZeroTLAB) {
3977 // the fields have been already cleared
3978 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3978, _masm)->
jmp(initialize_header);
3979 } else {
3980 // initialize both the header and fields
3981 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3981, _masm)->
jmp(initialize_object);
3982 }
3983 } else {
3984 // Allocation in the shared Eden, if allowed.
3985 //
3986 // rdx: instance size in bytes
3987 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3987, _masm)->
eden_allocate(thread, rax, rdx, 0, rbx, slow_case);
3988 }
3989
3990 // If UseTLAB or allow_shared_alloc are true, the object is created above and
3991 // there is an initialize need. Otherwise, skip and go to the slow path.
3992 if (UseTLAB || allow_shared_alloc) {
3993 // The object is initialized before the header. If the object size is
3994 // zero, go directly to the header initialization.
3995 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3995, _masm)->
bind(initialize_object);
3996 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3996, _masm)->
decrement(rdx, sizeof(oopDesc));
3997 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 3997, _masm)->
jcc(Assembler::zero, initialize_header);
3998
3999 // Initialize topmost object field, divide rdx by 8, check if odd and
4000 // test if zero.
4001 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4001, _masm)->
xorl(rcx, rcx); // use zero reg to clear memory (shorter code)
4002 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4002, _masm)->
shrl(rdx, LogBytesPerLong); // divide by 2*oopSize and set carry flag if odd
4003
4004 // rdx must have been multiple of 8
4005#ifdef ASSERT1
4006 // make sure rdx was multiple of 8
4007 Label L;
4008 // Ignore partial flag stall after shrl() since it is debug VM
4009 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4009, _masm)->
jcc(Assembler::carryClear, L);
4010 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4010, _masm)->
stop("object size is not multiple of 2 - adjust this code");
4011 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4011, _masm)->
bind(L);
4012 // rdx must be > 0, no extra check needed here
4013#endif
4014
4015 // initialize remaining object fields: rdx was a multiple of 8
4016 { Label loop;
4017 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4017, _masm)->
bind(loop);
4018 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4018, _masm)->
movptr(Address(rax, rdx, Address::times_8, sizeof(oopDesc) - 1*oopSize), rcx);
4019 NOT_LP64(__ movptr(Address(rax, rdx, Address::times_8, sizeof(oopDesc) - 2*oopSize), rcx));
4020 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4020, _masm)->
decrement(rdx);
4021 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4021, _masm)->
jcc(Assembler::notZero, loop);
4022 }
4023
4024 // initialize object header only.
4025 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4025, _masm)->
bind(initialize_header);
4026 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4026, _masm)->
movptr(Address(rax, oopDesc::mark_offset_in_bytes()),
4027 (intptr_t)markWord::prototype().value()); // header
4028 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4028, _masm)->
pop(rcx); // get saved klass back in the register.
4029#ifdef _LP641
4030 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4030, _masm)->
xorl(rsi, rsi); // use zero reg to clear memory (shorter code)
4031 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4031, _masm)->
store_klass_gap(rax, rsi); // zero klass gap for compressed oops
4032#endif
4033 Register tmp_store_klass = LP64_ONLY(rscratch1)rscratch1 NOT_LP64(noreg);
4034 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4034, _masm)->
store_klass(rax, rcx, tmp_store_klass); // klass
4035
4036 {
4037 SkipIfEqual skip_if(_masm, &DTraceAllocProbes, 0);
4038 // Trigger dtrace event for fastpath
4039 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4039, _masm)->
push(atos);
4040 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4040, _masm)->
call_VM_leaf(
4041 CAST_FROM_FN_PTR(address, static_cast<int (*)(oopDesc*)>(SharedRuntime::dtrace_object_alloc))((address)((address_word)(static_cast<int (*)(oopDesc*)>
(SharedRuntime::dtrace_object_alloc))))
, rax);
4042 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4042, _masm)->
pop(atos);
4043 }
4044
4045 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4045, _masm)->
jmp(done);
4046 }
4047
4048 // slow case
4049 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4049, _masm)->
bind(slow_case);
4050 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4050, _masm)->
pop(rcx); // restore stack pointer to what it was when we came in.
4051 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4051, _masm)->
bind(slow_case_no_pop);
4052
4053 Register rarg1 = LP64_ONLY(c_rarg1)c_rarg1 NOT_LP64(rax);
4054 Register rarg2 = LP64_ONLY(c_rarg2)c_rarg2 NOT_LP64(rdx);
4055
4056 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4056, _masm)->
get_constant_pool(rarg1);
4057 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4057, _masm)->
get_unsigned_2_byte_index_at_bcp(rarg2, 1);
4058 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new)((address)((address_word)(InterpreterRuntime::_new))), rarg1, rarg2);
4059 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4059, _masm)->
verify_oop(rax)_verify_oop_checked(rax, "broken oop " "rax", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4059)
;
4060
4061 // continue
4062 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4062, _masm)->
bind(done);
4063}
4064
4065void TemplateTable::newarray() {
4066 transition(itos, atos);
4067 Register rarg1 = LP64_ONLY(c_rarg1)c_rarg1 NOT_LP64(rdx);
4068 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4068, _masm)->
load_unsigned_byte(rarg1, at_bcp(1));
4069 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::newarray)((address)((address_word)(InterpreterRuntime::newarray))),
4070 rarg1, rax);
4071}
4072
4073void TemplateTable::anewarray() {
4074 transition(itos, atos);
4075
4076 Register rarg1 = LP64_ONLY(c_rarg1)c_rarg1 NOT_LP64(rcx);
4077 Register rarg2 = LP64_ONLY(c_rarg2)c_rarg2 NOT_LP64(rdx);
4078
4079 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4079, _masm)->
get_unsigned_2_byte_index_at_bcp(rarg2, 1);
4080 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4080, _masm)->
get_constant_pool(rarg1);
4081 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray)((address)((address_word)(InterpreterRuntime::anewarray))),
4082 rarg1, rarg2, rax);
4083}
4084
4085void TemplateTable::arraylength() {
4086 transition(atos, itos);
4087 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4087, _masm)->
null_check(rax, arrayOopDesc::length_offset_in_bytes());
4088 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4088, _masm)->
movl(rax, Address(rax, arrayOopDesc::length_offset_in_bytes()));
4089}
4090
4091void TemplateTable::checkcast() {
4092 transition(atos, atos);
4093 Label done, is_null, ok_is_subtype, quicked, resolved;
4094 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4094, _masm)->
testptr(rax, rax); // object is in rax
4095 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4095, _masm)->
jcc(Assembler::zero, is_null);
4096
4097 // Get cpool & tags index
4098 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4098, _masm)->
get_cpool_and_tags(rcx, rdx); // rcx=cpool, rdx=tags array
4099 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4099, _masm)->
get_unsigned_2_byte_index_at_bcp(rbx, 1); // rbx=index
4100 // See if bytecode has already been quicked
4101 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4101, _masm)->
cmpb(Address(rdx, rbx,
4102 Address::times_1,
4103 Array<u1>::base_offset_in_bytes()),
4104 JVM_CONSTANT_Class);
4105 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4105, _masm)->
jcc(Assembler::equal, quicked);
4106 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4106, _masm)->
push(atos); // save receiver for result, and for GC
4107 call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc)((address)((address_word)(InterpreterRuntime::quicken_io_cc))
)
);
4108
4109 // vm_result_2 has metadata result
4110#ifndef _LP641
4111 // borrow rdi from locals
4112 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4112, _masm)->
get_thread(rdi);
4113 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4113, _masm)->
get_vm_result_2(rax, rdi);
4114 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4114, _masm)->
restore_locals();
4115#else
4116 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4116, _masm)->
get_vm_result_2(rax, r15_thread);
4117#endif
4118
4119 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4119, _masm)->
pop_ptr(rdx); // restore receiver
4120 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4120, _masm)->
jmpb(resolved)jmpb_0(resolved, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4120)
;
4121
4122 // Get superklass in rax and subklass in rbx
4123 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4123, _masm)->
bind(quicked);
4124 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4124, _masm)->
mov(rdx, rax); // Save object in rdx; rax needed for subtype check
4125 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4125, _masm)->
load_resolved_klass_at_index(rax, rcx, rbx);
4126
4127 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4127, _masm)->
bind(resolved);
4128 Register tmp_load_klass = LP64_ONLY(rscratch1)rscratch1 NOT_LP64(noreg);
4129 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4129, _masm)->
load_klass(rbx, rdx, tmp_load_klass);
4130
4131 // Generate subtype check. Blows rcx, rdi. Object in rdx.
4132 // Superklass in rax. Subklass in rbx.
4133 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4133, _masm)->
gen_subtype_check(rbx, ok_is_subtype);
4134
4135 // Come here on failure
4136 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4136, _masm)->
push_ptr(rdx);
4137 // object is at TOS
4138 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4138, _masm)->
jump(ExternalAddress(Interpreter::_throw_ClassCastException_entry));
4139
4140 // Come here on success
4141 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4141, _masm)->
bind(ok_is_subtype);
4142 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4142, _masm)->
mov(rax, rdx); // Restore object in rdx
4143
4144 // Collect counts on whether this check-cast sees NULLs a lot or not.
4145 if (ProfileInterpreter) {
4146 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4146, _masm)->
jmp(done);
4147 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4147, _masm)->
bind(is_null);
4148 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4148, _masm)->
profile_null_seen(rcx);
4149 } else {
4150 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4150, _masm)->
bind(is_null); // same as 'done'
4151 }
4152 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4152, _masm)->
bind(done);
4153}
4154
4155void TemplateTable::instanceof() {
4156 transition(atos, itos);
4157 Label done, is_null, ok_is_subtype, quicked, resolved;
4158 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4158, _masm)->
testptr(rax, rax);
4159 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4159, _masm)->
jcc(Assembler::zero, is_null);
4160
4161 // Get cpool & tags index
4162 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4162, _masm)->
get_cpool_and_tags(rcx, rdx); // rcx=cpool, rdx=tags array
4163 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4163, _masm)->
get_unsigned_2_byte_index_at_bcp(rbx, 1); // rbx=index
4164 // See if bytecode has already been quicked
4165 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4165, _masm)->
cmpb(Address(rdx, rbx,
4166 Address::times_1,
4167 Array<u1>::base_offset_in_bytes()),
4168 JVM_CONSTANT_Class);
4169 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4169, _masm)->
jcc(Assembler::equal, quicked);
4170
4171 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4171, _masm)->
push(atos); // save receiver for result, and for GC
4172 call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc)((address)((address_word)(InterpreterRuntime::quicken_io_cc))
)
);
4173 // vm_result_2 has metadata result
4174
4175#ifndef _LP641
4176 // borrow rdi from locals
4177 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4177, _masm)->
get_thread(rdi);
4178 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4178, _masm)->
get_vm_result_2(rax, rdi);
4179 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4179, _masm)->
restore_locals();
4180#else
4181 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4181, _masm)->
get_vm_result_2(rax, r15_thread);
4182#endif
4183
4184 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4184, _masm)->
pop_ptr(rdx); // restore receiver
4185 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4185, _masm)->
verify_oop(rdx)_verify_oop_checked(rdx, "broken oop " "rdx", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4185)
;
4186 Register tmp_load_klass = LP64_ONLY(rscratch1)rscratch1 NOT_LP64(noreg);
4187 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4187, _masm)->
load_klass(rdx, rdx, tmp_load_klass);
4188 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4188, _masm)->
jmpb(resolved)jmpb_0(resolved, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4188)
;
4189
4190 // Get superklass in rax and subklass in rdx
4191 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4191, _masm)->
bind(quicked);
4192 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4192, _masm)->
load_klass(rdx, rax, tmp_load_klass);
4193 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4193, _masm)->
load_resolved_klass_at_index(rax, rcx, rbx);
4194
4195 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4195, _masm)->
bind(resolved);
4196
4197 // Generate subtype check. Blows rcx, rdi
4198 // Superklass in rax. Subklass in rdx.
4199 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4199, _masm)->
gen_subtype_check(rdx, ok_is_subtype);
4200
4201 // Come here on failure
4202 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4202, _masm)->
xorl(rax, rax);
4203 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4203, _masm)->
jmpb(done)jmpb_0(done, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4203)
;
4204 // Come here on success
4205 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4205, _masm)->
bind(ok_is_subtype);
4206 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4206, _masm)->
movl(rax, 1);
4207
4208 // Collect counts on whether this test sees NULLs a lot or not.
4209 if (ProfileInterpreter) {
4210 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4210, _masm)->
jmp(done);
4211 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4211, _masm)->
bind(is_null);
4212 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4212, _masm)->
profile_null_seen(rcx);
4213 } else {
4214 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4214, _masm)->
bind(is_null); // same as 'done'
4215 }
4216 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4216, _masm)->
bind(done);
4217 // rax = 0: obj == NULL or obj is not an instanceof the specified klass
4218 // rax = 1: obj != NULL and obj is an instanceof the specified klass
4219}
4220
4221
4222//----------------------------------------------------------------------------------------------------
4223// Breakpoints
4224void TemplateTable::_breakpoint() {
4225 // Note: We get here even if we are single stepping..
4226 // jbug insists on setting breakpoints at every bytecode
4227 // even if we are in single step mode.
4228
4229 transition(vtos, vtos);
4230
4231 Register rarg = LP64_ONLY(c_rarg1)c_rarg1 NOT_LP64(rcx);
4232
4233 // get the unpatched byte code
4234 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4234, _masm)->
get_method(rarg);
4235 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4235, _masm)->
call_VM(noreg,
4236 CAST_FROM_FN_PTR(address,((address)((address_word)(InterpreterRuntime::get_original_bytecode_at
)))
4237 InterpreterRuntime::get_original_bytecode_at)((address)((address_word)(InterpreterRuntime::get_original_bytecode_at
)))
,
4238 rarg, rbcp);
4239 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4239, _masm)->
mov(rbx, rax); // why?
4240
4241 // post the breakpoint event
4242 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4242, _masm)->
get_method(rarg);
4243 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4243, _masm)->
call_VM(noreg,
4244 CAST_FROM_FN_PTR(address, InterpreterRuntime::_breakpoint)((address)((address_word)(InterpreterRuntime::_breakpoint))),
4245 rarg, rbcp);
4246
4247 // complete the execution of original bytecode
4248 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4248, _masm)->
dispatch_only_normal(vtos);
4249}
4250
4251//-----------------------------------------------------------------------------
4252// Exceptions
4253
4254void TemplateTable::athrow() {
4255 transition(atos, vtos);
4256 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4256, _masm)->
null_check(rax);
4257 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4257, _masm)->
jump(ExternalAddress(Interpreter::throw_exception_entry()));
4258}
4259
4260//-----------------------------------------------------------------------------
4261// Synchronization
4262//
4263// Note: monitorenter & exit are symmetric routines; which is reflected
4264// in the assembly code structure as well
4265//
4266// Stack layout:
4267//
4268// [expressions ] <--- rsp = expression stack top
4269// ..
4270// [expressions ]
4271// [monitor entry] <--- monitor block top = expression stack bot
4272// ..
4273// [monitor entry]
4274// [frame data ] <--- monitor block bot
4275// ...
4276// [saved rbp ] <--- rbp
4277void TemplateTable::monitorenter() {
4278 transition(atos, vtos);
4279
4280 // check for NULL object
4281 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4281, _masm)->
null_check(rax);
4282
4283 const Address monitor_block_top(
4284 rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
4285 const Address monitor_block_bot(
4286 rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
4287 const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
4288
4289 Label allocated;
4290
4291 Register rtop = LP64_ONLY(c_rarg3)c_rarg3 NOT_LP64(rcx);
4292 Register rbot = LP64_ONLY(c_rarg2)c_rarg2 NOT_LP64(rbx);
4293 Register rmon = LP64_ONLY(c_rarg1)c_rarg1 NOT_LP64(rdx);
4294
4295 // initialize entry pointer
4296 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4296, _masm)->
xorl(rmon, rmon); // points to free slot or NULL
4297
4298 // find a free slot in the monitor block (result in rmon)
4299 {
4300 Label entry, loop, exit;
4301 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4301, _masm)->
movptr(rtop, monitor_block_top); // points to current entry,
4302 // starting with top-most entry
4303 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4303, _masm)->
lea(rbot, monitor_block_bot); // points to word before bottom
4304 // of monitor block
4305 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4305, _masm)->
jmpb(entry)jmpb_0(entry, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4305)
;
4306
4307 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4307, _masm)->
bind(loop);
4308 // check if current entry is used
4309 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4309, _masm)->
cmpptr(Address(rtop, BasicObjectLock::obj_offset_in_bytes()), (int32_t) NULL_WORD0L);
4310 // if not used then remember entry in rmon
4311 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4311, _masm)->
cmovptr(Assembler::equal, rmon, rtop); // cmov => cmovptr
4312 // check if current entry is for same object
4313 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4313, _masm)->
cmpptr(rax, Address(rtop, BasicObjectLock::obj_offset_in_bytes()));
4314 // if same object then stop searching
4315 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4315, _masm)->
jccb(Assembler::equal, exit)jccb_0(Assembler::equal, exit, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4315)
;
4316 // otherwise advance to next entry
4317 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4317, _masm)->
addptr(rtop, entry_size);
4318 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4318, _masm)->
bind(entry);
4319 // check if bottom reached
4320 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4320, _masm)->
cmpptr(rtop, rbot);
4321 // if not at bottom then check this entry
4322 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4322, _masm)->
jcc(Assembler::notEqual, loop);
4323 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4323, _masm)->
bind(exit);
4324 }
4325
4326 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4326, _masm)->
testptr(rmon, rmon); // check if a slot has been found
4327 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4327, _masm)->
jcc(Assembler::notZero, allocated); // if found, continue with that one
4328
4329 // allocate one if there's no free slot
4330 {
4331 Label entry, loop;
4332 // 1. compute new pointers // rsp: old expression stack top
4333 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4333, _masm)->
movptr(rmon, monitor_block_bot); // rmon: old expression stack bottom
4334 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4334, _masm)->
subptr(rsp, entry_size); // move expression stack top
4335 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4335, _masm)->
subptr(rmon, entry_size); // move expression stack bottom
4336 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4336, _masm)->
mov(rtop, rsp); // set start value for copy loop
4337 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4337, _masm)->
movptr(monitor_block_bot, rmon); // set new monitor block bottom
4338 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4338, _masm)->
jmp(entry);
4339 // 2. move expression stack contents
4340 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4340, _masm)->
bind(loop);
4341 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4341, _masm)->
movptr(rbot, Address(rtop, entry_size)); // load expression stack
4342 // word from old location
4343 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4343, _masm)->
movptr(Address(rtop, 0), rbot); // and store it at new location
4344 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4344, _masm)->
addptr(rtop, wordSize); // advance to next word
4345 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4345, _masm)->
bind(entry);
4346 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4346, _masm)->
cmpptr(rtop, rmon); // check if bottom reached
4347 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4347, _masm)->
jcc(Assembler::notEqual, loop); // if not at bottom then
4348 // copy next word
4349 }
4350
4351 // call run-time routine
4352 // rmon: points to monitor entry
4353 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4353, _masm)->
bind(allocated);
4354
4355 // Increment bcp to point to the next bytecode, so exception
4356 // handling for async. exceptions work correctly.
4357 // The object has already been poped from the stack, so the
4358 // expression stack looks correct.
4359 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4359, _masm)->
increment(rbcp);
4360
4361 // store object
4362 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4362, _masm)->
movptr(Address(rmon, BasicObjectLock::obj_offset_in_bytes()), rax);
4363 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4363, _masm)->
lock_object(rmon);
4364
4365 // check to make sure this monitor doesn't cause stack overflow after locking
4366 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4366, _masm)->
save_bcp(); // in case of exception
4367 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4367, _masm)->
generate_stack_overflow_check(0);
4368
4369 // The bcp has already been incremented. Just need to dispatch to
4370 // next instruction.
4371 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4371, _masm)->
dispatch_next(vtos);
4372}
4373
4374void TemplateTable::monitorexit() {
4375 transition(atos, vtos);
4376
4377 // check for NULL object
4378 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4378, _masm)->
null_check(rax);
4379
4380 const Address monitor_block_top(
4381 rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
4382 const Address monitor_block_bot(
4383 rbp, frame::interpreter_frame_initial_sp_offset * wordSize);
4384 const int entry_size = frame::interpreter_frame_monitor_size() * wordSize;
4385
4386 Register rtop = LP64_ONLY(c_rarg1)c_rarg1 NOT_LP64(rdx);
4387 Register rbot = LP64_ONLY(c_rarg2)c_rarg2 NOT_LP64(rbx);
4388
4389 Label found;
4390
4391 // find matching slot
4392 {
4393 Label entry, loop;
4394 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4394, _masm)->
movptr(rtop, monitor_block_top); // points to current entry,
4395 // starting with top-most entry
4396 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4396, _masm)->
lea(rbot, monitor_block_bot); // points to word before bottom
4397 // of monitor block
4398 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4398, _masm)->
jmpb(entry)jmpb_0(entry, "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4398)
;
4399
4400 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4400, _masm)->
bind(loop);
4401 // check if current entry is for same object
4402 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4402, _masm)->
cmpptr(rax, Address(rtop, BasicObjectLock::obj_offset_in_bytes()));
4403 // if same object then stop searching
4404 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4404, _masm)->
jcc(Assembler::equal, found);
4405 // otherwise advance to next entry
4406 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4406, _masm)->
addptr(rtop, entry_size);
4407 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4407, _masm)->
bind(entry);
4408 // check if bottom reached
4409 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4409, _masm)->
cmpptr(rtop, rbot);
4410 // if not at bottom then check this entry
4411 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4411, _masm)->
jcc(Assembler::notEqual, loop);
4412 }
4413
4414 // error handling. Unlocking was not block-structured
4415 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4415, _masm)->
call_VM(noreg, CAST_FROM_FN_PTR(address,((address)((address_word)(InterpreterRuntime::throw_illegal_monitor_state_exception
)))
4416 InterpreterRuntime::throw_illegal_monitor_state_exception)((address)((address_word)(InterpreterRuntime::throw_illegal_monitor_state_exception
)))
);
4417 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4417, _masm)->
should_not_reach_here();
4418
4419 // call run-time routine
4420 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4420, _masm)->
bind(found);
4421 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4421, _masm)->
push_ptr(rax); // make sure object is on stack (contract with oopMaps)
4422 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4422, _masm)->
unlock_object(rtop);
4423 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4423, _masm)->
pop_ptr(rax); // discard object
4424}
4425
4426// Wide instructions
4427void TemplateTable::wide() {
4428 transition(vtos, vtos);
4429 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4429, _masm)->
load_unsigned_byte(rbx, at_bcp(1));
4430 ExternalAddress wtable((address)Interpreter::_wentry_point);
4431 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4431, _masm)->
jump(ArrayAddress(wtable, Address(noreg, rbx, Address::times_ptr)));
4432 // Note: the rbcp increment step is part of the individual wide bytecode implementations
4433}
4434
4435// Multi arrays
4436void TemplateTable::multianewarray() {
4437 transition(vtos, atos);
4438
4439 Register rarg = LP64_ONLY(c_rarg1)c_rarg1 NOT_LP64(rax);
4440 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4440, _masm)->
load_unsigned_byte(rax, at_bcp(3)); // get number of dimensions
4441 // last dim is on top of stack; we want address of first one:
4442 // first_addr = last_addr + (ndims - 1) * stackElementSize - 1*wordsize
4443 // the latter wordSize to point to the beginning of the array.
4444 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4444, _masm)->
lea(rarg, Address(rsp, rax, Interpreter::stackElementScale(), -wordSize));
4445 call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray)((address)((address_word)(InterpreterRuntime::multianewarray)
))
, rarg);
4446 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4446, _masm)->
load_unsigned_byte(rbx, at_bcp(3));
4447 __Disassembler::hook<InterpreterMacroAssembler>("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/templateTable_x86.cpp"
, 4447, _masm)->
lea(rsp, Address(rsp, rbx, Interpreter::stackElementScale())); // get rid of counts
4448}