Bug Summary

File:jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp
Warning:line 178, column 29
Called C++ object pointer is null

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

/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) {
1
Assuming 'UseSSE' is >= 2
2
Taking true branch
1585 switch (op) {
3
Control jumps to 'case rem:' at line 1604
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)
;
4
Passing null pointer value via 2nd parameter 'src'
5
Calling 'MacroAssembler::movdbl'
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() +
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}

/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp

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#ifndef CPU_X86_MACROASSEMBLER_X86_HPP
26#define CPU_X86_MACROASSEMBLER_X86_HPP
27
28#include "asm/assembler.hpp"
29#include "code/vmreg.inline.hpp"
30#include "compiler/oopMap.hpp"
31#include "utilities/macros.hpp"
32#include "runtime/rtmLocking.hpp"
33#include "runtime/vm_version.hpp"
34
35// MacroAssembler extends Assembler by frequently used macros.
36//
37// Instructions for which a 'better' code sequence exists depending
38// on arguments should also go in here.
39
40class MacroAssembler: public Assembler {
41 friend class LIR_Assembler;
42 friend class Runtime1; // as_Address()
43
44 public:
45 // Support for VM calls
46 //
47 // This is the base routine called by the different versions of call_VM_leaf. The interpreter
48 // may customize this version by overriding it for its purposes (e.g., to save/restore
49 // additional registers when doing a VM call).
50
51 virtual void call_VM_leaf_base(
52 address entry_point, // the entry point
53 int number_of_arguments // the number of arguments to pop after the call
54 );
55
56 protected:
57 // This is the base routine called by the different versions of call_VM. The interpreter
58 // may customize this version by overriding it for its purposes (e.g., to save/restore
59 // additional registers when doing a VM call).
60 //
61 // If no java_thread register is specified (noreg) than rdi will be used instead. call_VM_base
62 // returns the register which contains the thread upon return. If a thread register has been
63 // specified, the return value will correspond to that register. If no last_java_sp is specified
64 // (noreg) than rsp will be used instead.
65 virtual void call_VM_base( // returns the register containing the thread upon return
66 Register oop_result, // where an oop-result ends up if any; use noreg otherwise
67 Register java_thread, // the thread if computed before ; use noreg otherwise
68 Register last_java_sp, // to set up last_Java_frame in stubs; use noreg otherwise
69 address entry_point, // the entry point
70 int number_of_arguments, // the number of arguments (w/o thread) to pop after the call
71 bool check_exceptions // whether to check for pending exceptions after return
72 );
73
74 void call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions = true);
75
76 // helpers for FPU flag access
77 // tmp is a temporary register, if none is available use noreg
78 void save_rax (Register tmp);
79 void restore_rax(Register tmp);
80
81 public:
82 MacroAssembler(CodeBuffer* code) : Assembler(code) {}
83
84 // These routines should emit JVMTI PopFrame and ForceEarlyReturn handling code.
85 // The implementation is only non-empty for the InterpreterMacroAssembler,
86 // as only the interpreter handles PopFrame and ForceEarlyReturn requests.
87 virtual void check_and_handle_popframe(Register java_thread);
88 virtual void check_and_handle_earlyret(Register java_thread);
89
90 Address as_Address(AddressLiteral adr);
91 Address as_Address(ArrayAddress adr);
92
93 // Support for NULL-checks
94 //
95 // Generates code that causes a NULL OS exception if the content of reg is NULL.
96 // If the accessed location is M[reg + offset] and the offset is known, provide the
97 // offset. No explicit code generation is needed if the offset is within a certain
98 // range (0 <= offset <= page_size).
99
100 void null_check(Register reg, int offset = -1);
101 static bool needs_explicit_null_check(intptr_t offset);
102 static bool uses_implicit_null_check(void* address);
103
104 // Required platform-specific helpers for Label::patch_instructions.
105 // They _shadow_ the declarations in AbstractAssembler, which are undefined.
106 void pd_patch_instruction(address branch, address target, const char* file, int line) {
107 unsigned char op = branch[0];
108 assert(op == 0xE8 /* call */ ||do { if (!(op == 0xE8 || op == 0xE9 || op == 0xEB || (op &
0xF0) == 0x70 || op == 0x0F && (branch[1] & 0xF0
) == 0x80 || op == 0xC7 && branch[1] == 0xF8)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp"
, 114, "assert(" "op == 0xE8 || op == 0xE9 || op == 0xEB || (op & 0xF0) == 0x70 || op == 0x0F && (branch[1] & 0xF0) == 0x80 || op == 0xC7 && branch[1] == 0xF8"
") failed", "Invalid opcode at patch point"); ::breakpoint()
; } } while (0)
109 op == 0xE9 /* jmp */ ||do { if (!(op == 0xE8 || op == 0xE9 || op == 0xEB || (op &
0xF0) == 0x70 || op == 0x0F && (branch[1] & 0xF0
) == 0x80 || op == 0xC7 && branch[1] == 0xF8)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp"
, 114, "assert(" "op == 0xE8 || op == 0xE9 || op == 0xEB || (op & 0xF0) == 0x70 || op == 0x0F && (branch[1] & 0xF0) == 0x80 || op == 0xC7 && branch[1] == 0xF8"
") failed", "Invalid opcode at patch point"); ::breakpoint()
; } } while (0)
110 op == 0xEB /* short jmp */ ||do { if (!(op == 0xE8 || op == 0xE9 || op == 0xEB || (op &
0xF0) == 0x70 || op == 0x0F && (branch[1] & 0xF0
) == 0x80 || op == 0xC7 && branch[1] == 0xF8)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp"
, 114, "assert(" "op == 0xE8 || op == 0xE9 || op == 0xEB || (op & 0xF0) == 0x70 || op == 0x0F && (branch[1] & 0xF0) == 0x80 || op == 0xC7 && branch[1] == 0xF8"
") failed", "Invalid opcode at patch point"); ::breakpoint()
; } } while (0)
111 (op & 0xF0) == 0x70 /* short jcc */ ||do { if (!(op == 0xE8 || op == 0xE9 || op == 0xEB || (op &
0xF0) == 0x70 || op == 0x0F && (branch[1] & 0xF0
) == 0x80 || op == 0xC7 && branch[1] == 0xF8)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp"
, 114, "assert(" "op == 0xE8 || op == 0xE9 || op == 0xEB || (op & 0xF0) == 0x70 || op == 0x0F && (branch[1] & 0xF0) == 0x80 || op == 0xC7 && branch[1] == 0xF8"
") failed", "Invalid opcode at patch point"); ::breakpoint()
; } } while (0)
112 op == 0x0F && (branch[1] & 0xF0) == 0x80 /* jcc */ ||do { if (!(op == 0xE8 || op == 0xE9 || op == 0xEB || (op &
0xF0) == 0x70 || op == 0x0F && (branch[1] & 0xF0
) == 0x80 || op == 0xC7 && branch[1] == 0xF8)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp"
, 114, "assert(" "op == 0xE8 || op == 0xE9 || op == 0xEB || (op & 0xF0) == 0x70 || op == 0x0F && (branch[1] & 0xF0) == 0x80 || op == 0xC7 && branch[1] == 0xF8"
") failed", "Invalid opcode at patch point"); ::breakpoint()
; } } while (0)
113 op == 0xC7 && branch[1] == 0xF8 /* xbegin */,do { if (!(op == 0xE8 || op == 0xE9 || op == 0xEB || (op &
0xF0) == 0x70 || op == 0x0F && (branch[1] & 0xF0
) == 0x80 || op == 0xC7 && branch[1] == 0xF8)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp"
, 114, "assert(" "op == 0xE8 || op == 0xE9 || op == 0xEB || (op & 0xF0) == 0x70 || op == 0x0F && (branch[1] & 0xF0) == 0x80 || op == 0xC7 && branch[1] == 0xF8"
") failed", "Invalid opcode at patch point"); ::breakpoint()
; } } while (0)
114 "Invalid opcode at patch point")do { if (!(op == 0xE8 || op == 0xE9 || op == 0xEB || (op &
0xF0) == 0x70 || op == 0x0F && (branch[1] & 0xF0
) == 0x80 || op == 0xC7 && branch[1] == 0xF8)) { (*g_assert_poison
) = 'X';; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp"
, 114, "assert(" "op == 0xE8 || op == 0xE9 || op == 0xEB || (op & 0xF0) == 0x70 || op == 0x0F && (branch[1] & 0xF0) == 0x80 || op == 0xC7 && branch[1] == 0xF8"
") failed", "Invalid opcode at patch point"); ::breakpoint()
; } } while (0)
;
115
116 if (op == 0xEB || (op & 0xF0) == 0x70) {
117 // short offset operators (jmp and jcc)
118 char* disp = (char*) &branch[1];
119 int imm8 = target - (address) &disp[1];
120 guarantee(this->is8bit(imm8), "Short forward jump exceeds 8-bit offset at %s:%d",do { if (!(this->is8bit(imm8))) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp"
, 121, "guarantee(" "this->is8bit(imm8)" ") failed", "Short forward jump exceeds 8-bit offset at %s:%d"
, file == __null ? "<NULL>" : file, line); ::breakpoint
(); } } while (0)
121 file == NULL ? "<NULL>" : file, line)do { if (!(this->is8bit(imm8))) { (*g_assert_poison) = 'X'
;; report_vm_error("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp"
, 121, "guarantee(" "this->is8bit(imm8)" ") failed", "Short forward jump exceeds 8-bit offset at %s:%d"
, file == __null ? "<NULL>" : file, line); ::breakpoint
(); } } while (0)
;
122 *disp = imm8;
123 } else {
124 int* disp = (int*) &branch[(op == 0x0F || op == 0xC7)? 2: 1];
125 int imm32 = target - (address) &disp[1];
126 *disp = imm32;
127 }
128 }
129
130 // The following 4 methods return the offset of the appropriate move instruction
131
132 // Support for fast byte/short loading with zero extension (depending on particular CPU)
133 int load_unsigned_byte(Register dst, Address src);
134 int load_unsigned_short(Register dst, Address src);
135
136 // Support for fast byte/short loading with sign extension (depending on particular CPU)
137 int load_signed_byte(Register dst, Address src);
138 int load_signed_short(Register dst, Address src);
139
140 // Support for sign-extension (hi:lo = extend_sign(lo))
141 void extend_sign(Register hi, Register lo);
142
143 // Load and store values by size and signed-ness
144 void load_sized_value(Register dst, Address src, size_t size_in_bytes, bool is_signed, Register dst2 = noreg);
145 void store_sized_value(Address dst, Register src, size_t size_in_bytes, Register src2 = noreg);
146
147 // Support for inc/dec with optimal instruction selection depending on value
148
149 void increment(Register reg, int value = 1) { LP64_ONLY(incrementq(reg, value))incrementq(reg, value) NOT_LP64(incrementl(reg, value)) ; }
150 void decrement(Register reg, int value = 1) { LP64_ONLY(decrementq(reg, value))decrementq(reg, value) NOT_LP64(decrementl(reg, value)) ; }
151
152 void decrementl(Address dst, int value = 1);
153 void decrementl(Register reg, int value = 1);
154
155 void decrementq(Register reg, int value = 1);
156 void decrementq(Address dst, int value = 1);
157
158 void incrementl(Address dst, int value = 1);
159 void incrementl(Register reg, int value = 1);
160
161 void incrementq(Register reg, int value = 1);
162 void incrementq(Address dst, int value = 1);
163
164 // Support optimal SSE move instructions.
165 void movflt(XMMRegister dst, XMMRegister src) {
166 if (dst-> encoding() == src->encoding()) return;
167 if (UseXmmRegToRegMoveAll) { movaps(dst, src); return; }
168 else { movss (dst, src); return; }
169 }
170 void movflt(XMMRegister dst, Address src) { movss(dst, src); }
171 void movflt(XMMRegister dst, AddressLiteral src);
172 void movflt(Address dst, XMMRegister src) { movss(dst, src); }
173
174 // Move with zero extension
175 void movfltz(XMMRegister dst, XMMRegister src) { movss(dst, src); }
176
177 void movdbl(XMMRegister dst, XMMRegister src) {
178 if (dst-> encoding() == src->encoding()) return;
6
Called C++ object pointer is null
179 if (UseXmmRegToRegMoveAll) { movapd(dst, src); return; }
180 else { movsd (dst, src); return; }
181 }
182
183 void movdbl(XMMRegister dst, AddressLiteral src);
184
185 void movdbl(XMMRegister dst, Address src) {
186 if (UseXmmLoadAndClearUpper) { movsd (dst, src); return; }
187 else { movlpd(dst, src); return; }
188 }
189 void movdbl(Address dst, XMMRegister src) { movsd(dst, src); }
190
191 void incrementl(AddressLiteral dst);
192 void incrementl(ArrayAddress dst);
193
194 void incrementq(AddressLiteral dst);
195
196 // Alignment
197 void align32();
198 void align64();
199 void align(int modulus);
200 void align(int modulus, int target);
201
202 // A 5 byte nop that is safe for patching (see patch_verified_entry)
203 void fat_nop();
204
205 // Stack frame creation/removal
206 void enter();
207 void leave();
208
209 // Support for getting the JavaThread pointer (i.e.; a reference to thread-local information)
210 // The pointer will be loaded into the thread register.
211 void get_thread(Register thread);
212
213#ifdef _LP641
214 // Support for argument shuffling
215
216 void move32_64(VMRegPair src, VMRegPair dst);
217 void long_move(VMRegPair src, VMRegPair dst);
218 void float_move(VMRegPair src, VMRegPair dst);
219 void double_move(VMRegPair src, VMRegPair dst);
220 void move_ptr(VMRegPair src, VMRegPair dst);
221 void object_move(OopMap* map,
222 int oop_handle_offset,
223 int framesize_in_slots,
224 VMRegPair src,
225 VMRegPair dst,
226 bool is_receiver,
227 int* receiver_offset);
228#endif // _LP64
229
230 // Support for VM calls
231 //
232 // It is imperative that all calls into the VM are handled via the call_VM macros.
233 // They make sure that the stack linkage is setup correctly. call_VM's correspond
234 // to ENTRY/ENTRY_X entry points while call_VM_leaf's correspond to LEAF entry points.
235
236
237 void call_VM(Register oop_result,
238 address entry_point,
239 bool check_exceptions = true);
240 void call_VM(Register oop_result,
241 address entry_point,
242 Register arg_1,
243 bool check_exceptions = true);
244 void call_VM(Register oop_result,
245 address entry_point,
246 Register arg_1, Register arg_2,
247 bool check_exceptions = true);
248 void call_VM(Register oop_result,
249 address entry_point,
250 Register arg_1, Register arg_2, Register arg_3,
251 bool check_exceptions = true);
252
253 // Overloadings with last_Java_sp
254 void call_VM(Register oop_result,
255 Register last_java_sp,
256 address entry_point,
257 int number_of_arguments = 0,
258 bool check_exceptions = true);
259 void call_VM(Register oop_result,
260 Register last_java_sp,
261 address entry_point,
262 Register arg_1, bool
263 check_exceptions = true);
264 void call_VM(Register oop_result,
265 Register last_java_sp,
266 address entry_point,
267 Register arg_1, Register arg_2,
268 bool check_exceptions = true);
269 void call_VM(Register oop_result,
270 Register last_java_sp,
271 address entry_point,
272 Register arg_1, Register arg_2, Register arg_3,
273 bool check_exceptions = true);
274
275 void get_vm_result (Register oop_result, Register thread);
276 void get_vm_result_2(Register metadata_result, Register thread);
277
278 // These always tightly bind to MacroAssembler::call_VM_base
279 // bypassing the virtual implementation
280 void super_call_VM(Register oop_result, Register last_java_sp, address entry_point, int number_of_arguments = 0, bool check_exceptions = true);
281 void super_call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, bool check_exceptions = true);
282 void super_call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, bool check_exceptions = true);
283 void super_call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, Register arg_3, bool check_exceptions = true);
284 void super_call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, Register arg_3, Register arg_4, bool check_exceptions = true);
285
286 void call_VM_leaf0(address entry_point);
287 void call_VM_leaf(address entry_point,
288 int number_of_arguments = 0);
289 void call_VM_leaf(address entry_point,
290 Register arg_1);
291 void call_VM_leaf(address entry_point,
292 Register arg_1, Register arg_2);
293 void call_VM_leaf(address entry_point,
294 Register arg_1, Register arg_2, Register arg_3);
295
296 // These always tightly bind to MacroAssembler::call_VM_leaf_base
297 // bypassing the virtual implementation
298 void super_call_VM_leaf(address entry_point);
299 void super_call_VM_leaf(address entry_point, Register arg_1);
300 void super_call_VM_leaf(address entry_point, Register arg_1, Register arg_2);
301 void super_call_VM_leaf(address entry_point, Register arg_1, Register arg_2, Register arg_3);
302 void super_call_VM_leaf(address entry_point, Register arg_1, Register arg_2, Register arg_3, Register arg_4);
303
304 // last Java Frame (fills frame anchor)
305 void set_last_Java_frame(Register thread,
306 Register last_java_sp,
307 Register last_java_fp,
308 address last_java_pc);
309
310 // thread in the default location (r15_thread on 64bit)
311 void set_last_Java_frame(Register last_java_sp,
312 Register last_java_fp,
313 address last_java_pc);
314
315 void reset_last_Java_frame(Register thread, bool clear_fp);
316
317 // thread in the default location (r15_thread on 64bit)
318 void reset_last_Java_frame(bool clear_fp);
319
320 // jobjects
321 void clear_jweak_tag(Register possibly_jweak);
322 void resolve_jobject(Register value, Register thread, Register tmp);
323
324 // C 'boolean' to Java boolean: x == 0 ? 0 : 1
325 void c2bool(Register x);
326
327 // C++ bool manipulation
328
329 void movbool(Register dst, Address src);
330 void movbool(Address dst, bool boolconst);
331 void movbool(Address dst, Register src);
332 void testbool(Register dst);
333
334 void resolve_oop_handle(Register result, Register tmp = rscratch2);
335 void resolve_weak_handle(Register result, Register tmp);
336 void load_mirror(Register mirror, Register method, Register tmp = rscratch2);
337 void load_method_holder_cld(Register rresult, Register rmethod);
338
339 void load_method_holder(Register holder, Register method);
340
341 // oop manipulations
342 void load_klass(Register dst, Register src, Register tmp);
343 void store_klass(Register dst, Register src, Register tmp);
344
345 void access_load_at(BasicType type, DecoratorSet decorators, Register dst, Address src,
346 Register tmp1, Register thread_tmp);
347 void access_store_at(BasicType type, DecoratorSet decorators, Address dst, Register src,
348 Register tmp1, Register tmp2);
349
350 void load_heap_oop(Register dst, Address src, Register tmp1 = noreg,
351 Register thread_tmp = noreg, DecoratorSet decorators = 0);
352 void load_heap_oop_not_null(Register dst, Address src, Register tmp1 = noreg,
353 Register thread_tmp = noreg, DecoratorSet decorators = 0);
354 void store_heap_oop(Address dst, Register src, Register tmp1 = noreg,
355 Register tmp2 = noreg, DecoratorSet decorators = 0);
356
357 // Used for storing NULL. All other oop constants should be
358 // stored using routines that take a jobject.
359 void store_heap_oop_null(Address dst);
360
361#ifdef _LP641
362 void store_klass_gap(Register dst, Register src);
363
364 // This dummy is to prevent a call to store_heap_oop from
365 // converting a zero (like NULL) into a Register by giving
366 // the compiler two choices it can't resolve
367
368 void store_heap_oop(Address dst, void* dummy);
369
370 void encode_heap_oop(Register r);
371 void decode_heap_oop(Register r);
372 void encode_heap_oop_not_null(Register r);
373 void decode_heap_oop_not_null(Register r);
374 void encode_heap_oop_not_null(Register dst, Register src);
375 void decode_heap_oop_not_null(Register dst, Register src);
376
377 void set_narrow_oop(Register dst, jobject obj);
378 void set_narrow_oop(Address dst, jobject obj);
379 void cmp_narrow_oop(Register dst, jobject obj);
380 void cmp_narrow_oop(Address dst, jobject obj);
381
382 void encode_klass_not_null(Register r, Register tmp);
383 void decode_klass_not_null(Register r, Register tmp);
384 void encode_and_move_klass_not_null(Register dst, Register src);
385 void decode_and_move_klass_not_null(Register dst, Register src);
386 void set_narrow_klass(Register dst, Klass* k);
387 void set_narrow_klass(Address dst, Klass* k);
388 void cmp_narrow_klass(Register dst, Klass* k);
389 void cmp_narrow_klass(Address dst, Klass* k);
390
391 // if heap base register is used - reinit it with the correct value
392 void reinit_heapbase();
393
394 DEBUG_ONLY(void verify_heapbase(const char* msg);)void verify_heapbase(const char* msg);
395
396#endif // _LP64
397
398 // Int division/remainder for Java
399 // (as idivl, but checks for special case as described in JVM spec.)
400 // returns idivl instruction offset for implicit exception handling
401 int corrected_idivl(Register reg);
402
403 // Long division/remainder for Java
404 // (as idivq, but checks for special case as described in JVM spec.)
405 // returns idivq instruction offset for implicit exception handling
406 int corrected_idivq(Register reg);
407
408 void int3();
409
410 // Long operation macros for a 32bit cpu
411 // Long negation for Java
412 void lneg(Register hi, Register lo);
413
414 // Long multiplication for Java
415 // (destroys contents of eax, ebx, ecx and edx)
416 void lmul(int x_rsp_offset, int y_rsp_offset); // rdx:rax = x * y
417
418 // Long shifts for Java
419 // (semantics as described in JVM spec.)
420 void lshl(Register hi, Register lo); // hi:lo << (rcx & 0x3f)
421 void lshr(Register hi, Register lo, bool sign_extension = false); // hi:lo >> (rcx & 0x3f)
422
423 // Long compare for Java
424 // (semantics as described in JVM spec.)
425 void lcmp2int(Register x_hi, Register x_lo, Register y_hi, Register y_lo); // x_hi = lcmp(x, y)
426
427
428 // misc
429
430 // Sign extension
431 void sign_extend_short(Register reg);
432 void sign_extend_byte(Register reg);
433
434 // Division by power of 2, rounding towards 0
435 void division_with_shift(Register reg, int shift_value);
436
437#ifndef _LP641
438 // Compares the top-most stack entries on the FPU stack and sets the eflags as follows:
439 //
440 // CF (corresponds to C0) if x < y
441 // PF (corresponds to C2) if unordered
442 // ZF (corresponds to C3) if x = y
443 //
444 // The arguments are in reversed order on the stack (i.e., top of stack is first argument).
445 // tmp is a temporary register, if none is available use noreg (only matters for non-P6 code)
446 void fcmp(Register tmp);
447 // Variant of the above which allows y to be further down the stack
448 // and which only pops x and y if specified. If pop_right is
449 // specified then pop_left must also be specified.
450 void fcmp(Register tmp, int index, bool pop_left, bool pop_right);
451
452 // Floating-point comparison for Java
453 // Compares the top-most stack entries on the FPU stack and stores the result in dst.
454 // The arguments are in reversed order on the stack (i.e., top of stack is first argument).
455 // (semantics as described in JVM spec.)
456 void fcmp2int(Register dst, bool unordered_is_less);
457 // Variant of the above which allows y to be further down the stack
458 // and which only pops x and y if specified. If pop_right is
459 // specified then pop_left must also be specified.
460 void fcmp2int(Register dst, bool unordered_is_less, int index, bool pop_left, bool pop_right);
461
462 // Floating-point remainder for Java (ST0 = ST0 fremr ST1, ST1 is empty afterwards)
463 // tmp is a temporary register, if none is available use noreg
464 void fremr(Register tmp);
465
466 // only if +VerifyFPU
467 void verify_FPU(int stack_depth, const char* s = "illegal FPU state");
468#endif // !LP64
469
470 // dst = c = a * b + c
471 void fmad(XMMRegister dst, XMMRegister a, XMMRegister b, XMMRegister c);
472 void fmaf(XMMRegister dst, XMMRegister a, XMMRegister b, XMMRegister c);
473
474 void vfmad(XMMRegister dst, XMMRegister a, XMMRegister b, XMMRegister c, int vector_len);
475 void vfmaf(XMMRegister dst, XMMRegister a, XMMRegister b, XMMRegister c, int vector_len);
476 void vfmad(XMMRegister dst, XMMRegister a, Address b, XMMRegister c, int vector_len);
477 void vfmaf(XMMRegister dst, XMMRegister a, Address b, XMMRegister c, int vector_len);
478
479
480 // same as fcmp2int, but using SSE2
481 void cmpss2int(XMMRegister opr1, XMMRegister opr2, Register dst, bool unordered_is_less);
482 void cmpsd2int(XMMRegister opr1, XMMRegister opr2, Register dst, bool unordered_is_less);
483
484 // branch to L if FPU flag C2 is set/not set
485 // tmp is a temporary register, if none is available use noreg
486 void jC2 (Register tmp, Label& L);
487 void jnC2(Register tmp, Label& L);
488
489 // Load float value from 'address'. If UseSSE >= 1, the value is loaded into
490 // register xmm0. Otherwise, the value is loaded onto the FPU stack.
491 void load_float(Address src);
492
493 // Store float value to 'address'. If UseSSE >= 1, the value is stored
494 // from register xmm0. Otherwise, the value is stored from the FPU stack.
495 void store_float(Address dst);
496
497 // Load double value from 'address'. If UseSSE >= 2, the value is loaded into
498 // register xmm0. Otherwise, the value is loaded onto the FPU stack.
499 void load_double(Address src);
500
501 // Store double value to 'address'. If UseSSE >= 2, the value is stored
502 // from register xmm0. Otherwise, the value is stored from the FPU stack.
503 void store_double(Address dst);
504
505#ifndef _LP641
506 // Pop ST (ffree & fincstp combined)
507 void fpop();
508
509 void empty_FPU_stack();
510#endif // !_LP64
511
512 void push_IU_state();
513 void pop_IU_state();
514
515 void push_FPU_state();
516 void pop_FPU_state();
517
518 void push_CPU_state();
519 void pop_CPU_state();
520
521 // Round up to a power of two
522 void round_to(Register reg, int modulus);
523
524 // Callee saved registers handling
525 void push_callee_saved_registers();
526 void pop_callee_saved_registers();
527
528 // allocation
529 void eden_allocate(
530 Register thread, // Current thread
531 Register obj, // result: pointer to object after successful allocation
532 Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
533 int con_size_in_bytes, // object size in bytes if known at compile time
534 Register t1, // temp register
535 Label& slow_case // continuation point if fast allocation fails
536 );
537 void tlab_allocate(
538 Register thread, // Current thread
539 Register obj, // result: pointer to object after successful allocation
540 Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
541 int con_size_in_bytes, // object size in bytes if known at compile time
542 Register t1, // temp register
543 Register t2, // temp register
544 Label& slow_case // continuation point if fast allocation fails
545 );
546 void zero_memory(Register address, Register length_in_bytes, int offset_in_bytes, Register temp);
547
548 // interface method calling
549 void lookup_interface_method(Register recv_klass,
550 Register intf_klass,
551 RegisterOrConstant itable_index,
552 Register method_result,
553 Register scan_temp,
554 Label& no_such_interface,
555 bool return_method = true);
556
557 // virtual method calling
558 void lookup_virtual_method(Register recv_klass,
559 RegisterOrConstant vtable_index,
560 Register method_result);
561
562 // Test sub_klass against super_klass, with fast and slow paths.
563
564 // The fast path produces a tri-state answer: yes / no / maybe-slow.
565 // One of the three labels can be NULL, meaning take the fall-through.
566 // If super_check_offset is -1, the value is loaded up from super_klass.
567 // No registers are killed, except temp_reg.
568 void check_klass_subtype_fast_path(Register sub_klass,
569 Register super_klass,
570 Register temp_reg,
571 Label* L_success,
572 Label* L_failure,
573 Label* L_slow_path,
574 RegisterOrConstant super_check_offset = RegisterOrConstant(-1));
575
576 // The rest of the type check; must be wired to a corresponding fast path.
577 // It does not repeat the fast path logic, so don't use it standalone.
578 // The temp_reg and temp2_reg can be noreg, if no temps are available.
579 // Updates the sub's secondary super cache as necessary.
580 // If set_cond_codes, condition codes will be Z on success, NZ on failure.
581 void check_klass_subtype_slow_path(Register sub_klass,
582 Register super_klass,
583 Register temp_reg,
584 Register temp2_reg,
585 Label* L_success,
586 Label* L_failure,
587 bool set_cond_codes = false);
588
589 // Simplified, combined version, good for typical uses.
590 // Falls through on failure.
591 void check_klass_subtype(Register sub_klass,
592 Register super_klass,
593 Register temp_reg,
594 Label& L_success);
595
596 void clinit_barrier(Register klass,
597 Register thread,
598 Label* L_fast_path = NULL__null,
599 Label* L_slow_path = NULL__null);
600
601 // method handles (JSR 292)
602 Address argument_address(RegisterOrConstant arg_slot, int extra_slot_offset = 0);
603
604 // Debugging
605
606 // only if +VerifyOops
607 void _verify_oop(Register reg, const char* s, const char* file, int line);
608 void _verify_oop_addr(Address addr, const char* s, const char* file, int line);
609
610 void _verify_oop_checked(Register reg, const char* s, const char* file, int line) {
611 if (VerifyOops) {
612 _verify_oop(reg, s, file, line);
613 }
614 }
615 void _verify_oop_addr_checked(Address reg, const char* s, const char* file, int line) {
616 if (VerifyOops) {
617 _verify_oop_addr(reg, s, file, line);
618 }
619 }
620
621 // TODO: verify method and klass metadata (compare against vptr?)
622 void _verify_method_ptr(Register reg, const char * msg, const char * file, int line) {}
623 void _verify_klass_ptr(Register reg, const char * msg, const char * file, int line){}
624
625#define verify_oop(reg)_verify_oop_checked(reg, "broken oop " "reg", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp"
, 625)
_verify_oop_checked(reg, "broken oop " #reg, __FILE__"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp", __LINE__625)
626#define verify_oop_msg(reg, msg)_verify_oop_checked(reg, "broken oop " "reg" ", " "msg", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp"
, 626)
_verify_oop_checked(reg, "broken oop " #reg ", " #msg, __FILE__"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp", __LINE__626)
627#define verify_oop_addr(addr)_verify_oop_addr_checked(addr, "broken oop addr " "addr", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp"
, 627)
_verify_oop_addr_checked(addr, "broken oop addr " #addr, __FILE__"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp", __LINE__627)
628#define verify_method_ptr(reg)_verify_method_ptr(reg, "broken method " "reg", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp"
, 628)
_verify_method_ptr(reg, "broken method " #reg, __FILE__"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp", __LINE__628)
629#define verify_klass_ptr(reg)_verify_klass_ptr(reg, "broken klass " "reg", "/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp"
, 629)
_verify_klass_ptr(reg, "broken klass " #reg, __FILE__"/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp", __LINE__629)
630
631 // Verify or restore cpu control state after JNI call
632 void restore_cpu_control_state_after_jni();
633
634 // prints msg, dumps registers and stops execution
635 void stop(const char* msg);
636
637 // prints msg and continues
638 void warn(const char* msg);
639
640 // dumps registers and other state
641 void print_state();
642
643 static void debug32(int rdi, int rsi, int rbp, int rsp, int rbx, int rdx, int rcx, int rax, int eip, char* msg);
644 static void debug64(char* msg, int64_t pc, int64_t regs[]);
645 static void print_state32(int rdi, int rsi, int rbp, int rsp, int rbx, int rdx, int rcx, int rax, int eip);
646 static void print_state64(int64_t pc, int64_t regs[]);
647
648 void os_breakpoint();
649
650 void untested() { stop("untested"); }
651
652 void unimplemented(const char* what = "");
653
654 void should_not_reach_here() { stop("should not reach here"); }
655
656 void print_CPU_state();
657
658 // Stack overflow checking
659 void bang_stack_with_offset(int offset) {
660 // stack grows down, caller passes positive offset
661 assert(offset > 0, "must bang with negative offset")do { if (!(offset > 0)) { (*g_assert_poison) = 'X';; report_vm_error
("/home/daniel/Projects/java/jdk/src/hotspot/cpu/x86/macroAssembler_x86.hpp"
, 661, "assert(" "offset > 0" ") failed", "must bang with negative offset"
); ::breakpoint(); } } while (0)
;
662 movl(Address(rsp, (-offset)), rax);
663 }
664
665 // Writes to stack successive pages until offset reached to check for
666 // stack overflow + shadow pages. Also, clobbers tmp
667 void bang_stack_size(Register size, Register tmp);
668
669 // Check for reserved stack access in method being exited (for JIT)
670 void reserved_stack_check();
671
672 void safepoint_poll(Label& slow_path, Register thread_reg, bool at_return, bool in_nmethod);
673
674 void verify_tlab();
675
676 Condition negate_condition(Condition cond);
677
678 // Instructions that use AddressLiteral operands. These instruction can handle 32bit/64bit
679 // operands. In general the names are modified to avoid hiding the instruction in Assembler
680 // so that we don't need to implement all the varieties in the Assembler with trivial wrappers
681 // here in MacroAssembler. The major exception to this rule is call
682
683 // Arithmetics
684
685
686 void addptr(Address dst, int32_t src) { LP64_ONLY(addq(dst, src))addq(dst, src) NOT_LP64(addl(dst, src)) ; }
687 void addptr(Address dst, Register src);
688
689 void addptr(Register dst, Address src) { LP64_ONLY(addq(dst, src))addq(dst, src) NOT_LP64(addl(dst, src)); }
690 void addptr(Register dst, int32_t src);
691 void addptr(Register dst, Register src);
692 void addptr(Register dst, RegisterOrConstant src) {
693 if (src.is_constant()) addptr(dst, (int) src.as_constant());
694 else addptr(dst, src.as_register());
695 }
696
697 void andptr(Register dst, int32_t src);
698 void andptr(Register src1, Register src2) { LP64_ONLY(andq(src1, src2))andq(src1, src2) NOT_LP64(andl(src1, src2)) ; }
699
700 void cmp8(AddressLiteral src1, int imm);
701
702 // renamed to drag out the casting of address to int32_t/intptr_t
703 void cmp32(Register src1, int32_t imm);
704
705 void cmp32(AddressLiteral src1, int32_t imm);
706 // compare reg - mem, or reg - &mem
707 void cmp32(Register src1, AddressLiteral src2);
708
709 void cmp32(Register src1, Address src2);
710
711#ifndef _LP641
712 void cmpklass(Address dst, Metadata* obj);
713 void cmpklass(Register dst, Metadata* obj);
714 void cmpoop(Address dst, jobject obj);
715#endif // _LP64
716
717 void cmpoop(Register src1, Register src2);
718 void cmpoop(Register src1, Address src2);
719 void cmpoop(Register dst, jobject obj);
720
721 // NOTE src2 must be the lval. This is NOT an mem-mem compare
722 void cmpptr(Address src1, AddressLiteral src2);
723
724 void cmpptr(Register src1, AddressLiteral src2);
725
726 void cmpptr(Register src1, Register src2) { LP64_ONLY(cmpq(src1, src2))cmpq(src1, src2) NOT_LP64(cmpl(src1, src2)) ; }
727 void cmpptr(Register src1, Address src2) { LP64_ONLY(cmpq(src1, src2))cmpq(src1, src2) NOT_LP64(cmpl(src1, src2)) ; }
728 // void cmpptr(Address src1, Register src2) { LP64_ONLY(cmpq(src1, src2)) NOT_LP64(cmpl(src1, src2)) ; }
729
730 void cmpptr(Register src1, int32_t src2) { LP64_ONLY(cmpq(src1, src2))cmpq(src1, src2) NOT_LP64(cmpl(src1, src2)) ; }
731 void cmpptr(Address src1, int32_t src2) { LP64_ONLY(cmpq(src1, src2))cmpq(src1, src2) NOT_LP64(cmpl(src1, src2)) ; }
732
733 // cmp64 to avoild hiding cmpq
734 void cmp64(Register src1, AddressLiteral src);
735
736 void cmpxchgptr(Register reg, Address adr);
737
738 void locked_cmpxchgptr(Register reg, AddressLiteral adr);
739
740
741 void imulptr(Register dst, Register src) { LP64_ONLY(imulq(dst, src))imulq(dst, src) NOT_LP64(imull(dst, src)); }
742 void imulptr(Register dst, Register src, int imm32) { LP64_ONLY(imulq(dst, src, imm32))imulq(dst, src, imm32) NOT_LP64(imull(dst, src, imm32)); }
743
744
745 void negptr(Register dst) { LP64_ONLY(negq(dst))negq(dst) NOT_LP64(negl(dst)); }
746
747 void notptr(Register dst) { LP64_ONLY(notq(dst))notq(dst) NOT_LP64(notl(dst)); }
748
749 void shlptr(Register dst, int32_t shift);
750 void shlptr(Register dst) { LP64_ONLY(shlq(dst))shlq(dst) NOT_LP64(shll(dst)); }
751
752 void shrptr(Register dst, int32_t shift);
753 void shrptr(Register dst) { LP64_ONLY(shrq(dst))shrq(dst) NOT_LP64(shrl(dst)); }
754
755 void sarptr(Register dst) { LP64_ONLY(sarq(dst))sarq(dst) NOT_LP64(sarl(dst)); }
756 void sarptr(Register dst, int32_t src) { LP64_ONLY(sarq(dst, src))sarq(dst, src) NOT_LP64(sarl(dst, src)); }
757
758 void subptr(Address dst, int32_t src) { LP64_ONLY(subq(dst, src))subq(dst, src) NOT_LP64(subl(dst, src)); }
759
760 void subptr(Register dst, Address src) { LP64_ONLY(subq(dst, src))subq(dst, src) NOT_LP64(subl(dst, src)); }
761 void subptr(Register dst, int32_t src);
762 // Force generation of a 4 byte immediate value even if it fits into 8bit
763 void subptr_imm32(Register dst, int32_t src);
764 void subptr(Register dst, Register src);
765 void subptr(Register dst, RegisterOrConstant src) {
766 if (src.is_constant()) subptr(dst, (int) src.as_constant());
767 else subptr(dst, src.as_register());
768 }
769
770 void sbbptr(Address dst, int32_t src) { LP64_ONLY(sbbq(dst, src))sbbq(dst, src) NOT_LP64(sbbl(dst, src)); }
771 void sbbptr(Register dst, int32_t src) { LP64_ONLY(sbbq(dst, src))sbbq(dst, src) NOT_LP64(sbbl(dst, src)); }
772
773 void xchgptr(Register src1, Register src2) { LP64_ONLY(xchgq(src1, src2))xchgq(src1, src2) NOT_LP64(xchgl(src1, src2)) ; }
774 void xchgptr(Register src1, Address src2) { LP64_ONLY(xchgq(src1, src2))xchgq(src1, src2) NOT_LP64(xchgl(src1, src2)) ; }
775
776 void xaddptr(Address src1, Register src2) { LP64_ONLY(xaddq(src1, src2))xaddq(src1, src2) NOT_LP64(xaddl(src1, src2)) ; }
777
778
779
780 // Helper functions for statistics gathering.
781 // Conditionally (atomically, on MPs) increments passed counter address, preserving condition codes.
782 void cond_inc32(Condition cond, AddressLiteral counter_addr);
783 // Unconditional atomic increment.
784 void atomic_incl(Address counter_addr);
785 void atomic_incl(AddressLiteral counter_addr, Register scr = rscratch1);
786#ifdef _LP641
787 void atomic_incq(Address counter_addr);
788 void atomic_incq(AddressLiteral counter_addr, Register scr = rscratch1);
789#endif
790 void atomic_incptr(AddressLiteral counter_addr, Register scr = rscratch1) { LP64_ONLY(atomic_incq(counter_addr, scr))atomic_incq(counter_addr, scr) NOT_LP64(atomic_incl(counter_addr, scr)) ; }
791 void atomic_incptr(Address counter_addr) { LP64_ONLY(atomic_incq(counter_addr))atomic_incq(counter_addr) NOT_LP64(atomic_incl(counter_addr)) ; }
792
793 void lea(Register dst, AddressLiteral adr);
794 void lea(Address dst, AddressLiteral adr);
795 void lea(Register dst, Address adr) { Assembler::lea(dst, adr); }
796
797 void leal32(Register dst, Address src) { leal(dst, src); }
798
799 // Import other testl() methods from the parent class or else
800 // they will be hidden by the following overriding declaration.
801 using Assembler::testl;
802 void testl(Register dst, AddressLiteral src);
803
804 void orptr(Register dst, Address src) { LP64_ONLY(orq(dst, src))orq(dst, src) NOT_LP64(orl(dst, src)); }
805 void orptr(Register dst, Register src) { LP64_ONLY(orq(dst, src))orq(dst, src) NOT_LP64(orl(dst, src)); }
806 void orptr(Register dst, int32_t src) { LP64_ONLY(orq(dst, src))orq(dst, src) NOT_LP64(orl(dst, src)); }
807 void orptr(Address dst, int32_t imm32) { LP64_ONLY(orq(dst, imm32))orq(dst, imm32) NOT_LP64(orl(dst, imm32)); }
808
809 void testptr(Register src, int32_t imm32) { LP64_ONLY(testq(src, imm32))testq(src, imm32) NOT_LP64(testl(src, imm32)); }
810 void testptr(Register src1, Address src2) { LP64_ONLY(testq(src1, src2))testq(src1, src2) NOT_LP64(testl(src1, src2)); }
811 void testptr(Register src1, Register src2);
812
813 void xorptr(Register dst, Register src) { LP64_ONLY(xorq(dst, src))xorq(dst, src) NOT_LP64(xorl(dst, src)); }
814 void xorptr(Register dst, Address src) { LP64_ONLY(xorq(dst, src))xorq(dst, src) NOT_LP64(xorl(dst, src)); }
815
816 // Calls
817
818 void call(Label& L, relocInfo::relocType rtype);
819 void call(Register entry);
820 void call(Address addr) { Assembler::call(addr); }
821
822 // NOTE: this call transfers to the effective address of entry NOT
823 // the address contained by entry. This is because this is more natural
824 // for jumps/calls.
825 void call(AddressLiteral entry);
826
827 // Emit the CompiledIC call idiom
828 void ic_call(address entry, jint method_index = 0);
829
830 // Jumps
831
832 // NOTE: these jumps tranfer to the effective address of dst NOT
833 // the address contained by dst. This is because this is more natural
834 // for jumps/calls.
835 void jump(AddressLiteral dst);
836 void jump_cc(Condition cc, AddressLiteral dst);
837
838 // 32bit can do a case table jump in one instruction but we no longer allow the base
839 // to be installed in the Address class. This jump will tranfers to the address
840 // contained in the location described by entry (not the address of entry)
841 void jump(ArrayAddress entry);
842
843 // Floating
844
845 void andpd(XMMRegister dst, Address src) { Assembler::andpd(dst, src); }
846 void andpd(XMMRegister dst, AddressLiteral src, Register scratch_reg = rscratch1);
847 void andpd(XMMRegister dst, XMMRegister src) { Assembler::andpd(dst, src); }
848
849 void andps(XMMRegister dst, XMMRegister src) { Assembler::andps(dst, src); }
850 void andps(XMMRegister dst, Address src) { Assembler::andps(dst, src); }
851 void andps(XMMRegister dst, AddressLiteral src, Register scratch_reg = rscratch1);
852
853 void comiss(XMMRegister dst, XMMRegister src) { Assembler::comiss(dst, src); }
854 void comiss(XMMRegister dst, Address src) { Assembler::comiss(dst, src); }
855 void comiss(XMMRegister dst, AddressLiteral src);
856
857 void comisd(XMMRegister dst, XMMRegister src) { Assembler::comisd(dst, src); }
858 void comisd(XMMRegister dst, Address src) { Assembler::comisd(dst, src); }
859 void comisd(XMMRegister dst, AddressLiteral src);
860
861#ifndef _LP641
862 void fadd_s(Address src) { Assembler::fadd_s(src); }
863 void fadd_s(AddressLiteral src) { Assembler::fadd_s(as_Address(src)); }
864
865 void fldcw(Address src) { Assembler::fldcw(src); }
866 void fldcw(AddressLiteral src);
867
868 void fld_s(int index) { Assembler::fld_s(index); }
869 void fld_s(Address src) { Assembler::fld_s(src); }
870 void fld_s(AddressLiteral src);
871
872 void fld_d(Address src) { Assembler::fld_d(src); }
873 void fld_d(AddressLiteral src);
874
875 void fmul_s(Address src) { Assembler::fmul_s(src); }
876 void fmul_s(AddressLiteral src) { Assembler::fmul_s(as_Address(src)); }
877#endif // _LP64
878
879 void fld_x(Address src) { Assembler::fld_x(src); }
880 void fld_x(AddressLiteral src);
881
882 void ldmxcsr(Address src) { Assembler::ldmxcsr(src); }
883 void ldmxcsr(AddressLiteral src);
884
885#ifdef _LP641
886 private:
887 void sha256_AVX2_one_round_compute(
888 Register reg_old_h,
889 Register reg_a,
890 Register reg_b,
891 Register reg_c,
892 Register reg_d,
893 Register reg_e,
894 Register reg_f,
895 Register reg_g,
896 Register reg_h,
897 int iter);
898 void sha256_AVX2_four_rounds_compute_first(int start);
899 void sha256_AVX2_four_rounds_compute_last(int start);
900 void sha256_AVX2_one_round_and_sched(
901 XMMRegister xmm_0, /* == ymm4 on 0, 1, 2, 3 iterations, then rotate 4 registers left on 4, 8, 12 iterations */
902 XMMRegister xmm_1, /* ymm5 */ /* full cycle is 16 iterations */
903 XMMRegister xmm_2, /* ymm6 */
904 XMMRegister xmm_3, /* ymm7 */
905 Register reg_a, /* == eax on 0 iteration, then rotate 8 register right on each next iteration */
906 Register reg_b, /* ebx */ /* full cycle is 8 iterations */
907 Register reg_c, /* edi */
908 Register reg_d, /* esi */
909 Register reg_e, /* r8d */
910 Register reg_f, /* r9d */
911 Register reg_g, /* r10d */
912 Register reg_h, /* r11d */
913 int iter);
914
915 void addm(int disp, Register r1, Register r2);
916 void gfmul(XMMRegister tmp0, XMMRegister t);
917 void schoolbookAAD(int i, Register subkeyH, XMMRegister data, XMMRegister tmp0,
918 XMMRegister tmp1, XMMRegister tmp2, XMMRegister tmp3);
919 void generateHtbl_one_block(Register htbl);
920 void generateHtbl_eight_blocks(Register htbl);
921 public:
922 void sha256_AVX2(XMMRegister msg, XMMRegister state0, XMMRegister state1, XMMRegister msgtmp0,
923 XMMRegister msgtmp1, XMMRegister msgtmp2, XMMRegister msgtmp3, XMMRegister msgtmp4,
924 Register buf, Register state, Register ofs, Register limit, Register rsp,
925 bool multi_block, XMMRegister shuf_mask);
926 void avx_ghash(Register state, Register htbl, Register data, Register blocks);
927#endif
928
929#ifdef _LP641
930 private:
931 void sha512_AVX2_one_round_compute(Register old_h, Register a, Register b, Register c, Register d,
932 Register e, Register f, Register g, Register h, int iteration);
933
934 void sha512_AVX2_one_round_and_schedule(XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
935 Register a, Register b, Register c, Register d, Register e, Register f,
936 Register g, Register h, int iteration);
937
938 void addmq(int disp, Register r1, Register r2);
939 public:
940 void sha512_AVX2(XMMRegister msg, XMMRegister state0, XMMRegister state1, XMMRegister msgtmp0,
941 XMMRegister msgtmp1, XMMRegister msgtmp2, XMMRegister msgtmp3, XMMRegister msgtmp4,
942 Register buf, Register state, Register ofs, Register limit, Register rsp, bool multi_block,
943 XMMRegister shuf_mask);
944private:
945 void roundEnc(XMMRegister key, int rnum);
946 void lastroundEnc(XMMRegister key, int rnum);
947 void roundDec(XMMRegister key, int rnum);
948 void lastroundDec(XMMRegister key, int rnum);
949 void ev_load_key(XMMRegister xmmdst, Register key, int offset, XMMRegister xmm_shuf_mask);
950 void gfmul_avx512(XMMRegister ghash, XMMRegister hkey);
951 void generateHtbl_48_block_zmm(Register htbl, Register avx512_subkeyHtbl);
952 void ghash16_encrypt16_parallel(Register key, Register subkeyHtbl, XMMRegister ctr_blockx,
953 XMMRegister aad_hashx, Register in, Register out, Register data, Register pos, bool reduction,
954 XMMRegister addmask, bool no_ghash_input, Register rounds, Register ghash_pos,
955 bool final_reduction, int index, XMMRegister counter_inc_mask);
956public:
957 void aesecb_encrypt(Register source_addr, Register dest_addr, Register key, Register len);
958 void aesecb_decrypt(Register source_addr, Register dest_addr, Register key, Register len);
959 void aesctr_encrypt(Register src_addr, Register dest_addr, Register key, Register counter,
960 Register len_reg, Register used, Register used_addr, Register saved_encCounter_start);
961 void aesgcm_encrypt(Register in, Register len, Register ct, Register out, Register key,
962 Register state, Register subkeyHtbl, Register avx512_subkeyHtbl, Register counter);
963
964#endif
965
966 void fast_md5(Register buf, Address state, Address ofs, Address limit,
967 bool multi_block);
968
969 void fast_sha1(XMMRegister abcd, XMMRegister e0, XMMRegister e1, XMMRegister msg0,
970 XMMRegister msg1, XMMRegister msg2, XMMRegister msg3, XMMRegister shuf_mask,
971 Register buf, Register state, Register ofs, Register limit, Register rsp,
972 bool multi_block);
973
974#ifdef _LP641
975 void fast_sha256(XMMRegister msg, XMMRegister state0, XMMRegister state1, XMMRegister msgtmp0,
976 XMMRegister msgtmp1, XMMRegister msgtmp2, XMMRegister msgtmp3, XMMRegister msgtmp4,
977 Register buf, Register state, Register ofs, Register limit, Register rsp,
978 bool multi_block, XMMRegister shuf_mask);
979#else
980 void fast_sha256(XMMRegister msg, XMMRegister state0, XMMRegister state1, XMMRegister msgtmp0,
981 XMMRegister msgtmp1, XMMRegister msgtmp2, XMMRegister msgtmp3, XMMRegister msgtmp4,
982 Register buf, Register state, Register ofs, Register limit, Register rsp,
983 bool multi_block);
984#endif
985
986 void fast_exp(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
987 XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
988 Register rax, Register rcx, Register rdx, Register tmp);
989
990#ifdef _LP641
991 void fast_log(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
992 XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
993 Register rax, Register rcx, Register rdx, Register tmp1, Register tmp2);
994
995 void fast_log10(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
996 XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
997 Register rax, Register rcx, Register rdx, Register r11);
998
999 void fast_pow(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4,
1000 XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register rax, Register rcx,
1001 Register rdx, Register tmp1, Register tmp2, Register tmp3, Register tmp4);
1002
1003 void fast_sin(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
1004 XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
1005 Register rax, Register rbx, Register rcx, Register rdx, Register tmp1, Register tmp2,
1006 Register tmp3, Register tmp4);
1007
1008 void fast_cos(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
1009 XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
1010 Register rax, Register rcx, Register rdx, Register tmp1,
1011 Register tmp2, Register tmp3, Register tmp4);
1012 void fast_tan(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
1013 XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
1014 Register rax, Register rcx, Register rdx, Register tmp1,
1015 Register tmp2, Register tmp3, Register tmp4);
1016#else
1017 void fast_log(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
1018 XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
1019 Register rax, Register rcx, Register rdx, Register tmp1);
1020
1021 void fast_log10(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
1022 XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
1023 Register rax, Register rcx, Register rdx, Register tmp);
1024
1025 void fast_pow(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3, XMMRegister xmm4,
1026 XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7, Register rax, Register rcx,
1027 Register rdx, Register tmp);
1028
1029 void fast_sin(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
1030 XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
1031 Register rax, Register rbx, Register rdx);
1032
1033 void fast_cos(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
1034 XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
1035 Register rax, Register rcx, Register rdx, Register tmp);
1036
1037 void libm_sincos_huge(XMMRegister xmm0, XMMRegister xmm1, Register eax, Register ecx,
1038 Register edx, Register ebx, Register esi, Register edi,
1039 Register ebp, Register esp);
1040
1041 void libm_reduce_pi04l(Register eax, Register ecx, Register edx, Register ebx,
1042 Register esi, Register edi, Register ebp, Register esp);
1043
1044 void libm_tancot_huge(XMMRegister xmm0, XMMRegister xmm1, Register eax, Register ecx,
1045 Register edx, Register ebx, Register esi, Register edi,
1046 Register ebp, Register esp);
1047
1048 void fast_tan(XMMRegister xmm0, XMMRegister xmm1, XMMRegister xmm2, XMMRegister xmm3,
1049 XMMRegister xmm4, XMMRegister xmm5, XMMRegister xmm6, XMMRegister xmm7,
1050 Register rax, Register rcx, Register rdx, Register tmp);
1051#endif
1052
1053private:
1054
1055 // these are private because users should be doing movflt/movdbl
1056
1057 void movss(XMMRegister dst, XMMRegister src) { Assembler::movss(dst, src); }
1058 void movss(Address dst, XMMRegister src) { Assembler::movss(dst, src); }
1059 void movss(XMMRegister dst, Address src) { Assembler::movss(dst, src); }
1060 void movss(XMMRegister dst, AddressLiteral src);
1061
1062 void movlpd(XMMRegister dst, Address src) {Assembler::movlpd(dst, src); }
1063 void movlpd(XMMRegister dst, AddressLiteral src);
1064
1065public:
1066
1067 void addsd(XMMRegister dst, XMMRegister src) { Assembler::addsd(dst, src); }
1068 void addsd(XMMRegister dst, Address src) { Assembler::addsd(dst, src); }
1069 void addsd(XMMRegister dst, AddressLiteral src);
1070
1071 void addss(XMMRegister dst, XMMRegister src) { Assembler::addss(dst, src); }
1072 void addss(XMMRegister dst, Address src) { Assembler::addss(dst, src); }
1073 void addss(XMMRegister dst, AddressLiteral src);
1074
1075 void addpd(XMMRegister dst, XMMRegister src) { Assembler::addpd(dst, src); }
1076 void addpd(XMMRegister dst, Address src) { Assembler::addpd(dst, src); }
1077 void addpd(XMMRegister dst, AddressLiteral src);
1078
1079 void divsd(XMMRegister dst, XMMRegister src) { Assembler::divsd(dst, src); }
1080 void divsd(XMMRegister dst, Address src) { Assembler::divsd(dst, src); }
1081 void divsd(XMMRegister dst, AddressLiteral src);
1082
1083 void divss(XMMRegister dst, XMMRegister src) { Assembler::divss(dst, src); }
1084 void divss(XMMRegister dst, Address src) { Assembler::divss(dst, src); }
1085 void divss(XMMRegister dst, AddressLiteral src);
1086
1087 // Move Unaligned Double Quadword
1088 void movdqu(Address dst, XMMRegister src);
1089 void movdqu(XMMRegister dst, Address src);
1090 void movdqu(XMMRegister dst, XMMRegister src);
1091 void movdqu(XMMRegister dst, AddressLiteral src, Register scratchReg = rscratch1);
1092
1093 void kmovwl(KRegister dst, Register src) { Assembler::kmovwl(dst, src); }
1094 void kmovwl(Register dst, KRegister src) { Assembler::kmovwl(dst, src); }
1095 void kmovwl(KRegister dst, Address src) { Assembler::kmovwl(dst, src); }
1096 void kmovwl(KRegister dst, AddressLiteral src, Register scratch_reg = rscratch1);
1097 void kmovwl(Address dst, KRegister src) { Assembler::kmovwl(dst, src); }
1098 void kmovwl(KRegister dst, KRegister src) { Assembler::kmovwl(dst, src); }
1099
1100 void kmovql(KRegister dst, KRegister src) { Assembler::kmovql(dst, src); }
1101 void kmovql(KRegister dst, Register src) { Assembler::kmovql(dst, src); }
1102 void kmovql(Register dst, KRegister src) { Assembler::kmovql(dst, src); }
1103 void kmovql(KRegister dst, Address src) { Assembler::kmovql(dst, src); }
1104 void kmovql(Address dst, KRegister src) { Assembler::kmovql(dst, src); }
1105 void kmovql(KRegister dst, AddressLiteral src, Register scratch_reg = rscratch1);
1106
1107 // Safe move operation, lowers down to 16bit moves for targets supporting
1108 // AVX512F feature and 64bit moves for targets supporting AVX512BW feature.
1109 void kmov(Address dst, KRegister src);
1110 void kmov(KRegister dst, Address src);
1111 void kmov(KRegister dst, KRegister src);
1112 void kmov(Register dst, KRegister src);
1113 void kmov(KRegister dst, Register src);
1114
1115 // AVX Unaligned forms
1116 void vmovdqu(Address dst, XMMRegister src);
1117 void vmovdqu(XMMRegister dst, Address src);
1118 void vmovdqu(XMMRegister dst, XMMRegister src);
1119 void vmovdqu(XMMRegister dst, AddressLiteral src, Register scratch_reg = rscratch1);
1120 void vmovdqu(XMMRegister dst, AddressLiteral src, Register scratch_reg, int vector_len);
1121
1122
1123 // AVX512 Unaligned
1124 void evmovdqu(BasicType type, KRegister kmask, Address dst, XMMRegister src, int vector_len);
1125 void evmovdqu(BasicType type, KRegister kmask, XMMRegister dst, Address src, int vector_len);
1126
1127 void evmovdqub(Address dst, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdqub(dst, src, merge, vector_len); }
1128 void evmovdqub(XMMRegister dst, Address src, bool merge, int vector_len) { Assembler::evmovdqub(dst, src, merge, vector_len); }
1129 void evmovdqub(XMMRegister dst, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdqub(dst, src, merge, vector_len); }
1130 void evmovdqub(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) { Assembler::evmovdqub(dst, mask, src, merge, vector_len); }
1131 void evmovdqub(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdqub(dst, mask, src, merge, vector_len); }
1132 void evmovdqub(XMMRegister dst, KRegister mask, AddressLiteral src, bool merge, int vector_len, Register scratch_reg);
1133
1134 void evmovdquw(Address dst, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdquw(dst, src, merge, vector_len); }
1135 void evmovdquw(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdquw(dst, mask, src, merge, vector_len); }
1136 void evmovdquw(XMMRegister dst, Address src, bool merge, int vector_len) { Assembler::evmovdquw(dst, src, merge, vector_len); }
1137 void evmovdquw(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) { Assembler::evmovdquw(dst, mask, src, merge, vector_len); }
1138 void evmovdquw(XMMRegister dst, KRegister mask, AddressLiteral src, bool merge, int vector_len, Register scratch_reg);
1139
1140 void evmovdqul(Address dst, XMMRegister src, int vector_len) { Assembler::evmovdqul(dst, src, vector_len); }
1141 void evmovdqul(XMMRegister dst, Address src, int vector_len) { Assembler::evmovdqul(dst, src, vector_len); }
1142 void evmovdqul(XMMRegister dst, XMMRegister src, int vector_len) {
1143 if (dst->encoding() == src->encoding()) return;
1144 Assembler::evmovdqul(dst, src, vector_len);
1145 }
1146 void evmovdqul(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdqul(dst, mask, src, merge, vector_len); }
1147 void evmovdqul(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) { Assembler::evmovdqul(dst, mask, src, merge, vector_len); }
1148 void evmovdqul(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {
1149 if (dst->encoding() == src->encoding() && mask == k0) return;
1150 Assembler::evmovdqul(dst, mask, src, merge, vector_len);
1151 }
1152 void evmovdqul(XMMRegister dst, KRegister mask, AddressLiteral src, bool merge, int vector_len, Register scratch_reg);
1153
1154 void evmovdquq(XMMRegister dst, Address src, int vector_len) { Assembler::evmovdquq(dst, src, vector_len); }
1155 void evmovdquq(Address dst, XMMRegister src, int vector_len) { Assembler::evmovdquq(dst, src, vector_len); }
1156 void evmovdquq(XMMRegister dst, AddressLiteral src, int vector_len, Register rscratch);
1157 void evmovdquq(XMMRegister dst, XMMRegister src, int vector_len) {
1158 if (dst->encoding() == src->encoding()) return;
1159 Assembler::evmovdquq(dst, src, vector_len);
1160 }
1161 void evmovdquq(Address dst, KRegister mask, XMMRegister src, bool merge, int vector_len) { Assembler::evmovdquq(dst, mask, src, merge, vector_len); }
1162 void evmovdquq(XMMRegister dst, KRegister mask, Address src, bool merge, int vector_len) { Assembler::evmovdquq(dst, mask, src, merge, vector_len); }
1163 void evmovdquq(XMMRegister dst, KRegister mask, XMMRegister src, bool merge, int vector_len) {
1164 if (dst->encoding() == src->encoding() && mask == k0) return;
1165 Assembler::evmovdquq(dst, mask, src, merge, vector_len);
1166 }
1167 void evmovdquq(XMMRegister dst, KRegister mask, AddressLiteral src, bool merge, int vector_len, Register scratch_reg);
1168
1169 // Move Aligned Double Quadword
1170 void movdqa(XMMRegister dst, Address src) { Assembler::movdqa(dst, src); }
1171 void movdqa(XMMRegister dst, XMMRegister src) { Assembler::movdqa(dst, src); }
1172 void movdqa(XMMRegister dst, AddressLiteral src);
1173
1174 void movsd(XMMRegister dst, XMMRegister src) { Assembler::movsd(dst, src); }
1175 void movsd(Address dst, XMMRegister src) { Assembler::movsd(dst, src); }
1176 void movsd(XMMRegister dst, Address src) { Assembler::movsd(dst, src); }
1177 void movsd(XMMRegister dst, AddressLiteral src);
1178
1179 void mulpd(XMMRegister dst, XMMRegister src) { Assembler::mulpd(dst, src); }
1180 void mulpd(XMMRegister dst, Address src) { Assembler::mulpd(dst, src); }
1181 void mulpd(XMMRegister dst, AddressLiteral src);
1182
1183 void mulsd(XMMRegister dst, XMMRegister src) { Assembler::mulsd(dst, src); }
1184 void mulsd(XMMRegister dst, Address src) { Assembler::mulsd(dst, src); }
1185 void mulsd(XMMRegister dst, AddressLiteral src);
1186
1187 void mulss(XMMRegister dst, XMMRegister src) { Assembler::mulss(dst, src); }
1188 void mulss(XMMRegister dst, Address src) { Assembler::mulss(dst, src); }
1189 void mulss(XMMRegister dst, AddressLiteral src);
1190
1191 // Carry-Less Multiplication Quadword
1192 void pclmulldq(XMMRegister dst, XMMRegister src) {
1193 // 0x00 - multiply lower 64 bits [0:63]
1194 Assembler::pclmulqdq(dst, src, 0x00);
1195 }
1196 void pclmulhdq(XMMRegister dst, XMMRegister src) {
1197 // 0x11 - multiply upper 64 bits [64:127]
1198 Assembler::pclmulqdq(dst, src, 0x11);
1199 }
1200
1201 void pcmpeqb(XMMRegister dst, XMMRegister src);
1202 void pcmpeqw(XMMRegister dst, XMMRegister src);
1203
1204 void pcmpestri(XMMRegister dst, Address src, int imm8);
1205 void pcmpestri(XMMRegister dst, XMMRegister src, int imm8);
1206
1207 void pmovzxbw(XMMRegister dst, XMMRegister src);
1208 void pmovzxbw(XMMRegister dst, Address src);
1209
1210 void pmovmskb(Register dst, XMMRegister src);
1211
1212 void ptest(XMMRegister dst, XMMRegister src);
1213
1214 void sqrtsd(XMMRegister dst, XMMRegister src) { Assembler::sqrtsd(dst, src); }
1215 void sqrtsd(XMMRegister dst, Address src) { Assembler::sqrtsd(dst, src); }
1216 void sqrtsd(XMMRegister dst, AddressLiteral src);
1217
1218 void roundsd(XMMRegister dst, XMMRegister src, int32_t rmode) { Assembler::roundsd(dst, src, rmode); }
1219 void roundsd(XMMRegister dst, Address src, int32_t rmode) { Assembler::roundsd(dst, src, rmode); }
1220 void roundsd(XMMRegister dst, AddressLiteral src, int32_t rmode, Register scratch_reg);
1221
1222 void sqrtss(XMMRegister dst, XMMRegister src) { Assembler::sqrtss(dst, src); }
1223 void sqrtss(XMMRegister dst, Address src) { Assembler::sqrtss(dst, src); }
1224 void sqrtss(XMMRegister dst, AddressLiteral src);
1225
1226 void subsd(XMMRegister dst, XMMRegister src) { Assembler::subsd(dst, src); }
1227 void subsd(XMMRegister dst, Address src) { Assembler::subsd(dst, src); }
1228 void subsd(XMMRegister dst, AddressLiteral src);
1229
1230 void subss(XMMRegister dst, XMMRegister src) { Assembler::subss(dst, src); }
1231 void subss(XMMRegister dst, Address src) { Assembler::subss(dst, src); }
1232 void subss(XMMRegister dst, AddressLiteral src);
1233
1234 void ucomiss(XMMRegister dst, XMMRegister src) { Assembler::ucomiss(dst, src); }
1235 void ucomiss(XMMRegister dst, Address src) { Assembler::ucomiss(dst, src); }
1236 void ucomiss(XMMRegister dst, AddressLiteral src);
1237
1238 void ucomisd(XMMRegister dst, XMMRegister src) { Assembler::ucomisd(dst, src); }
1239 void ucomisd(XMMRegister dst, Address src) { Assembler::ucomisd(dst, src); }
1240 void ucomisd(XMMRegister dst, AddressLiteral src);
1241
1242 // Bitwise Logical XOR of Packed Double-Precision Floating-Point Values
1243 void xorpd(XMMRegister dst, XMMRegister src);
1244 void xorpd(XMMRegister dst, Address src) { Assembler::xorpd(dst, src); }
1245 void xorpd(XMMRegister dst, AddressLiteral src, Register scratch_reg = rscratch1);
1246
1247 // Bitwise Logical XOR of Packed Single-Precision Floating-Point Values
1248 void xorps(XMMRegister dst, XMMRegister src);
1249 void xorps(XMMRegister dst, Address src) { Assembler::xorps(dst, src); }
1250 void xorps(XMMRegister dst, AddressLiteral src, Register scratch_reg = rscratch1);
1251
1252 // Shuffle Bytes
1253 void pshufb(XMMRegister dst, XMMRegister src) { Assembler::pshufb(dst, src); }
1254 void pshufb(XMMRegister dst, Address src) { Assembler::pshufb(dst, src); }
1255 void pshufb(XMMRegister dst, AddressLiteral src);
1256 // AVX 3-operands instructions
1257
1258 void vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vaddsd(dst, nds, src); }
1259 void vaddsd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vaddsd(dst, nds, src); }
1260 void vaddsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1261
1262 void vaddss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vaddss(dst, nds, src); }
1263 void vaddss(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vaddss(dst, nds, src); }
1264 void vaddss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1265
1266 void vabsss(XMMRegister dst, XMMRegister nds, XMMRegister src, AddressLiteral negate_field, int vector_len);
1267 void vabssd(XMMRegister dst, XMMRegister nds, XMMRegister src, AddressLiteral negate_field, int vector_len);
1268
1269 void vpaddb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1270 void vpaddb(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
1271 void vpaddb(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register rscratch);
1272
1273 void vpaddw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1274 void vpaddw(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
1275
1276 void vpaddd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vpaddd(dst, nds, src, vector_len); }
1277 void vpaddd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) { Assembler::vpaddd(dst, nds, src, vector_len); }
1278 void vpaddd(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register rscratch);
1279
1280 void vpand(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vpand(dst, nds, src, vector_len); }
1281 void vpand(XMMRegister dst, XMMRegister nds, Address src, int vector_len) { Assembler::vpand(dst, nds, src, vector_len); }
1282 void vpand(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg = rscratch1);
1283
1284 void vpbroadcastw(XMMRegister dst, XMMRegister src, int vector_len);
1285 void vpbroadcastw(XMMRegister dst, Address src, int vector_len) { Assembler::vpbroadcastw(dst, src, vector_len); }
1286
1287 void vpcmpeqb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1288
1289 void vpcmpeqw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1290 void evpcmpeqd(KRegister kdst, KRegister mask, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg);
1291
1292 // Vector compares
1293 void evpcmpd(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,
1294 int comparison, bool is_signed, int vector_len) { Assembler::evpcmpd(kdst, mask, nds, src, comparison, is_signed, vector_len); }
1295 void evpcmpd(KRegister kdst, KRegister mask, XMMRegister nds, AddressLiteral src,
1296 int comparison, bool is_signed, int vector_len, Register scratch_reg);
1297 void evpcmpq(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,
1298 int comparison, bool is_signed, int vector_len) { Assembler::evpcmpq(kdst, mask, nds, src, comparison, is_signed, vector_len); }
1299 void evpcmpq(KRegister kdst, KRegister mask, XMMRegister nds, AddressLiteral src,
1300 int comparison, bool is_signed, int vector_len, Register scratch_reg);
1301 void evpcmpb(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,
1302 int comparison, bool is_signed, int vector_len) { Assembler::evpcmpb(kdst, mask, nds, src, comparison, is_signed, vector_len); }
1303 void evpcmpb(KRegister kdst, KRegister mask, XMMRegister nds, AddressLiteral src,
1304 int comparison, bool is_signed, int vector_len, Register scratch_reg);
1305 void evpcmpw(KRegister kdst, KRegister mask, XMMRegister nds, XMMRegister src,
1306 int comparison, bool is_signed, int vector_len) { Assembler::evpcmpw(kdst, mask, nds, src, comparison, is_signed, vector_len); }
1307 void evpcmpw(KRegister kdst, KRegister mask, XMMRegister nds, AddressLiteral src,
1308 int comparison, bool is_signed, int vector_len, Register scratch_reg);
1309
1310 void evpbroadcast(BasicType type, XMMRegister dst, Register src, int vector_len);
1311
1312 // Emit comparison instruction for the specified comparison predicate.
1313 void vpcmpCCW(XMMRegister dst, XMMRegister nds, XMMRegister src, ComparisonPredicate cond, Width width, int vector_len, Register scratch_reg);
1314 void vpcmpCC(XMMRegister dst, XMMRegister nds, XMMRegister src, int cond_encoding, Width width, int vector_len);
1315
1316 void vpmovzxbw(XMMRegister dst, Address src, int vector_len);
1317 void vpmovzxbw(XMMRegister dst, XMMRegister src, int vector_len) { Assembler::vpmovzxbw(dst, src, vector_len); }
1318
1319 void vpmovmskb(Register dst, XMMRegister src, int vector_len = Assembler::AVX_256bit);
1320
1321 void vpmullw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1322 void vpmullw(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
1323 void vpmulld(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
1324 Assembler::vpmulld(dst, nds, src, vector_len);
1325 };
1326 void vpmulld(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
1327 Assembler::vpmulld(dst, nds, src, vector_len);
1328 }
1329 void vpmulld(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg);
1330
1331 void vpsubb(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1332 void vpsubb(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
1333
1334 void vpsubw(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len);
1335 void vpsubw(XMMRegister dst, XMMRegister nds, Address src, int vector_len);
1336
1337 void vpsraw(XMMRegister dst, XMMRegister nds, XMMRegister shift, int vector_len);
1338 void vpsraw(XMMRegister dst, XMMRegister nds, int shift, int vector_len);
1339
1340 void evpsraq(XMMRegister dst, XMMRegister nds, XMMRegister shift, int vector_len);
1341 void evpsraq(XMMRegister dst, XMMRegister nds, int shift, int vector_len);
1342
1343 void evpsllw(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len, bool is_varshift) {
1344 if (!is_varshift) {
1345 Assembler::evpsllw(dst, mask, nds, src, merge, vector_len);
1346 } else {
1347 Assembler::evpsllvw(dst, mask, nds, src, merge, vector_len);
1348 }
1349 }
1350 void evpslld(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len, bool is_varshift) {
1351 if (!is_varshift) {
1352 Assembler::evpslld(dst, mask, nds, src, merge, vector_len);
1353 } else {
1354 Assembler::evpsllvd(dst, mask, nds, src, merge, vector_len);
1355 }
1356 }
1357 void evpsllq(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len, bool is_varshift) {
1358 if (!is_varshift) {
1359 Assembler::evpsllq(dst, mask, nds, src, merge, vector_len);
1360 } else {
1361 Assembler::evpsllvq(dst, mask, nds, src, merge, vector_len);
1362 }
1363 }
1364 void evpsrlw(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len, bool is_varshift) {
1365 if (!is_varshift) {
1366 Assembler::evpsrlw(dst, mask, nds, src, merge, vector_len);
1367 } else {
1368 Assembler::evpsrlvw(dst, mask, nds, src, merge, vector_len);
1369 }
1370 }
1371 void evpsrld(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len, bool is_varshift) {
1372 if (!is_varshift) {
1373 Assembler::evpsrld(dst, mask, nds, src, merge, vector_len);
1374 } else {
1375 Assembler::evpsrlvd(dst, mask, nds, src, merge, vector_len);
1376 }
1377 }
1378 void evpsrlq(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len, bool is_varshift) {
1379 if (!is_varshift) {
1380 Assembler::evpsrlq(dst, mask, nds, src, merge, vector_len);
1381 } else {
1382 Assembler::evpsrlvq(dst, mask, nds, src, merge, vector_len);
1383 }
1384 }
1385 void evpsraw(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len, bool is_varshift) {
1386 if (!is_varshift) {
1387 Assembler::evpsraw(dst, mask, nds, src, merge, vector_len);
1388 } else {
1389 Assembler::evpsravw(dst, mask, nds, src, merge, vector_len);
1390 }
1391 }
1392 void evpsrad(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len, bool is_varshift) {
1393 if (!is_varshift) {
1394 Assembler::evpsrad(dst, mask, nds, src, merge, vector_len);
1395 } else {
1396 Assembler::evpsravd(dst, mask, nds, src, merge, vector_len);
1397 }
1398 }
1399 void evpsraq(XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len, bool is_varshift) {
1400 if (!is_varshift) {
1401 Assembler::evpsraq(dst, mask, nds, src, merge, vector_len);
1402 } else {
1403 Assembler::evpsravq(dst, mask, nds, src, merge, vector_len);
1404 }
1405 }
1406
1407 void evpmins(BasicType type, XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len);
1408 void evpmaxs(BasicType type, XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len);
1409 void evpmins(BasicType type, XMMRegister dst, KRegister mask, XMMRegister nds, Address src, bool merge, int vector_len);
1410 void evpmaxs(BasicType type, XMMRegister dst, KRegister mask, XMMRegister nds, Address src, bool merge, int vector_len);
1411
1412 void vpsrlw(XMMRegister dst, XMMRegister nds, XMMRegister shift, int vector_len);
1413 void vpsrlw(XMMRegister dst, XMMRegister nds, int shift, int vector_len);
1414
1415 void vpsllw(XMMRegister dst, XMMRegister nds, XMMRegister shift, int vector_len);
1416 void vpsllw(XMMRegister dst, XMMRegister nds, int shift, int vector_len);
1417
1418 void vptest(XMMRegister dst, XMMRegister src);
1419 void vptest(XMMRegister dst, XMMRegister src, int vector_len) { Assembler::vptest(dst, src, vector_len); }
1420
1421 void punpcklbw(XMMRegister dst, XMMRegister src);
1422 void punpcklbw(XMMRegister dst, Address src) { Assembler::punpcklbw(dst, src); }
1423
1424 void pshufd(XMMRegister dst, Address src, int mode);
1425 void pshufd(XMMRegister dst, XMMRegister src, int mode) { Assembler::pshufd(dst, src, mode); }
1426
1427 void pshuflw(XMMRegister dst, XMMRegister src, int mode);
1428 void pshuflw(XMMRegister dst, Address src, int mode) { Assembler::pshuflw(dst, src, mode); }
1429
1430 void vandpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vandpd(dst, nds, src, vector_len); }
1431 void vandpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) { Assembler::vandpd(dst, nds, src, vector_len); }
1432 void vandpd(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg = rscratch1);
1433
1434 void vandps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vandps(dst, nds, src, vector_len); }
1435 void vandps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) { Assembler::vandps(dst, nds, src, vector_len); }
1436 void vandps(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg = rscratch1);
1437
1438 void evpord(XMMRegister dst, KRegister mask, XMMRegister nds, AddressLiteral src, bool merge, int vector_len, Register scratch_reg);
1439
1440 void vdivsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vdivsd(dst, nds, src); }
1441 void vdivsd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vdivsd(dst, nds, src); }
1442 void vdivsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1443
1444 void vdivss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vdivss(dst, nds, src); }
1445 void vdivss(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vdivss(dst, nds, src); }
1446 void vdivss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1447
1448 void vmulsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vmulsd(dst, nds, src); }
1449 void vmulsd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vmulsd(dst, nds, src); }
1450 void vmulsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1451
1452 void vmulss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vmulss(dst, nds, src); }
1453 void vmulss(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vmulss(dst, nds, src); }
1454 void vmulss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1455
1456 void vsubsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vsubsd(dst, nds, src); }
1457 void vsubsd(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vsubsd(dst, nds, src); }
1458 void vsubsd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1459
1460 void vsubss(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vsubss(dst, nds, src); }
1461 void vsubss(XMMRegister dst, XMMRegister nds, Address src) { Assembler::vsubss(dst, nds, src); }
1462 void vsubss(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1463
1464 void vnegatess(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1465 void vnegatesd(XMMRegister dst, XMMRegister nds, AddressLiteral src);
1466
1467 // AVX Vector instructions
1468
1469 void vxorpd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vxorpd(dst, nds, src, vector_len); }
1470 void vxorpd(XMMRegister dst, XMMRegister nds, Address src, int vector_len) { Assembler::vxorpd(dst, nds, src, vector_len); }
1471 void vxorpd(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg = rscratch1);
1472
1473 void vxorps(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vxorps(dst, nds, src, vector_len); }
1474 void vxorps(XMMRegister dst, XMMRegister nds, Address src, int vector_len) { Assembler::vxorps(dst, nds, src, vector_len); }
1475 void vxorps(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg = rscratch1);
1476
1477 void vpxor(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
1478 if (UseAVX > 1 || (vector_len < 1)) // vpxor 256 bit is available only in AVX2
1479 Assembler::vpxor(dst, nds, src, vector_len);
1480 else
1481 Assembler::vxorpd(dst, nds, src, vector_len);
1482 }
1483 void vpxor(XMMRegister dst, XMMRegister nds, Address src, int vector_len) {
1484 if (UseAVX > 1 || (vector_len < 1)) // vpxor 256 bit is available only in AVX2
1485 Assembler::vpxor(dst, nds, src, vector_len);
1486 else
1487 Assembler::vxorpd(dst, nds, src, vector_len);
1488 }
1489 void vpxor(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg = rscratch1);
1490
1491 // Simple version for AVX2 256bit vectors
1492 void vpxor(XMMRegister dst, XMMRegister src) { Assembler::vpxor(dst, dst, src, true); }
1493 void vpxor(XMMRegister dst, Address src) { Assembler::vpxor(dst, dst, src, true); }
1494
1495 void vpermd(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) { Assembler::vpermd(dst, nds, src, vector_len); }
1496 void vpermd(XMMRegister dst, XMMRegister nds, AddressLiteral src, int vector_len, Register scratch_reg);
1497
1498 void vinserti128(XMMRegister dst, XMMRegister nds, XMMRegister src, uint8_t imm8) {
1499 if (UseAVX > 2 && VM_Version::supports_avx512novl()) {
1500 Assembler::vinserti32x4(dst, nds, src, imm8);
1501 } else if (UseAVX > 1) {
1502 // vinserti128 is available only in AVX2
1503 Assembler::vinserti128(dst, nds, src, imm8);
1504 } else {
1505 Assembler::vinsertf128(dst, nds, src, imm8);
1506 }
1507 }
1508
1509 void vinserti128(XMMRegister dst, XMMRegister nds, Address src, uint8_t imm8) {
1510 if (UseAVX > 2 && VM_Version::supports_avx512novl()) {
1511 Assembler::vinserti32x4(dst, nds, src, imm8);
1512 } else if (UseAVX > 1) {
1513 // vinserti128 is available only in AVX2
1514 Assembler::vinserti128(dst, nds, src, imm8);
1515 } else {
1516 Assembler::vinsertf128(dst, nds, src, imm8);
1517 }
1518 }
1519
1520 void vextracti128(XMMRegister dst, XMMRegister src, uint8_t imm8) {
1521 if (UseAVX > 2 && VM_Version::supports_avx512novl()) {
1522 Assembler::vextracti32x4(dst, src, imm8);
1523 } else if (UseAVX > 1) {
1524 // vextracti128 is available only in AVX2
1525 Assembler::vextracti128(dst, src, imm8);
1526 } else {
1527 Assembler::vextractf128(dst, src, imm8);
1528 }
1529 }
1530
1531 void vextracti128(Address dst, XMMRegister src, uint8_t imm8) {
1532 if (UseAVX > 2 && VM_Version::supports_avx512novl()) {
1533 Assembler::vextracti32x4(dst, src, imm8);
1534 } else if (UseAVX > 1) {
1535 // vextracti128 is available only in AVX2
1536 Assembler::vextracti128(dst, src, imm8);
1537 } else {
1538 Assembler::vextractf128(dst, src, imm8);
1539 }
1540 }
1541
1542 // 128bit copy to/from high 128 bits of 256bit (YMM) vector registers
1543 void vinserti128_high(XMMRegister dst, XMMRegister src) {
1544 vinserti128(dst, dst, src, 1);
1545 }
1546 void vinserti128_high(XMMRegister dst, Address src) {
1547 vinserti128(dst, dst, src, 1);
1548 }
1549 void vextracti128_high(XMMRegister dst, XMMRegister src) {
1550 vextracti128(dst, src, 1);
1551 }
1552 void vextracti128_high(Address dst, XMMRegister src) {
1553 vextracti128(dst, src, 1);
1554 }
1555
1556 void vinsertf128_high(XMMRegister dst, XMMRegister src) {
1557 if (UseAVX > 2 && VM_Version::supports_avx512novl()) {
1558 Assembler::vinsertf32x4(dst, dst, src, 1);
1559 } else {
1560 Assembler::vinsertf128(dst, dst, src, 1);
1561 }
1562 }
1563
1564 void vinsertf128_high(XMMRegister dst, Address src) {
1565 if (UseAVX > 2 && VM_Version::supports_avx512novl()) {
1566 Assembler::vinsertf32x4(dst, dst, src, 1);
1567 } else {
1568 Assembler::vinsertf128(dst, dst, src, 1);
1569 }
1570 }
1571
1572 void vextractf128_high(XMMRegister dst, XMMRegister src) {
1573 if (UseAVX > 2 && VM_Version::supports_avx512novl()) {
1574 Assembler::vextractf32x4(dst, src, 1);
1575 } else {
1576 Assembler::vextractf128(dst, src, 1);
1577 }
1578 }
1579
1580 void vextractf128_high(Address dst, XMMRegister src) {
1581 if (UseAVX > 2 && VM_Version::supports_avx512novl()) {
1582 Assembler::vextractf32x4(dst, src, 1);
1583 } else {
1584 Assembler::vextractf128(dst, src, 1);
1585 }
1586 }
1587
1588 // 256bit copy to/from high 256 bits of 512bit (ZMM) vector registers
1589 void vinserti64x4_high(XMMRegister dst, XMMRegister src) {
1590 Assembler::vinserti64x4(dst, dst, src, 1);
1591 }
1592 void vinsertf64x4_high(XMMRegister dst, XMMRegister src) {
1593 Assembler::vinsertf64x4(dst, dst, src, 1);
1594 }
1595 void vextracti64x4_high(XMMRegister dst, XMMRegister src) {
1596 Assembler::vextracti64x4(dst, src, 1);
1597 }
1598 void vextractf64x4_high(XMMRegister dst, XMMRegister src) {
1599 Assembler::vextractf64x4(dst, src, 1);
1600 }
1601 void vextractf64x4_high(Address dst, XMMRegister src) {
1602 Assembler::vextractf64x4(dst, src, 1);
1603 }
1604 void vinsertf64x4_high(XMMRegister dst, Address src) {
1605 Assembler::vinsertf64x4(dst, dst, src, 1);
1606 }
1607
1608 // 128bit copy to/from low 128 bits of 256bit (YMM) vector registers
1609 void vinserti128_low(XMMRegister dst, XMMRegister src) {
1610 vinserti128(dst, dst, src, 0);
1611 }
1612 void vinserti128_low(XMMRegister dst, Address src) {
1613 vinserti128(dst, dst, src, 0);
1614 }
1615 void vextracti128_low(XMMRegister dst, XMMRegister src) {
1616 vextracti128(dst, src, 0);
1617 }
1618 void vextracti128_low(Address dst, XMMRegister src) {
1619 vextracti128(dst, src, 0);
1620 }
1621
1622 void vinsertf128_low(XMMRegister dst, XMMRegister src) {
1623 if (UseAVX > 2 && VM_Version::supports_avx512novl()) {
1624 Assembler::vinsertf32x4(dst, dst, src, 0);
1625 } else {
1626 Assembler::vinsertf128(dst, dst, src, 0);
1627 }
1628 }
1629
1630 void vinsertf128_low(XMMRegister dst, Address src) {
1631 if (UseAVX > 2 && VM_Version::supports_avx512novl()) {
1632 Assembler::vinsertf32x4(dst, dst, src, 0);
1633 } else {
1634 Assembler::vinsertf128(dst, dst, src, 0);
1635 }
1636 }
1637
1638 void vextractf128_low(XMMRegister dst, XMMRegister src) {
1639 if (UseAVX > 2 && VM_Version::supports_avx512novl()) {
1640 Assembler::vextractf32x4(dst, src, 0);
1641 } else {
1642 Assembler::vextractf128(dst, src, 0);
1643 }
1644 }
1645
1646 void vextractf128_low(Address dst, XMMRegister src) {
1647 if (UseAVX > 2 && VM_Version::supports_avx512novl()) {
1648 Assembler::vextractf32x4(dst, src, 0);
1649 } else {
1650 Assembler::vextractf128(dst, src, 0);
1651 }
1652 }
1653
1654 // 256bit copy to/from low 256 bits of 512bit (ZMM) vector registers
1655 void vinserti64x4_low(XMMRegister dst, XMMRegister src) {
1656 Assembler::vinserti64x4(dst, dst, src, 0);
1657 }
1658 void vinsertf64x4_low(XMMRegister dst, XMMRegister src) {
1659 Assembler::vinsertf64x4(dst, dst, src, 0);
1660 }
1661 void vextracti64x4_low(XMMRegister dst, XMMRegister src) {
1662 Assembler::vextracti64x4(dst, src, 0);
1663 }
1664 void vextractf64x4_low(XMMRegister dst, XMMRegister src) {
1665 Assembler::vextractf64x4(dst, src, 0);
1666 }
1667 void vextractf64x4_low(Address dst, XMMRegister src) {
1668 Assembler::vextractf64x4(dst, src, 0);
1669 }
1670 void vinsertf64x4_low(XMMRegister dst, Address src) {
1671 Assembler::vinsertf64x4(dst, dst, src, 0);
1672 }
1673
1674 // Carry-Less Multiplication Quadword
1675 void vpclmulldq(XMMRegister dst, XMMRegister nds, XMMRegister src) {
1676 // 0x00 - multiply lower 64 bits [0:63]
1677 Assembler::vpclmulqdq(dst, nds, src, 0x00);
1678 }
1679 void vpclmulhdq(XMMRegister dst, XMMRegister nds, XMMRegister src) {
1680 // 0x11 - multiply upper 64 bits [64:127]
1681 Assembler::vpclmulqdq(dst, nds, src, 0x11);
1682 }
1683 void vpclmullqhqdq(XMMRegister dst, XMMRegister nds, XMMRegister src) {
1684 // 0x10 - multiply nds[0:63] and src[64:127]
1685 Assembler::vpclmulqdq(dst, nds, src, 0x10);
1686 }
1687 void vpclmulhqlqdq(XMMRegister dst, XMMRegister nds, XMMRegister src) {
1688 //0x01 - multiply nds[64:127] and src[0:63]
1689 Assembler::vpclmulqdq(dst, nds, src, 0x01);
1690 }
1691
1692 void evpclmulldq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
1693 // 0x00 - multiply lower 64 bits [0:63]
1694 Assembler::evpclmulqdq(dst, nds, src, 0x00, vector_len);
1695 }
1696 void evpclmulhdq(XMMRegister dst, XMMRegister nds, XMMRegister src, int vector_len) {
1697 // 0x11 - multiply upper 64 bits [64:127]
1698 Assembler::evpclmulqdq(dst, nds, src, 0x11, vector_len);
1699 }
1700
1701 // AVX-512 mask operations.
1702 void kand(BasicType etype, KRegister dst, KRegister src1, KRegister src2);
1703 void kor(BasicType type, KRegister dst, KRegister src1, KRegister src2);
1704 void knot(uint masklen, KRegister dst, KRegister src, KRegister ktmp = knoreg, Register rtmp = noreg);
1705 void kxor(BasicType type, KRegister dst, KRegister src1, KRegister src2);
1706 void kortest(uint masklen, KRegister src1, KRegister src2);
1707 void ktest(uint masklen, KRegister src1, KRegister src2);
1708
1709 void evperm(BasicType type, XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len);
1710 void evperm(BasicType type, XMMRegister dst, KRegister mask, XMMRegister nds, Address src, bool merge, int vector_len);
1711
1712 void evor(BasicType type, XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len);
1713 void evor(BasicType type, XMMRegister dst, KRegister mask, XMMRegister nds, Address src, bool merge, int vector_len);
1714
1715 void evand(BasicType type, XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len);
1716 void evand(BasicType type, XMMRegister dst, KRegister mask, XMMRegister nds, Address src, bool merge, int vector_len);
1717
1718 void evxor(BasicType type, XMMRegister dst, KRegister mask, XMMRegister nds, XMMRegister src, bool merge, int vector_len);
1719 void evxor(BasicType type, XMMRegister dst, KRegister mask, XMMRegister nds, Address src, bool merge, int vector_len);
1720
1721 void evrold(BasicType type, XMMRegister dst, KRegister mask, XMMRegister src, int shift, bool merge, int vlen_enc);
1722 void evrold(BasicType type, XMMRegister dst, KRegister mask, XMMRegister src1, XMMRegister src2, bool merge, int vlen_enc);
1723 void evrord(BasicType type, XMMRegister dst, KRegister mask, XMMRegister src, int shift, bool merge, int vlen_enc);
1724 void evrord(BasicType type, XMMRegister dst, KRegister mask, XMMRegister src1, XMMRegister src2, bool merge, int vlen_enc);
1725
1726 void alltrue(Register dst, uint masklen, KRegister src1, KRegister src2, KRegister kscratch);
1727 void anytrue(Register dst, uint masklen, KRegister src, KRegister kscratch);
1728
1729 void cmov32( Condition cc, Register dst, Address src);
1730 void cmov32( Condition cc, Register dst, Register src);
1731
1732 void cmov( Condition cc, Register dst, Register src) { cmovptr(cc, dst, src); }
1733
1734 void cmovptr(Condition cc, Register dst, Address src) { LP64_ONLY(cmovq(cc, dst, src))cmovq(cc, dst, src) NOT_LP64(cmov32(cc, dst, src)); }
1735 void cmovptr(Condition cc, Register dst, Register src) { LP64_ONLY(cmovq(cc, dst, src))cmovq(cc, dst, src) NOT_LP64(cmov32(cc, dst, src)); }
1736
1737 void movoop(Register dst, jobject obj);
1738 void movoop(Address dst, jobject obj);
1739
1740 void mov_metadata(Register dst, Metadata* obj);
1741 void mov_metadata(Address dst, Metadata* obj);
1742
1743 void movptr(ArrayAddress dst, Register src);
1744 // can this do an lea?
1745 void movptr(Register dst, ArrayAddress src);
1746
1747 void movptr(Register dst, Address src);
1748
1749#ifdef _LP641
1750 void movptr(Register dst, AddressLiteral src, Register scratch=rscratch1);
1751#else
1752 void movptr(Register dst, AddressLiteral src, Register scratch=noreg); // Scratch reg is ignored in 32-bit
1753#endif
1754
1755 void movptr(Register dst, intptr_t src);
1756 void movptr(Register dst, Register src);
1757 void movptr(Address dst, intptr_t src);
1758
1759 void movptr(Address dst, Register src);
1760
1761 void movptr(Register dst, RegisterOrConstant src) {
1762 if (src.is_constant()) movptr(dst, src.as_constant());
1763 else movptr(dst, src.as_register());
1764 }
1765
1766#ifdef _LP641
1767 // Generally the next two are only used for moving NULL
1768 // Although there are situations in initializing the mark word where
1769 // they could be used. They are dangerous.
1770
1771 // They only exist on LP64 so that int32_t and intptr_t are not the same
1772 // and we have ambiguous declarations.
1773
1774 void movptr(Address dst, int32_t imm32);
1775 void movptr(Register dst, int32_t imm32);
1776#endif // _LP64
1777
1778 // to avoid hiding movl
1779 void mov32(AddressLiteral dst, Register src);
1780 void mov32(Register dst, AddressLiteral src);
1781
1782 // to avoid hiding movb
1783 void movbyte(ArrayAddress dst, int src);
1784
1785 // Import other mov() methods from the parent class or else
1786 // they will be hidden by the following overriding declaration.
1787 using Assembler::movdl;
1788 using Assembler::movq;
1789 void movdl(XMMRegister dst, AddressLiteral src);
1790 void movq(XMMRegister dst, AddressLiteral src);
1791
1792 // Can push value or effective address
1793 void pushptr(AddressLiteral src);
1794
1795 void pushptr(Address src) { LP64_ONLY(pushq(src))pushq(src) NOT_LP64(pushl(src)); }
1796 void popptr(Address src) { LP64_ONLY(popq(src))popq(src) NOT_LP64(popl(src)); }
1797
1798 void pushoop(jobject obj);
1799 void pushklass(Metadata* obj);
1800
1801 // sign extend as need a l to ptr sized element
1802 void movl2ptr(Register dst, Address src) { LP64_ONLY(movslq(dst, src))movslq(dst, src) NOT_LP64(movl(dst, src)); }
1803 void movl2ptr(Register dst, Register src) { LP64_ONLY(movslq(dst, src))movslq(dst, src) NOT_LP64(if (dst != src) movl(dst, src)); }
1804
1805
1806 public:
1807 // C2 compiled method's prolog code.
1808 void verified_entry(int framesize, int stack_bang_size, bool fp_mode_24b, bool is_stub);
1809
1810 // clear memory of size 'cnt' qwords, starting at 'base';
1811 // if 'is_large' is set, do not try to produce short loop
1812 void clear_mem(Register base, Register cnt, Register rtmp, XMMRegister xtmp, bool is_large, KRegister mask=knoreg);
1813
1814 // clear memory initialization sequence for constant size;
1815 void clear_mem(Register base, int cnt, Register rtmp, XMMRegister xtmp, KRegister mask=knoreg);
1816
1817 // clear memory of size 'cnt' qwords, starting at 'base' using XMM/YMM registers
1818 void xmm_clear_mem(Register base, Register cnt, Register rtmp, XMMRegister xtmp, KRegister mask=knoreg);
1819
1820 // Fill primitive arrays
1821 void generate_fill(BasicType t, bool aligned,
1822 Register to, Register value, Register count,
1823 Register rtmp, XMMRegister xtmp);
1824
1825 void encode_iso_array(Register src, Register dst, Register len,
1826 XMMRegister tmp1, XMMRegister tmp2, XMMRegister tmp3,
1827 XMMRegister tmp4, Register tmp5, Register result, bool ascii);
1828
1829#ifdef _LP641
1830 void add2_with_carry(Register dest_hi, Register dest_lo, Register src1, Register src2);
1831 void multiply_64_x_64_loop(Register x, Register xstart, Register x_xstart,
1832 Register y, Register y_idx, Register z,
1833 Register carry, Register product,
1834 Register idx, Register kdx);
1835 void multiply_add_128_x_128(Register x_xstart, Register y, Register z,
1836 Register yz_idx, Register idx,
1837 Register carry, Register product, int offset);
1838 void multiply_128_x_128_bmi2_loop(Register y, Register z,
1839 Register carry, Register carry2,
1840 Register idx, Register jdx,
1841 Register yz_idx1, Register yz_idx2,
1842 Register tmp, Register tmp3, Register tmp4);
1843 void multiply_128_x_128_loop(Register x_xstart, Register y, Register z,
1844 Register yz_idx, Register idx, Register jdx,
1845 Register carry, Register product,
1846 Register carry2);
1847 void multiply_to_len(Register x, Register xlen, Register y, Register ylen, Register z, Register zlen,
1848 Register tmp1, Register tmp2, Register tmp3, Register tmp4, Register tmp5);
1849 void square_rshift(Register x, Register len, Register z, Register tmp1, Register tmp3,
1850 Register tmp4, Register tmp5, Register rdxReg, Register raxReg);
1851 void multiply_add_64_bmi2(Register sum, Register op1, Register op2, Register carry,
1852 Register tmp2);
1853 void multiply_add_64(Register sum, Register op1, Register op2, Register carry,
1854 Register rdxReg, Register raxReg);
1855 void add_one_64(Register z, Register zlen, Register carry, Register tmp1);
1856 void lshift_by_1(Register x, Register len, Register z, Register zlen, Register tmp1, Register tmp2,
1857 Register tmp3, Register tmp4);
1858 void square_to_len(Register x, Register len, Register z, Register zlen, Register tmp1, Register tmp2,
1859 Register tmp3, Register tmp4, Register tmp5, Register rdxReg, Register raxReg);
1860
1861 void mul_add_128_x_32_loop(Register out, Register in, Register offset, Register len, Register tmp1,
1862 Register tmp2, Register tmp3, Register tmp4, Register tmp5, Register rdxReg,
1863 Register raxReg);
1864 void mul_add(Register out, Register in, Register offset, Register len, Register k, Register tmp1,
1865 Register tmp2, Register tmp3, Register tmp4, Register tmp5, Register rdxReg,
1866 Register raxReg);
1867 void vectorized_mismatch(Register obja, Register objb, Register length, Register log2_array_indxscale,
1868 Register result, Register tmp1, Register tmp2,
1869 XMMRegister vec1, XMMRegister vec2, XMMRegister vec3);
1870#endif
1871
1872 // CRC32 code for java.util.zip.CRC32::updateBytes() intrinsic.
1873 void update_byte_crc32(Register crc, Register val, Register table);
1874 void kernel_crc32(Register crc, Register buf, Register len, Register table, Register tmp);
1875
1876
1877#ifdef _LP641
1878 void kernel_crc32_avx512(Register crc, Register buf, Register len, Register table, Register tmp1, Register tmp2);
1879 void kernel_crc32_avx512_256B(Register crc, Register buf, Register len, Register key, Register pos,
1880 Register tmp1, Register tmp2, Label& L_barrett, Label& L_16B_reduction_loop,
1881 Label& L_get_last_two_xmms, Label& L_128_done, Label& L_cleanup);
1882 void updateBytesAdler32(Register adler32, Register buf, Register length, XMMRegister shuf0, XMMRegister shuf1, ExternalAddress scale);
1883#endif // _LP64
1884
1885 // CRC32C code for java.util.zip.CRC32C::updateBytes() intrinsic
1886 // Note on a naming convention:
1887 // Prefix w = register only used on a Westmere+ architecture
1888 // Prefix n = register only used on a Nehalem architecture
1889#ifdef _LP641
1890 void crc32c_ipl_alg4(Register in_out, uint32_t n,
1891 Register tmp1, Register tmp2, Register tmp3);
1892#else
1893 void crc32c_ipl_alg4(Register in_out, uint32_t n,
1894 Register tmp1, Register tmp2, Register tmp3,
1895 XMMRegister xtmp1, XMMRegister xtmp2);
1896#endif
1897 void crc32c_pclmulqdq(XMMRegister w_xtmp1,
1898 Register in_out,
1899 uint32_t const_or_pre_comp_const_index, bool is_pclmulqdq_supported,
1900 XMMRegister w_xtmp2,
1901 Register tmp1,
1902 Register n_tmp2, Register n_tmp3);
1903 void crc32c_rec_alt2(uint32_t const_or_pre_comp_const_index_u1, uint32_t const_or_pre_comp_const_index_u2, bool is_pclmulqdq_supported, Register in_out, Register in1, Register in2,
1904 XMMRegister w_xtmp1, XMMRegister w_xtmp2, XMMRegister w_xtmp3,
1905 Register tmp1, Register tmp2,
1906 Register n_tmp3);
1907 void crc32c_proc_chunk(uint32_t size, uint32_t const_or_pre_comp_const_index_u1, uint32_t const_or_pre_comp_const_index_u2, bool is_pclmulqdq_supported,
1908 Register in_out1, Register in_out2, Register in_out3,
1909 Register tmp1, Register tmp2, Register tmp3,
1910 XMMRegister w_xtmp1, XMMRegister w_xtmp2, XMMRegister w_xtmp3,
1911 Register tmp4, Register tmp5,
1912 Register n_tmp6);
1913 void crc32c_ipl_alg2_alt2(Register in_out, Register in1, Register in2,
1914 Register tmp1, Register tmp2, Register tmp3,
1915 Register tmp4, Register tmp5, Register tmp6,
1916 XMMRegister w_xtmp1, XMMRegister w_xtmp2, XMMRegister w_xtmp3,
1917 bool is_pclmulqdq_supported);
1918 // Fold 128-bit data chunk
1919 void fold_128bit_crc32(XMMRegister xcrc, XMMRegister xK, XMMRegister xtmp, Register buf, int offset);
1920 void fold_128bit_crc32(XMMRegister xcrc, XMMRegister xK, XMMRegister xtmp, XMMRegister xbuf);
1921#ifdef _LP641
1922 // Fold 512-bit data chunk
1923 void fold512bit_crc32_avx512(XMMRegister xcrc, XMMRegister xK, XMMRegister xtmp, Register buf, Register pos, int offset);
1924#endif // _LP64
1925 // Fold 8-bit data
1926 void fold_8bit_crc32(Register crc, Register table, Register tmp);
1927 void fold_8bit_crc32(XMMRegister crc, Register table, XMMRegister xtmp, Register tmp);
1928
1929 // Compress char[] array to byte[].
1930 void char_array_compress(Register src, Register dst, Register len,
1931 XMMRegister tmp1, XMMRegister tmp2, XMMRegister tmp3,
1932 XMMRegister tmp4, Register tmp5, Register result,
1933 KRegister mask1 = knoreg, KRegister mask2 = knoreg);
1934
1935 // Inflate byte[] array to char[].
1936 void byte_array_inflate(Register src, Register dst, Register len,
1937 XMMRegister tmp1, Register tmp2, KRegister mask = knoreg);
1938
1939 void fill_masked(BasicType bt, Address dst, XMMRegister xmm, KRegister mask,
1940 Register length, Register temp, int vec_enc);
1941
1942 void fill64_masked(uint shift, Register dst, int disp,
1943 XMMRegister xmm, KRegister mask, Register length,
1944 Register temp, bool use64byteVector = false);
1945
1946 void fill32_masked(uint shift, Register dst, int disp,
1947 XMMRegister xmm, KRegister mask, Register length,
1948 Register temp);
1949
1950 void fill32(Register dst, int disp, XMMRegister xmm);
1951
1952 void fill64(Register dst, int dis, XMMRegister xmm, bool use64byteVector = false);
1953
1954#ifdef _LP641
1955 void convert_f2i(Register dst, XMMRegister src);
1956 void convert_d2i(Register dst, XMMRegister src);
1957 void convert_f2l(Register dst, XMMRegister src);
1958 void convert_d2l(Register dst, XMMRegister src);
1959
1960 void cache_wb(Address line);
1961 void cache_wbsync(bool is_pre);
1962
1963#if COMPILER2_OR_JVMCI1
1964 void arraycopy_avx3_special_cases(XMMRegister xmm, KRegister mask, Register from,
1965 Register to, Register count, int shift,
1966 Register index, Register temp,
1967 bool use64byteVector, Label& L_entry, Label& L_exit);
1968
1969 void arraycopy_avx3_special_cases_conjoint(XMMRegister xmm, KRegister mask, Register from,
1970 Register to, Register start_index, Register end_index,
1971 Register count, int shift, Register temp,
1972 bool use64byteVector, Label& L_entry, Label& L_exit);
1973
1974 void copy64_masked_avx(Register dst, Register src, XMMRegister xmm,
1975 KRegister mask, Register length, Register index,
1976 Register temp, int shift = Address::times_1, int offset = 0,
1977 bool use64byteVector = false);
1978
1979 void copy32_masked_avx(Register dst, Register src, XMMRegister xmm,
1980 KRegister mask, Register length, Register index,
1981 Register temp, int shift = Address::times_1, int offset = 0);
1982
1983 void copy32_avx(Register dst, Register src, Register index, XMMRegister xmm,
1984 int shift = Address::times_1, int offset = 0);
1985
1986 void copy64_avx(Register dst, Register src, Register index, XMMRegister xmm,
1987 bool conjoint, int shift = Address::times_1, int offset = 0,
1988 bool use64byteVector = false);
1989
1990 void generate_fill_avx3(BasicType type, Register to, Register value,
1991 Register count, Register rtmp, XMMRegister xtmp);
1992
1993#endif // COMPILER2_OR_JVMCI
1994
1995#endif // _LP64
1996
1997 void vallones(XMMRegister dst, int vector_len);
1998};
1999
2000/**
2001 * class SkipIfEqual:
2002 *
2003 * Instantiating this class will result in assembly code being output that will
2004 * jump around any code emitted between the creation of the instance and it's
2005 * automatic destruction at the end of a scope block, depending on the value of
2006 * the flag passed to the constructor, which will be checked at run-time.
2007 */
2008class SkipIfEqual {
2009 private:
2010 MacroAssembler* _masm;
2011 Label _label;
2012
2013 public:
2014 SkipIfEqual(MacroAssembler*, const bool* flag_addr, bool value);
2015 ~SkipIfEqual();
2016};
2017
2018#endif // CPU_X86_MACROASSEMBLER_X86_HPP