Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.cpp
32285 views
1
/*
2
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
3
* Copyright 2012, 2014 SAP AG. All rights reserved.
4
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5
*
6
* This code is free software; you can redistribute it and/or modify it
7
* under the terms of the GNU General Public License version 2 only, as
8
* published by the Free Software Foundation.
9
*
10
* This code is distributed in the hope that it will be useful, but WITHOUT
11
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13
* version 2 for more details (a copy is included in the LICENSE file that
14
* accompanied this code).
15
*
16
* You should have received a copy of the GNU General Public License version
17
* 2 along with this work; if not, write to the Free Software Foundation,
18
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19
*
20
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21
* or visit www.oracle.com if you need additional information or have any
22
* questions.
23
*
24
*/
25
26
27
#include "precompiled.hpp"
28
#include "asm/macroAssembler.inline.hpp"
29
#include "interp_masm_ppc_64.hpp"
30
#include "interpreter/interpreterRuntime.hpp"
31
#include "prims/jvmtiThreadState.hpp"
32
33
#ifdef PRODUCT
34
#define BLOCK_COMMENT(str) // nothing
35
#else
36
#define BLOCK_COMMENT(str) block_comment(str)
37
#endif
38
39
void InterpreterMacroAssembler::null_check_throw(Register a, int offset, Register temp_reg) {
40
#ifdef CC_INTERP
41
address exception_entry = StubRoutines::throw_NullPointerException_at_call_entry();
42
#else
43
address exception_entry = Interpreter::throw_NullPointerException_entry();
44
#endif
45
MacroAssembler::null_check_throw(a, offset, temp_reg, exception_entry);
46
}
47
48
void InterpreterMacroAssembler::branch_to_entry(address entry, Register Rscratch) {
49
assert(entry, "Entry must have been generated by now");
50
if (is_within_range_of_b(entry, pc())) {
51
b(entry);
52
} else {
53
load_const_optimized(Rscratch, entry, R0);
54
mtctr(Rscratch);
55
bctr();
56
}
57
}
58
59
#ifndef CC_INTERP
60
61
void InterpreterMacroAssembler::dispatch_next(TosState state, int bcp_incr) {
62
Register bytecode = R12_scratch2;
63
if (bcp_incr != 0) {
64
lbzu(bytecode, bcp_incr, R14_bcp);
65
} else {
66
lbz(bytecode, 0, R14_bcp);
67
}
68
69
dispatch_Lbyte_code(state, bytecode, Interpreter::dispatch_table(state));
70
}
71
72
void InterpreterMacroAssembler::dispatch_via(TosState state, address* table) {
73
// Load current bytecode.
74
Register bytecode = R12_scratch2;
75
lbz(bytecode, 0, R14_bcp);
76
dispatch_Lbyte_code(state, bytecode, table);
77
}
78
79
// Dispatch code executed in the prolog of a bytecode which does not do it's
80
// own dispatch. The dispatch address is computed and placed in R24_dispatch_addr.
81
void InterpreterMacroAssembler::dispatch_prolog(TosState state, int bcp_incr) {
82
Register bytecode = R12_scratch2;
83
lbz(bytecode, bcp_incr, R14_bcp);
84
85
load_dispatch_table(R24_dispatch_addr, Interpreter::dispatch_table(state));
86
87
sldi(bytecode, bytecode, LogBytesPerWord);
88
ldx(R24_dispatch_addr, R24_dispatch_addr, bytecode);
89
}
90
91
// Dispatch code executed in the epilog of a bytecode which does not do it's
92
// own dispatch. The dispatch address in R24_dispatch_addr is used for the
93
// dispatch.
94
void InterpreterMacroAssembler::dispatch_epilog(TosState state, int bcp_incr) {
95
mtctr(R24_dispatch_addr);
96
addi(R14_bcp, R14_bcp, bcp_incr);
97
bctr();
98
}
99
100
void InterpreterMacroAssembler::check_and_handle_popframe(Register scratch_reg) {
101
assert(scratch_reg != R0, "can't use R0 as scratch_reg here");
102
if (JvmtiExport::can_pop_frame()) {
103
Label L;
104
105
// Check the "pending popframe condition" flag in the current thread.
106
lwz(scratch_reg, in_bytes(JavaThread::popframe_condition_offset()), R16_thread);
107
108
// Initiate popframe handling only if it is not already being
109
// processed. If the flag has the popframe_processing bit set, it
110
// means that this code is called *during* popframe handling - we
111
// don't want to reenter.
112
andi_(R0, scratch_reg, JavaThread::popframe_pending_bit);
113
beq(CCR0, L);
114
115
andi_(R0, scratch_reg, JavaThread::popframe_processing_bit);
116
bne(CCR0, L);
117
118
// Call the Interpreter::remove_activation_preserving_args_entry()
119
// func to get the address of the same-named entrypoint in the
120
// generated interpreter code.
121
#if defined(ABI_ELFv2)
122
call_c(CAST_FROM_FN_PTR(address,
123
Interpreter::remove_activation_preserving_args_entry),
124
relocInfo::none);
125
#else
126
call_c(CAST_FROM_FN_PTR(FunctionDescriptor*,
127
Interpreter::remove_activation_preserving_args_entry),
128
relocInfo::none);
129
#endif
130
131
// Jump to Interpreter::_remove_activation_preserving_args_entry.
132
mtctr(R3_RET);
133
bctr();
134
135
align(32, 12);
136
bind(L);
137
}
138
}
139
140
void InterpreterMacroAssembler::check_and_handle_earlyret(Register scratch_reg) {
141
const Register Rthr_state_addr = scratch_reg;
142
if (JvmtiExport::can_force_early_return()) {
143
Label Lno_early_ret;
144
ld(Rthr_state_addr, in_bytes(JavaThread::jvmti_thread_state_offset()), R16_thread);
145
cmpdi(CCR0, Rthr_state_addr, 0);
146
beq(CCR0, Lno_early_ret);
147
148
lwz(R0, in_bytes(JvmtiThreadState::earlyret_state_offset()), Rthr_state_addr);
149
cmpwi(CCR0, R0, JvmtiThreadState::earlyret_pending);
150
bne(CCR0, Lno_early_ret);
151
152
// Jump to Interpreter::_earlyret_entry.
153
lwz(R3_ARG1, in_bytes(JvmtiThreadState::earlyret_tos_offset()), Rthr_state_addr);
154
call_VM_leaf(CAST_FROM_FN_PTR(address, Interpreter::remove_activation_early_entry));
155
mtlr(R3_RET);
156
blr();
157
158
align(32, 12);
159
bind(Lno_early_ret);
160
}
161
}
162
163
void InterpreterMacroAssembler::load_earlyret_value(TosState state, Register Rscratch1) {
164
const Register RjvmtiState = Rscratch1;
165
const Register Rscratch2 = R0;
166
167
ld(RjvmtiState, in_bytes(JavaThread::jvmti_thread_state_offset()), R16_thread);
168
li(Rscratch2, 0);
169
170
switch (state) {
171
case atos: ld(R17_tos, in_bytes(JvmtiThreadState::earlyret_oop_offset()), RjvmtiState);
172
std(Rscratch2, in_bytes(JvmtiThreadState::earlyret_oop_offset()), RjvmtiState);
173
break;
174
case ltos: ld(R17_tos, in_bytes(JvmtiThreadState::earlyret_value_offset()), RjvmtiState);
175
break;
176
case btos: // fall through
177
case ztos: // fall through
178
case ctos: // fall through
179
case stos: // fall through
180
case itos: lwz(R17_tos, in_bytes(JvmtiThreadState::earlyret_value_offset()), RjvmtiState);
181
break;
182
case ftos: lfs(F15_ftos, in_bytes(JvmtiThreadState::earlyret_value_offset()), RjvmtiState);
183
break;
184
case dtos: lfd(F15_ftos, in_bytes(JvmtiThreadState::earlyret_value_offset()), RjvmtiState);
185
break;
186
case vtos: break;
187
default : ShouldNotReachHere();
188
}
189
190
// Clean up tos value in the jvmti thread state.
191
std(Rscratch2, in_bytes(JvmtiThreadState::earlyret_value_offset()), RjvmtiState);
192
// Set tos state field to illegal value.
193
li(Rscratch2, ilgl);
194
stw(Rscratch2, in_bytes(JvmtiThreadState::earlyret_tos_offset()), RjvmtiState);
195
}
196
197
// Common code to dispatch and dispatch_only.
198
// Dispatch value in Lbyte_code and increment Lbcp.
199
200
void InterpreterMacroAssembler::load_dispatch_table(Register dst, address* table) {
201
address table_base = (address)Interpreter::dispatch_table((TosState)0);
202
intptr_t table_offs = (intptr_t)table - (intptr_t)table_base;
203
if (is_simm16(table_offs)) {
204
addi(dst, R25_templateTableBase, (int)table_offs);
205
} else {
206
load_const_optimized(dst, table, R0);
207
}
208
}
209
210
void InterpreterMacroAssembler::dispatch_Lbyte_code(TosState state, Register bytecode, address* table, bool verify) {
211
if (verify) {
212
unimplemented("dispatch_Lbyte_code: verify"); // See Sparc Implementation to implement this
213
}
214
215
#ifdef FAST_DISPATCH
216
unimplemented("dispatch_Lbyte_code FAST_DISPATCH");
217
#else
218
assert_different_registers(bytecode, R11_scratch1);
219
220
// Calc dispatch table address.
221
load_dispatch_table(R11_scratch1, table);
222
223
sldi(R12_scratch2, bytecode, LogBytesPerWord);
224
ldx(R11_scratch1, R11_scratch1, R12_scratch2);
225
226
// Jump off!
227
mtctr(R11_scratch1);
228
bctr();
229
#endif
230
}
231
232
void InterpreterMacroAssembler::load_receiver(Register Rparam_count, Register Rrecv_dst) {
233
sldi(Rrecv_dst, Rparam_count, Interpreter::logStackElementSize);
234
ldx(Rrecv_dst, Rrecv_dst, R15_esp);
235
}
236
237
// helpers for expression stack
238
239
void InterpreterMacroAssembler::pop_i(Register r) {
240
lwzu(r, Interpreter::stackElementSize, R15_esp);
241
}
242
243
void InterpreterMacroAssembler::pop_ptr(Register r) {
244
ldu(r, Interpreter::stackElementSize, R15_esp);
245
}
246
247
void InterpreterMacroAssembler::pop_l(Register r) {
248
ld(r, Interpreter::stackElementSize, R15_esp);
249
addi(R15_esp, R15_esp, 2 * Interpreter::stackElementSize);
250
}
251
252
void InterpreterMacroAssembler::pop_f(FloatRegister f) {
253
lfsu(f, Interpreter::stackElementSize, R15_esp);
254
}
255
256
void InterpreterMacroAssembler::pop_d(FloatRegister f) {
257
lfd(f, Interpreter::stackElementSize, R15_esp);
258
addi(R15_esp, R15_esp, 2 * Interpreter::stackElementSize);
259
}
260
261
void InterpreterMacroAssembler::push_i(Register r) {
262
stw(r, 0, R15_esp);
263
addi(R15_esp, R15_esp, - Interpreter::stackElementSize );
264
}
265
266
void InterpreterMacroAssembler::push_ptr(Register r) {
267
std(r, 0, R15_esp);
268
addi(R15_esp, R15_esp, - Interpreter::stackElementSize );
269
}
270
271
void InterpreterMacroAssembler::push_l(Register r) {
272
std(r, - Interpreter::stackElementSize, R15_esp);
273
addi(R15_esp, R15_esp, - 2 * Interpreter::stackElementSize );
274
}
275
276
void InterpreterMacroAssembler::push_f(FloatRegister f) {
277
stfs(f, 0, R15_esp);
278
addi(R15_esp, R15_esp, - Interpreter::stackElementSize );
279
}
280
281
void InterpreterMacroAssembler::push_d(FloatRegister f) {
282
stfd(f, - Interpreter::stackElementSize, R15_esp);
283
addi(R15_esp, R15_esp, - 2 * Interpreter::stackElementSize );
284
}
285
286
void InterpreterMacroAssembler::push_2ptrs(Register first, Register second) {
287
std(first, 0, R15_esp);
288
std(second, -Interpreter::stackElementSize, R15_esp);
289
addi(R15_esp, R15_esp, - 2 * Interpreter::stackElementSize );
290
}
291
292
void InterpreterMacroAssembler::push_l_pop_d(Register l, FloatRegister d) {
293
std(l, 0, R15_esp);
294
lfd(d, 0, R15_esp);
295
}
296
297
void InterpreterMacroAssembler::push_d_pop_l(FloatRegister d, Register l) {
298
stfd(d, 0, R15_esp);
299
ld(l, 0, R15_esp);
300
}
301
302
void InterpreterMacroAssembler::push(TosState state) {
303
switch (state) {
304
case atos: push_ptr(); break;
305
case btos:
306
case ztos:
307
case ctos:
308
case stos:
309
case itos: push_i(); break;
310
case ltos: push_l(); break;
311
case ftos: push_f(); break;
312
case dtos: push_d(); break;
313
case vtos: /* nothing to do */ break;
314
default : ShouldNotReachHere();
315
}
316
}
317
318
void InterpreterMacroAssembler::pop(TosState state) {
319
switch (state) {
320
case atos: pop_ptr(); break;
321
case btos:
322
case ztos:
323
case ctos:
324
case stos:
325
case itos: pop_i(); break;
326
case ltos: pop_l(); break;
327
case ftos: pop_f(); break;
328
case dtos: pop_d(); break;
329
case vtos: /* nothing to do */ break;
330
default : ShouldNotReachHere();
331
}
332
verify_oop(R17_tos, state);
333
}
334
335
void InterpreterMacroAssembler::empty_expression_stack() {
336
addi(R15_esp, R26_monitor, - Interpreter::stackElementSize);
337
}
338
339
void InterpreterMacroAssembler::get_2_byte_integer_at_bcp(int bcp_offset,
340
Register Rdst,
341
signedOrNot is_signed) {
342
#if defined(VM_LITTLE_ENDIAN)
343
if (bcp_offset) {
344
load_const_optimized(Rdst, bcp_offset);
345
lhbrx(Rdst, R14_bcp, Rdst);
346
} else {
347
lhbrx(Rdst, R14_bcp);
348
}
349
if (is_signed == Signed) {
350
extsh(Rdst, Rdst);
351
}
352
#else
353
// Read Java big endian format.
354
if (is_signed == Signed) {
355
lha(Rdst, bcp_offset, R14_bcp);
356
} else {
357
lhz(Rdst, bcp_offset, R14_bcp);
358
}
359
#endif
360
}
361
362
void InterpreterMacroAssembler::get_4_byte_integer_at_bcp(int bcp_offset,
363
Register Rdst,
364
signedOrNot is_signed) {
365
#if defined(VM_LITTLE_ENDIAN)
366
if (bcp_offset) {
367
load_const_optimized(Rdst, bcp_offset);
368
lwbrx(Rdst, R14_bcp, Rdst);
369
} else {
370
lwbrx(Rdst, R14_bcp);
371
}
372
if (is_signed == Signed) {
373
extsw(Rdst, Rdst);
374
}
375
#else
376
// Read Java big endian format.
377
if (bcp_offset & 3) { // Offset unaligned?
378
load_const_optimized(Rdst, bcp_offset);
379
if (is_signed == Signed) {
380
lwax(Rdst, R14_bcp, Rdst);
381
} else {
382
lwzx(Rdst, R14_bcp, Rdst);
383
}
384
} else {
385
if (is_signed == Signed) {
386
lwa(Rdst, bcp_offset, R14_bcp);
387
} else {
388
lwz(Rdst, bcp_offset, R14_bcp);
389
}
390
}
391
#endif
392
}
393
394
395
// Load the constant pool cache index from the bytecode stream.
396
//
397
// Kills / writes:
398
// - Rdst, Rscratch
399
void InterpreterMacroAssembler::get_cache_index_at_bcp(Register Rdst, int bcp_offset, size_t index_size) {
400
assert(bcp_offset > 0, "bcp is still pointing to start of bytecode");
401
// Cache index is always in the native format, courtesy of Rewriter.
402
if (index_size == sizeof(u2)) {
403
lhz(Rdst, bcp_offset, R14_bcp);
404
} else if (index_size == sizeof(u4)) {
405
assert(EnableInvokeDynamic, "giant index used only for JSR 292");
406
if (bcp_offset & 3) {
407
load_const_optimized(Rdst, bcp_offset);
408
lwax(Rdst, R14_bcp, Rdst);
409
} else {
410
lwa(Rdst, bcp_offset, R14_bcp);
411
}
412
assert(ConstantPool::decode_invokedynamic_index(~123) == 123, "else change next line");
413
nand(Rdst, Rdst, Rdst); // convert to plain index
414
} else if (index_size == sizeof(u1)) {
415
lbz(Rdst, bcp_offset, R14_bcp);
416
} else {
417
ShouldNotReachHere();
418
}
419
// Rdst now contains cp cache index.
420
}
421
422
void InterpreterMacroAssembler::get_cache_and_index_at_bcp(Register cache, int bcp_offset, size_t index_size) {
423
get_cache_index_at_bcp(cache, bcp_offset, index_size);
424
sldi(cache, cache, exact_log2(in_words(ConstantPoolCacheEntry::size()) * BytesPerWord));
425
add(cache, R27_constPoolCache, cache);
426
}
427
428
// Load 4-byte signed or unsigned integer in Java format (that is, big-endian format)
429
// from (Rsrc)+offset.
430
void InterpreterMacroAssembler::get_u4(Register Rdst, Register Rsrc, int offset,
431
signedOrNot is_signed) {
432
#if defined(VM_LITTLE_ENDIAN)
433
if (offset) {
434
load_const_optimized(Rdst, offset);
435
lwbrx(Rdst, Rdst, Rsrc);
436
} else {
437
lwbrx(Rdst, Rsrc);
438
}
439
if (is_signed == Signed) {
440
extsw(Rdst, Rdst);
441
}
442
#else
443
if (is_signed == Signed) {
444
lwa(Rdst, offset, Rsrc);
445
} else {
446
lwz(Rdst, offset, Rsrc);
447
}
448
#endif
449
}
450
451
// Load object from cpool->resolved_references(index).
452
void InterpreterMacroAssembler::load_resolved_reference_at_index(Register result, Register index) {
453
assert_different_registers(result, index);
454
get_constant_pool(result);
455
456
// Convert from field index to resolved_references() index and from
457
// word index to byte offset. Since this is a java object, it can be compressed.
458
Register tmp = index; // reuse
459
sldi(tmp, index, LogBytesPerHeapOop);
460
// Load pointer for resolved_references[] objArray.
461
ld(result, ConstantPool::resolved_references_offset_in_bytes(), result);
462
// JNIHandles::resolve(result)
463
ld(result, 0, result);
464
#ifdef ASSERT
465
Label index_ok;
466
lwa(R0, arrayOopDesc::length_offset_in_bytes(), result);
467
sldi(R0, R0, LogBytesPerHeapOop);
468
cmpd(CCR0, tmp, R0);
469
blt(CCR0, index_ok);
470
stop("resolved reference index out of bounds", 0x09256);
471
bind(index_ok);
472
#endif
473
// Add in the index.
474
add(result, tmp, result);
475
load_heap_oop(result, arrayOopDesc::base_offset_in_bytes(T_OBJECT), result);
476
}
477
478
// Generate a subtype check: branch to ok_is_subtype if sub_klass is
479
// a subtype of super_klass. Blows registers Rsub_klass, tmp1, tmp2.
480
void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass, Register Rsuper_klass, Register Rtmp1,
481
Register Rtmp2, Register Rtmp3, Label &ok_is_subtype) {
482
// Profile the not-null value's klass.
483
profile_typecheck(Rsub_klass, Rtmp1, Rtmp2);
484
check_klass_subtype(Rsub_klass, Rsuper_klass, Rtmp1, Rtmp2, ok_is_subtype);
485
profile_typecheck_failed(Rtmp1, Rtmp2);
486
}
487
488
void InterpreterMacroAssembler::generate_stack_overflow_check_with_compare_and_throw(Register Rmem_frame_size, Register Rscratch1) {
489
Label done;
490
sub(Rmem_frame_size, R1_SP, Rmem_frame_size);
491
ld(Rscratch1, thread_(stack_overflow_limit));
492
cmpld(CCR0/*is_stack_overflow*/, Rmem_frame_size, Rscratch1);
493
bgt(CCR0/*is_stack_overflow*/, done);
494
495
// Load target address of the runtime stub.
496
assert(StubRoutines::throw_StackOverflowError_entry() != NULL, "generated in wrong order");
497
load_const_optimized(Rscratch1, (StubRoutines::throw_StackOverflowError_entry()), R0);
498
mtctr(Rscratch1);
499
// Restore caller_sp.
500
#ifdef ASSERT
501
ld(Rscratch1, 0, R1_SP);
502
ld(R0, 0, R21_sender_SP);
503
cmpd(CCR0, R0, Rscratch1);
504
asm_assert_eq("backlink", 0x547);
505
#endif // ASSERT
506
mr(R1_SP, R21_sender_SP);
507
bctr();
508
509
align(32, 12);
510
bind(done);
511
}
512
513
// Separate these two to allow for delay slot in middle.
514
// These are used to do a test and full jump to exception-throwing code.
515
516
// Check that index is in range for array, then shift index by index_shift,
517
// and put arrayOop + shifted_index into res.
518
// Note: res is still shy of address by array offset into object.
519
520
void InterpreterMacroAssembler::index_check_without_pop(Register Rarray, Register Rindex, int index_shift, Register Rtmp, Register Rres) {
521
// Check that index is in range for array, then shift index by index_shift,
522
// and put arrayOop + shifted_index into res.
523
// Note: res is still shy of address by array offset into object.
524
// Kills:
525
// - Rindex
526
// Writes:
527
// - Rres: Address that corresponds to the array index if check was successful.
528
verify_oop(Rarray);
529
const Register Rlength = R0;
530
const Register RsxtIndex = Rtmp;
531
Label LisNull, LnotOOR;
532
533
// Array nullcheck
534
if (!ImplicitNullChecks) {
535
cmpdi(CCR0, Rarray, 0);
536
beq(CCR0, LisNull);
537
} else {
538
null_check_throw(Rarray, arrayOopDesc::length_offset_in_bytes(), /*temp*/RsxtIndex);
539
}
540
541
// Rindex might contain garbage in upper bits (remember that we don't sign extend
542
// during integer arithmetic operations). So kill them and put value into same register
543
// where ArrayIndexOutOfBounds would expect the index in.
544
rldicl(RsxtIndex, Rindex, 0, 32); // zero extend 32 bit -> 64 bit
545
546
// Index check
547
lwz(Rlength, arrayOopDesc::length_offset_in_bytes(), Rarray);
548
cmplw(CCR0, Rindex, Rlength);
549
sldi(RsxtIndex, RsxtIndex, index_shift);
550
blt(CCR0, LnotOOR);
551
// Index should be in R17_tos, array should be in R4_ARG2.
552
mr(R17_tos, Rindex);
553
mr(R4_ARG2, Rarray);
554
load_dispatch_table(Rtmp, (address*)Interpreter::_throw_ArrayIndexOutOfBoundsException_entry);
555
mtctr(Rtmp);
556
bctr();
557
558
if (!ImplicitNullChecks) {
559
bind(LisNull);
560
load_dispatch_table(Rtmp, (address*)Interpreter::_throw_NullPointerException_entry);
561
mtctr(Rtmp);
562
bctr();
563
}
564
565
align(32, 16);
566
bind(LnotOOR);
567
568
// Calc address
569
add(Rres, RsxtIndex, Rarray);
570
}
571
572
void InterpreterMacroAssembler::index_check(Register array, Register index, int index_shift, Register tmp, Register res) {
573
// pop array
574
pop_ptr(array);
575
576
// check array
577
index_check_without_pop(array, index, index_shift, tmp, res);
578
}
579
580
void InterpreterMacroAssembler::get_const(Register Rdst) {
581
ld(Rdst, in_bytes(Method::const_offset()), R19_method);
582
}
583
584
void InterpreterMacroAssembler::get_constant_pool(Register Rdst) {
585
get_const(Rdst);
586
ld(Rdst, in_bytes(ConstMethod::constants_offset()), Rdst);
587
}
588
589
void InterpreterMacroAssembler::get_constant_pool_cache(Register Rdst) {
590
get_constant_pool(Rdst);
591
ld(Rdst, ConstantPool::cache_offset_in_bytes(), Rdst);
592
}
593
594
void InterpreterMacroAssembler::get_cpool_and_tags(Register Rcpool, Register Rtags) {
595
get_constant_pool(Rcpool);
596
ld(Rtags, ConstantPool::tags_offset_in_bytes(), Rcpool);
597
}
598
599
// Unlock if synchronized method.
600
//
601
// Unlock the receiver if this is a synchronized method.
602
// Unlock any Java monitors from synchronized blocks.
603
//
604
// If there are locked Java monitors
605
// If throw_monitor_exception
606
// throws IllegalMonitorStateException
607
// Else if install_monitor_exception
608
// installs IllegalMonitorStateException
609
// Else
610
// no error processing
611
void InterpreterMacroAssembler::unlock_if_synchronized_method(TosState state,
612
bool throw_monitor_exception,
613
bool install_monitor_exception) {
614
Label Lunlocked, Lno_unlock;
615
{
616
Register Rdo_not_unlock_flag = R11_scratch1;
617
Register Raccess_flags = R12_scratch2;
618
619
// Check if synchronized method or unlocking prevented by
620
// JavaThread::do_not_unlock_if_synchronized flag.
621
lbz(Rdo_not_unlock_flag, in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()), R16_thread);
622
lwz(Raccess_flags, in_bytes(Method::access_flags_offset()), R19_method);
623
li(R0, 0);
624
stb(R0, in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()), R16_thread); // reset flag
625
626
push(state);
627
628
// Skip if we don't have to unlock.
629
rldicl_(R0, Raccess_flags, 64-JVM_ACC_SYNCHRONIZED_BIT, 63); // Extract bit and compare to 0.
630
beq(CCR0, Lunlocked);
631
632
cmpwi(CCR0, Rdo_not_unlock_flag, 0);
633
bne(CCR0, Lno_unlock);
634
}
635
636
// Unlock
637
{
638
Register Rmonitor_base = R11_scratch1;
639
640
Label Lunlock;
641
// If it's still locked, everything is ok, unlock it.
642
ld(Rmonitor_base, 0, R1_SP);
643
addi(Rmonitor_base, Rmonitor_base, - (frame::ijava_state_size + frame::interpreter_frame_monitor_size_in_bytes())); // Monitor base
644
645
ld(R0, BasicObjectLock::obj_offset_in_bytes(), Rmonitor_base);
646
cmpdi(CCR0, R0, 0);
647
bne(CCR0, Lunlock);
648
649
// If it's already unlocked, throw exception.
650
if (throw_monitor_exception) {
651
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_illegal_monitor_state_exception));
652
should_not_reach_here();
653
} else {
654
if (install_monitor_exception) {
655
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::new_illegal_monitor_state_exception));
656
b(Lunlocked);
657
}
658
}
659
660
bind(Lunlock);
661
unlock_object(Rmonitor_base);
662
}
663
664
// Check that all other monitors are unlocked. Throw IllegelMonitorState exception if not.
665
bind(Lunlocked);
666
{
667
Label Lexception, Lrestart;
668
Register Rcurrent_obj_addr = R11_scratch1;
669
const int delta = frame::interpreter_frame_monitor_size_in_bytes();
670
assert((delta & LongAlignmentMask) == 0, "sizeof BasicObjectLock must be even number of doublewords");
671
672
bind(Lrestart);
673
// Set up search loop: Calc num of iterations.
674
{
675
Register Riterations = R12_scratch2;
676
Register Rmonitor_base = Rcurrent_obj_addr;
677
ld(Rmonitor_base, 0, R1_SP);
678
addi(Rmonitor_base, Rmonitor_base, - frame::ijava_state_size); // Monitor base
679
680
subf_(Riterations, R26_monitor, Rmonitor_base);
681
ble(CCR0, Lno_unlock);
682
683
addi(Rcurrent_obj_addr, Rmonitor_base, BasicObjectLock::obj_offset_in_bytes() - frame::interpreter_frame_monitor_size_in_bytes());
684
// Check if any monitor is on stack, bail out if not
685
srdi(Riterations, Riterations, exact_log2(delta));
686
mtctr(Riterations);
687
}
688
689
// The search loop: Look for locked monitors.
690
{
691
const Register Rcurrent_obj = R0;
692
Label Lloop;
693
694
ld(Rcurrent_obj, 0, Rcurrent_obj_addr);
695
addi(Rcurrent_obj_addr, Rcurrent_obj_addr, -delta);
696
bind(Lloop);
697
698
// Check if current entry is used.
699
cmpdi(CCR0, Rcurrent_obj, 0);
700
bne(CCR0, Lexception);
701
// Preload next iteration's compare value.
702
ld(Rcurrent_obj, 0, Rcurrent_obj_addr);
703
addi(Rcurrent_obj_addr, Rcurrent_obj_addr, -delta);
704
bdnz(Lloop);
705
}
706
// Fell through: Everything's unlocked => finish.
707
b(Lno_unlock);
708
709
// An object is still locked => need to throw exception.
710
bind(Lexception);
711
if (throw_monitor_exception) {
712
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_illegal_monitor_state_exception));
713
should_not_reach_here();
714
} else {
715
// Stack unrolling. Unlock object and if requested, install illegal_monitor_exception.
716
// Unlock does not block, so don't have to worry about the frame.
717
Register Rmonitor_addr = R11_scratch1;
718
addi(Rmonitor_addr, Rcurrent_obj_addr, -BasicObjectLock::obj_offset_in_bytes() + delta);
719
unlock_object(Rmonitor_addr);
720
if (install_monitor_exception) {
721
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::new_illegal_monitor_state_exception));
722
}
723
b(Lrestart);
724
}
725
}
726
727
align(32, 12);
728
bind(Lno_unlock);
729
pop(state);
730
}
731
732
// Support function for remove_activation & Co.
733
void InterpreterMacroAssembler::merge_frames(Register Rsender_sp, Register return_pc, Register Rscratch1, Register Rscratch2) {
734
// Pop interpreter frame.
735
ld(Rscratch1, 0, R1_SP); // *SP
736
ld(Rsender_sp, _ijava_state_neg(sender_sp), Rscratch1); // top_frame_sp
737
ld(Rscratch2, 0, Rscratch1); // **SP
738
#ifdef ASSERT
739
{
740
Label Lok;
741
ld(R0, _ijava_state_neg(ijava_reserved), Rscratch1);
742
cmpdi(CCR0, R0, 0x5afe);
743
beq(CCR0, Lok);
744
stop("frame corrupted (remove activation)", 0x5afe);
745
bind(Lok);
746
}
747
#endif
748
if (return_pc!=noreg) {
749
ld(return_pc, _abi(lr), Rscratch1); // LR
750
}
751
752
// Merge top frames.
753
subf(Rscratch1, R1_SP, Rsender_sp); // top_frame_sp - SP
754
stdux(Rscratch2, R1_SP, Rscratch1); // atomically set *(SP = top_frame_sp) = **SP
755
}
756
757
void InterpreterMacroAssembler::narrow(Register result) {
758
Register ret_type = R11_scratch1;
759
ld(R11_scratch1, in_bytes(Method::const_offset()), R19_method);
760
lbz(ret_type, in_bytes(ConstMethod::result_type_offset()), R11_scratch1);
761
762
Label notBool, notByte, notChar, done;
763
764
// common case first
765
cmpwi(CCR0, ret_type, T_INT);
766
beq(CCR0, done);
767
768
cmpwi(CCR0, ret_type, T_BOOLEAN);
769
bne(CCR0, notBool);
770
andi(result, result, 0x1);
771
b(done);
772
773
bind(notBool);
774
cmpwi(CCR0, ret_type, T_BYTE);
775
bne(CCR0, notByte);
776
extsb(result, result);
777
b(done);
778
779
bind(notByte);
780
cmpwi(CCR0, ret_type, T_CHAR);
781
bne(CCR0, notChar);
782
andi(result, result, 0xffff);
783
b(done);
784
785
bind(notChar);
786
// cmpwi(CCR0, ret_type, T_SHORT); // all that's left
787
// bne(CCR0, done);
788
extsh(result, result);
789
790
// Nothing to do for T_INT
791
bind(done);
792
}
793
794
// Remove activation.
795
//
796
// Unlock the receiver if this is a synchronized method.
797
// Unlock any Java monitors from synchronized blocks.
798
// Remove the activation from the stack.
799
//
800
// If there are locked Java monitors
801
// If throw_monitor_exception
802
// throws IllegalMonitorStateException
803
// Else if install_monitor_exception
804
// installs IllegalMonitorStateException
805
// Else
806
// no error processing
807
void InterpreterMacroAssembler::remove_activation(TosState state,
808
bool throw_monitor_exception,
809
bool install_monitor_exception) {
810
unlock_if_synchronized_method(state, throw_monitor_exception, install_monitor_exception);
811
812
// Save result (push state before jvmti call and pop it afterwards) and notify jvmti.
813
notify_method_exit(false, state, NotifyJVMTI, true);
814
815
verify_oop(R17_tos, state);
816
verify_thread();
817
818
merge_frames(/*top_frame_sp*/ R21_sender_SP, /*return_pc*/ R0, R11_scratch1, R12_scratch2);
819
mtlr(R0);
820
}
821
822
#endif // !CC_INTERP
823
824
// Lock object
825
//
826
// Registers alive
827
// monitor - Address of the BasicObjectLock to be used for locking,
828
// which must be initialized with the object to lock.
829
// object - Address of the object to be locked.
830
//
831
void InterpreterMacroAssembler::lock_object(Register monitor, Register object) {
832
if (UseHeavyMonitors) {
833
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorenter),
834
monitor, /*check_for_exceptions=*/true CC_INTERP_ONLY(&& false));
835
} else {
836
// template code:
837
//
838
// markOop displaced_header = obj->mark().set_unlocked();
839
// monitor->lock()->set_displaced_header(displaced_header);
840
// if (Atomic::cmpxchg_ptr(/*ex=*/monitor, /*addr*/obj->mark_addr(), /*cmp*/displaced_header) == displaced_header) {
841
// // We stored the monitor address into the object's mark word.
842
// } else if (THREAD->is_lock_owned((address)displaced_header))
843
// // Simple recursive case.
844
// monitor->lock()->set_displaced_header(NULL);
845
// } else {
846
// // Slow path.
847
// InterpreterRuntime::monitorenter(THREAD, monitor);
848
// }
849
850
const Register displaced_header = R7_ARG5;
851
const Register object_mark_addr = R8_ARG6;
852
const Register current_header = R9_ARG7;
853
const Register tmp = R10_ARG8;
854
855
Label done;
856
Label cas_failed, slow_case;
857
858
assert_different_registers(displaced_header, object_mark_addr, current_header, tmp);
859
860
// markOop displaced_header = obj->mark().set_unlocked();
861
862
// Load markOop from object into displaced_header.
863
ld(displaced_header, oopDesc::mark_offset_in_bytes(), object);
864
865
if (UseBiasedLocking) {
866
biased_locking_enter(CCR0, object, displaced_header, tmp, current_header, done, &slow_case);
867
}
868
869
// Set displaced_header to be (markOop of object | UNLOCK_VALUE).
870
ori(displaced_header, displaced_header, markOopDesc::unlocked_value);
871
872
// monitor->lock()->set_displaced_header(displaced_header);
873
874
// Initialize the box (Must happen before we update the object mark!).
875
std(displaced_header, BasicObjectLock::lock_offset_in_bytes() +
876
BasicLock::displaced_header_offset_in_bytes(), monitor);
877
878
// if (Atomic::cmpxchg_ptr(/*ex=*/monitor, /*addr*/obj->mark_addr(), /*cmp*/displaced_header) == displaced_header) {
879
880
// Store stack address of the BasicObjectLock (this is monitor) into object.
881
addi(object_mark_addr, object, oopDesc::mark_offset_in_bytes());
882
883
// Must fence, otherwise, preceding store(s) may float below cmpxchg.
884
// CmpxchgX sets CCR0 to cmpX(current, displaced).
885
fence(); // TODO: replace by MacroAssembler::MemBarRel | MacroAssembler::MemBarAcq ?
886
cmpxchgd(/*flag=*/CCR0,
887
/*current_value=*/current_header,
888
/*compare_value=*/displaced_header, /*exchange_value=*/monitor,
889
/*where=*/object_mark_addr,
890
MacroAssembler::MemBarRel | MacroAssembler::MemBarAcq,
891
MacroAssembler::cmpxchgx_hint_acquire_lock(),
892
noreg,
893
&cas_failed);
894
895
// If the compare-and-exchange succeeded, then we found an unlocked
896
// object and we have now locked it.
897
b(done);
898
bind(cas_failed);
899
900
// } else if (THREAD->is_lock_owned((address)displaced_header))
901
// // Simple recursive case.
902
// monitor->lock()->set_displaced_header(NULL);
903
904
// We did not see an unlocked object so try the fast recursive case.
905
906
// Check if owner is self by comparing the value in the markOop of object
907
// (current_header) with the stack pointer.
908
sub(current_header, current_header, R1_SP);
909
910
assert(os::vm_page_size() > 0xfff, "page size too small - change the constant");
911
load_const_optimized(tmp, ~(os::vm_page_size()-1) | markOopDesc::lock_mask_in_place);
912
913
and_(R0/*==0?*/, current_header, tmp);
914
// If condition is true we are done and hence we can store 0 in the displaced
915
// header indicating it is a recursive lock.
916
bne(CCR0, slow_case);
917
release();
918
std(R0/*==0!*/, BasicObjectLock::lock_offset_in_bytes() +
919
BasicLock::displaced_header_offset_in_bytes(), monitor);
920
b(done);
921
922
// } else {
923
// // Slow path.
924
// InterpreterRuntime::monitorenter(THREAD, monitor);
925
926
// None of the above fast optimizations worked so we have to get into the
927
// slow case of monitor enter.
928
bind(slow_case);
929
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorenter),
930
monitor, /*check_for_exceptions=*/true CC_INTERP_ONLY(&& false));
931
// }
932
align(32, 12);
933
bind(done);
934
}
935
}
936
937
// Unlocks an object. Used in monitorexit bytecode and remove_activation.
938
//
939
// Registers alive
940
// monitor - Address of the BasicObjectLock to be used for locking,
941
// which must be initialized with the object to lock.
942
//
943
// Throw IllegalMonitorException if object is not locked by current thread.
944
void InterpreterMacroAssembler::unlock_object(Register monitor, bool check_for_exceptions) {
945
if (UseHeavyMonitors) {
946
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorexit),
947
monitor, check_for_exceptions CC_INTERP_ONLY(&& false));
948
} else {
949
950
// template code:
951
//
952
// if ((displaced_header = monitor->displaced_header()) == NULL) {
953
// // Recursive unlock. Mark the monitor unlocked by setting the object field to NULL.
954
// monitor->set_obj(NULL);
955
// } else if (Atomic::cmpxchg_ptr(displaced_header, obj->mark_addr(), monitor) == monitor) {
956
// // We swapped the unlocked mark in displaced_header into the object's mark word.
957
// monitor->set_obj(NULL);
958
// } else {
959
// // Slow path.
960
// InterpreterRuntime::monitorexit(THREAD, monitor);
961
// }
962
963
const Register object = R7_ARG5;
964
const Register displaced_header = R8_ARG6;
965
const Register object_mark_addr = R9_ARG7;
966
const Register current_header = R10_ARG8;
967
968
Label free_slot;
969
Label slow_case;
970
971
assert_different_registers(object, displaced_header, object_mark_addr, current_header);
972
973
if (UseBiasedLocking) {
974
// The object address from the monitor is in object.
975
ld(object, BasicObjectLock::obj_offset_in_bytes(), monitor);
976
assert(oopDesc::mark_offset_in_bytes() == 0, "offset of _mark is not 0");
977
biased_locking_exit(CCR0, object, displaced_header, free_slot);
978
}
979
980
// Test first if we are in the fast recursive case.
981
ld(displaced_header, BasicObjectLock::lock_offset_in_bytes() +
982
BasicLock::displaced_header_offset_in_bytes(), monitor);
983
984
// If the displaced header is zero, we have a recursive unlock.
985
cmpdi(CCR0, displaced_header, 0);
986
beq(CCR0, free_slot); // recursive unlock
987
988
// } else if (Atomic::cmpxchg_ptr(displaced_header, obj->mark_addr(), monitor) == monitor) {
989
// // We swapped the unlocked mark in displaced_header into the object's mark word.
990
// monitor->set_obj(NULL);
991
992
// If we still have a lightweight lock, unlock the object and be done.
993
994
// The object address from the monitor is in object.
995
if (!UseBiasedLocking) { ld(object, BasicObjectLock::obj_offset_in_bytes(), monitor); }
996
addi(object_mark_addr, object, oopDesc::mark_offset_in_bytes());
997
998
// We have the displaced header in displaced_header. If the lock is still
999
// lightweight, it will contain the monitor address and we'll store the
1000
// displaced header back into the object's mark word.
1001
// CmpxchgX sets CCR0 to cmpX(current, monitor).
1002
cmpxchgd(/*flag=*/CCR0,
1003
/*current_value=*/current_header,
1004
/*compare_value=*/monitor, /*exchange_value=*/displaced_header,
1005
/*where=*/object_mark_addr,
1006
MacroAssembler::MemBarRel,
1007
MacroAssembler::cmpxchgx_hint_release_lock(),
1008
noreg,
1009
&slow_case);
1010
b(free_slot);
1011
1012
// } else {
1013
// // Slow path.
1014
// InterpreterRuntime::monitorexit(THREAD, monitor);
1015
1016
// The lock has been converted into a heavy lock and hence
1017
// we need to get into the slow case.
1018
bind(slow_case);
1019
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::monitorexit),
1020
monitor, check_for_exceptions CC_INTERP_ONLY(&& false));
1021
// }
1022
1023
Label done;
1024
b(done); // Monitor register may be overwritten! Runtime has already freed the slot.
1025
1026
// Exchange worked, do monitor->set_obj(NULL);
1027
align(32, 12);
1028
bind(free_slot);
1029
li(R0, 0);
1030
std(R0, BasicObjectLock::obj_offset_in_bytes(), monitor);
1031
bind(done);
1032
}
1033
}
1034
1035
#ifndef CC_INTERP
1036
1037
// Load compiled (i2c) or interpreter entry when calling from interpreted and
1038
// do the call. Centralized so that all interpreter calls will do the same actions.
1039
// If jvmti single stepping is on for a thread we must not call compiled code.
1040
//
1041
// Input:
1042
// - Rtarget_method: method to call
1043
// - Rret_addr: return address
1044
// - 2 scratch regs
1045
//
1046
void InterpreterMacroAssembler::call_from_interpreter(Register Rtarget_method, Register Rret_addr, Register Rscratch1, Register Rscratch2) {
1047
assert_different_registers(Rscratch1, Rscratch2, Rtarget_method, Rret_addr);
1048
// Assume we want to go compiled if available.
1049
const Register Rtarget_addr = Rscratch1;
1050
const Register Rinterp_only = Rscratch2;
1051
1052
ld(Rtarget_addr, in_bytes(Method::from_interpreted_offset()), Rtarget_method);
1053
1054
if (JvmtiExport::can_post_interpreter_events()) {
1055
lwz(Rinterp_only, in_bytes(JavaThread::interp_only_mode_offset()), R16_thread);
1056
1057
// JVMTI events, such as single-stepping, are implemented partly by avoiding running
1058
// compiled code in threads for which the event is enabled. Check here for
1059
// interp_only_mode if these events CAN be enabled.
1060
Label done;
1061
verify_thread();
1062
cmpwi(CCR0, Rinterp_only, 0);
1063
beq(CCR0, done);
1064
ld(Rtarget_addr, in_bytes(Method::interpreter_entry_offset()), Rtarget_method);
1065
align(32, 12);
1066
bind(done);
1067
}
1068
1069
#ifdef ASSERT
1070
{
1071
Label Lok;
1072
cmpdi(CCR0, Rtarget_addr, 0);
1073
bne(CCR0, Lok);
1074
stop("null entry point");
1075
bind(Lok);
1076
}
1077
#endif // ASSERT
1078
1079
mr(R21_sender_SP, R1_SP);
1080
1081
// Calc a precise SP for the call. The SP value we calculated in
1082
// generate_fixed_frame() is based on the max_stack() value, so we would waste stack space
1083
// if esp is not max. Also, the i2c adapter extends the stack space without restoring
1084
// our pre-calced value, so repeating calls via i2c would result in stack overflow.
1085
// Since esp already points to an empty slot, we just have to sub 1 additional slot
1086
// to meet the abi scratch requirements.
1087
// The max_stack pointer will get restored by means of the GR_Lmax_stack local in
1088
// the return entry of the interpreter.
1089
addi(Rscratch2, R15_esp, Interpreter::stackElementSize - frame::abi_reg_args_size);
1090
clrrdi(Rscratch2, Rscratch2, exact_log2(frame::alignment_in_bytes)); // round towards smaller address
1091
resize_frame_absolute(Rscratch2, Rscratch2, R0);
1092
1093
mr_if_needed(R19_method, Rtarget_method);
1094
mtctr(Rtarget_addr);
1095
mtlr(Rret_addr);
1096
1097
save_interpreter_state(Rscratch2);
1098
#ifdef ASSERT
1099
ld(Rscratch1, _ijava_state_neg(top_frame_sp), Rscratch2); // Rscratch2 contains fp
1100
cmpd(CCR0, R21_sender_SP, Rscratch1);
1101
asm_assert_eq("top_frame_sp incorrect", 0x951);
1102
#endif
1103
1104
bctr();
1105
}
1106
1107
// Set the method data pointer for the current bcp.
1108
void InterpreterMacroAssembler::set_method_data_pointer_for_bcp() {
1109
assert(ProfileInterpreter, "must be profiling interpreter");
1110
Label get_continue;
1111
ld(R28_mdx, in_bytes(Method::method_data_offset()), R19_method);
1112
test_method_data_pointer(get_continue);
1113
call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::bcp_to_di), R19_method, R14_bcp);
1114
1115
addi(R28_mdx, R28_mdx, in_bytes(MethodData::data_offset()));
1116
add(R28_mdx, R28_mdx, R3_RET);
1117
bind(get_continue);
1118
}
1119
1120
// Test ImethodDataPtr. If it is null, continue at the specified label.
1121
void InterpreterMacroAssembler::test_method_data_pointer(Label& zero_continue) {
1122
assert(ProfileInterpreter, "must be profiling interpreter");
1123
cmpdi(CCR0, R28_mdx, 0);
1124
beq(CCR0, zero_continue);
1125
}
1126
1127
void InterpreterMacroAssembler::verify_method_data_pointer() {
1128
assert(ProfileInterpreter, "must be profiling interpreter");
1129
#ifdef ASSERT
1130
Label verify_continue;
1131
test_method_data_pointer(verify_continue);
1132
1133
// If the mdp is valid, it will point to a DataLayout header which is
1134
// consistent with the bcp. The converse is highly probable also.
1135
lhz(R11_scratch1, in_bytes(DataLayout::bci_offset()), R28_mdx);
1136
ld(R12_scratch2, in_bytes(Method::const_offset()), R19_method);
1137
addi(R11_scratch1, R11_scratch1, in_bytes(ConstMethod::codes_offset()));
1138
add(R11_scratch1, R12_scratch2, R12_scratch2);
1139
cmpd(CCR0, R11_scratch1, R14_bcp);
1140
beq(CCR0, verify_continue);
1141
1142
call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::verify_mdp ), R19_method, R14_bcp, R28_mdx);
1143
1144
bind(verify_continue);
1145
#endif
1146
}
1147
1148
void InterpreterMacroAssembler::test_invocation_counter_for_mdp(Register invocation_count,
1149
Register Rscratch,
1150
Label &profile_continue) {
1151
assert(ProfileInterpreter, "must be profiling interpreter");
1152
// Control will flow to "profile_continue" if the counter is less than the
1153
// limit or if we call profile_method().
1154
Label done;
1155
1156
// If no method data exists, and the counter is high enough, make one.
1157
int ipl_offs = load_const_optimized(Rscratch, &InvocationCounter::InterpreterProfileLimit, R0, true);
1158
lwz(Rscratch, ipl_offs, Rscratch);
1159
1160
cmpdi(CCR0, R28_mdx, 0);
1161
// Test to see if we should create a method data oop.
1162
cmpd(CCR1, Rscratch /* InterpreterProfileLimit */, invocation_count);
1163
bne(CCR0, done);
1164
bge(CCR1, profile_continue);
1165
1166
// Build it now.
1167
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method));
1168
set_method_data_pointer_for_bcp();
1169
b(profile_continue);
1170
1171
align(32, 12);
1172
bind(done);
1173
}
1174
1175
void InterpreterMacroAssembler::test_backedge_count_for_osr(Register backedge_count, Register branch_bcp, Register Rtmp) {
1176
assert_different_registers(backedge_count, Rtmp, branch_bcp);
1177
assert(UseOnStackReplacement,"Must UseOnStackReplacement to test_backedge_count_for_osr");
1178
1179
Label did_not_overflow;
1180
Label overflow_with_error;
1181
1182
int ibbl_offs = load_const_optimized(Rtmp, &InvocationCounter::InterpreterBackwardBranchLimit, R0, true);
1183
lwz(Rtmp, ibbl_offs, Rtmp);
1184
cmpw(CCR0, backedge_count, Rtmp);
1185
1186
blt(CCR0, did_not_overflow);
1187
1188
// When ProfileInterpreter is on, the backedge_count comes from the
1189
// methodDataOop, which value does not get reset on the call to
1190
// frequency_counter_overflow(). To avoid excessive calls to the overflow
1191
// routine while the method is being compiled, add a second test to make sure
1192
// the overflow function is called only once every overflow_frequency.
1193
if (ProfileInterpreter) {
1194
const int overflow_frequency = 1024;
1195
li(Rtmp, overflow_frequency-1);
1196
andr(Rtmp, Rtmp, backedge_count);
1197
cmpwi(CCR0, Rtmp, 0);
1198
bne(CCR0, did_not_overflow);
1199
}
1200
1201
// Overflow in loop, pass branch bytecode.
1202
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), branch_bcp, true);
1203
1204
// Was an OSR adapter generated?
1205
// O0 = osr nmethod
1206
cmpdi(CCR0, R3_RET, 0);
1207
beq(CCR0, overflow_with_error);
1208
1209
// Has the nmethod been invalidated already?
1210
lwz(Rtmp, nmethod::entry_bci_offset(), R3_RET);
1211
cmpwi(CCR0, Rtmp, InvalidOSREntryBci);
1212
beq(CCR0, overflow_with_error);
1213
1214
// Migrate the interpreter frame off of the stack.
1215
// We can use all registers because we will not return to interpreter from this point.
1216
1217
// Save nmethod.
1218
const Register osr_nmethod = R31;
1219
mr(osr_nmethod, R3_RET);
1220
set_top_ijava_frame_at_SP_as_last_Java_frame(R1_SP, R11_scratch1);
1221
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin), R16_thread);
1222
reset_last_Java_frame();
1223
// OSR buffer is in ARG1
1224
1225
// Remove the interpreter frame.
1226
merge_frames(/*top_frame_sp*/ R21_sender_SP, /*return_pc*/ R0, R11_scratch1, R12_scratch2);
1227
1228
// Jump to the osr code.
1229
ld(R11_scratch1, nmethod::osr_entry_point_offset(), osr_nmethod);
1230
mtlr(R0);
1231
mtctr(R11_scratch1);
1232
bctr();
1233
1234
align(32, 12);
1235
bind(overflow_with_error);
1236
bind(did_not_overflow);
1237
}
1238
1239
// Store a value at some constant offset from the method data pointer.
1240
void InterpreterMacroAssembler::set_mdp_data_at(int constant, Register value) {
1241
assert(ProfileInterpreter, "must be profiling interpreter");
1242
1243
std(value, constant, R28_mdx);
1244
}
1245
1246
// Increment the value at some constant offset from the method data pointer.
1247
void InterpreterMacroAssembler::increment_mdp_data_at(int constant,
1248
Register counter_addr,
1249
Register Rbumped_count,
1250
bool decrement) {
1251
// Locate the counter at a fixed offset from the mdp:
1252
addi(counter_addr, R28_mdx, constant);
1253
increment_mdp_data_at(counter_addr, Rbumped_count, decrement);
1254
}
1255
1256
// Increment the value at some non-fixed (reg + constant) offset from
1257
// the method data pointer.
1258
void InterpreterMacroAssembler::increment_mdp_data_at(Register reg,
1259
int constant,
1260
Register scratch,
1261
Register Rbumped_count,
1262
bool decrement) {
1263
// Add the constant to reg to get the offset.
1264
add(scratch, R28_mdx, reg);
1265
// Then calculate the counter address.
1266
addi(scratch, scratch, constant);
1267
increment_mdp_data_at(scratch, Rbumped_count, decrement);
1268
}
1269
1270
void InterpreterMacroAssembler::increment_mdp_data_at(Register counter_addr,
1271
Register Rbumped_count,
1272
bool decrement) {
1273
assert(ProfileInterpreter, "must be profiling interpreter");
1274
1275
// Load the counter.
1276
ld(Rbumped_count, 0, counter_addr);
1277
1278
if (decrement) {
1279
// Decrement the register. Set condition codes.
1280
addi(Rbumped_count, Rbumped_count, - DataLayout::counter_increment);
1281
// Store the decremented counter, if it is still negative.
1282
std(Rbumped_count, 0, counter_addr);
1283
// Note: add/sub overflow check are not ported, since 64 bit
1284
// calculation should never overflow.
1285
} else {
1286
// Increment the register. Set carry flag.
1287
addi(Rbumped_count, Rbumped_count, DataLayout::counter_increment);
1288
// Store the incremented counter.
1289
std(Rbumped_count, 0, counter_addr);
1290
}
1291
}
1292
1293
// Set a flag value at the current method data pointer position.
1294
void InterpreterMacroAssembler::set_mdp_flag_at(int flag_constant,
1295
Register scratch) {
1296
assert(ProfileInterpreter, "must be profiling interpreter");
1297
// Load the data header.
1298
lbz(scratch, in_bytes(DataLayout::flags_offset()), R28_mdx);
1299
// Set the flag.
1300
ori(scratch, scratch, flag_constant);
1301
// Store the modified header.
1302
stb(scratch, in_bytes(DataLayout::flags_offset()), R28_mdx);
1303
}
1304
1305
// Test the location at some offset from the method data pointer.
1306
// If it is not equal to value, branch to the not_equal_continue Label.
1307
void InterpreterMacroAssembler::test_mdp_data_at(int offset,
1308
Register value,
1309
Label& not_equal_continue,
1310
Register test_out) {
1311
assert(ProfileInterpreter, "must be profiling interpreter");
1312
1313
ld(test_out, offset, R28_mdx);
1314
cmpd(CCR0, value, test_out);
1315
bne(CCR0, not_equal_continue);
1316
}
1317
1318
// Update the method data pointer by the displacement located at some fixed
1319
// offset from the method data pointer.
1320
void InterpreterMacroAssembler::update_mdp_by_offset(int offset_of_disp,
1321
Register scratch) {
1322
assert(ProfileInterpreter, "must be profiling interpreter");
1323
1324
ld(scratch, offset_of_disp, R28_mdx);
1325
add(R28_mdx, scratch, R28_mdx);
1326
}
1327
1328
// Update the method data pointer by the displacement located at the
1329
// offset (reg + offset_of_disp).
1330
void InterpreterMacroAssembler::update_mdp_by_offset(Register reg,
1331
int offset_of_disp,
1332
Register scratch) {
1333
assert(ProfileInterpreter, "must be profiling interpreter");
1334
1335
add(scratch, reg, R28_mdx);
1336
ld(scratch, offset_of_disp, scratch);
1337
add(R28_mdx, scratch, R28_mdx);
1338
}
1339
1340
// Update the method data pointer by a simple constant displacement.
1341
void InterpreterMacroAssembler::update_mdp_by_constant(int constant) {
1342
assert(ProfileInterpreter, "must be profiling interpreter");
1343
addi(R28_mdx, R28_mdx, constant);
1344
}
1345
1346
// Update the method data pointer for a _ret bytecode whose target
1347
// was not among our cached targets.
1348
void InterpreterMacroAssembler::update_mdp_for_ret(TosState state,
1349
Register return_bci) {
1350
assert(ProfileInterpreter, "must be profiling interpreter");
1351
1352
push(state);
1353
assert(return_bci->is_nonvolatile(), "need to protect return_bci");
1354
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::update_mdp_for_ret), return_bci);
1355
pop(state);
1356
}
1357
1358
// Increments the backedge counter.
1359
// Returns backedge counter + invocation counter in Rdst.
1360
void InterpreterMacroAssembler::increment_backedge_counter(const Register Rcounters, const Register Rdst,
1361
const Register Rtmp1, Register Rscratch) {
1362
assert(UseCompiler, "incrementing must be useful");
1363
assert_different_registers(Rdst, Rtmp1);
1364
const Register invocation_counter = Rtmp1;
1365
const Register counter = Rdst;
1366
// TODO ppc port assert(4 == InvocationCounter::sz_counter(), "unexpected field size.");
1367
1368
// Load backedge counter.
1369
lwz(counter, in_bytes(MethodCounters::backedge_counter_offset()) +
1370
in_bytes(InvocationCounter::counter_offset()), Rcounters);
1371
// Load invocation counter.
1372
lwz(invocation_counter, in_bytes(MethodCounters::invocation_counter_offset()) +
1373
in_bytes(InvocationCounter::counter_offset()), Rcounters);
1374
1375
// Add the delta to the backedge counter.
1376
addi(counter, counter, InvocationCounter::count_increment);
1377
1378
// Mask the invocation counter.
1379
li(Rscratch, InvocationCounter::count_mask_value);
1380
andr(invocation_counter, invocation_counter, Rscratch);
1381
1382
// Store new counter value.
1383
stw(counter, in_bytes(MethodCounters::backedge_counter_offset()) +
1384
in_bytes(InvocationCounter::counter_offset()), Rcounters);
1385
// Return invocation counter + backedge counter.
1386
add(counter, counter, invocation_counter);
1387
}
1388
1389
// Count a taken branch in the bytecodes.
1390
void InterpreterMacroAssembler::profile_taken_branch(Register scratch, Register bumped_count) {
1391
if (ProfileInterpreter) {
1392
Label profile_continue;
1393
1394
// If no method data exists, go to profile_continue.
1395
test_method_data_pointer(profile_continue);
1396
1397
// We are taking a branch. Increment the taken count.
1398
increment_mdp_data_at(in_bytes(JumpData::taken_offset()), scratch, bumped_count);
1399
1400
// The method data pointer needs to be updated to reflect the new target.
1401
update_mdp_by_offset(in_bytes(JumpData::displacement_offset()), scratch);
1402
bind (profile_continue);
1403
}
1404
}
1405
1406
// Count a not-taken branch in the bytecodes.
1407
void InterpreterMacroAssembler::profile_not_taken_branch(Register scratch1, Register scratch2) {
1408
if (ProfileInterpreter) {
1409
Label profile_continue;
1410
1411
// If no method data exists, go to profile_continue.
1412
test_method_data_pointer(profile_continue);
1413
1414
// We are taking a branch. Increment the not taken count.
1415
increment_mdp_data_at(in_bytes(BranchData::not_taken_offset()), scratch1, scratch2);
1416
1417
// The method data pointer needs to be updated to correspond to the
1418
// next bytecode.
1419
update_mdp_by_constant(in_bytes(BranchData::branch_data_size()));
1420
bind (profile_continue);
1421
}
1422
}
1423
1424
// Count a non-virtual call in the bytecodes.
1425
void InterpreterMacroAssembler::profile_call(Register scratch1, Register scratch2) {
1426
if (ProfileInterpreter) {
1427
Label profile_continue;
1428
1429
// If no method data exists, go to profile_continue.
1430
test_method_data_pointer(profile_continue);
1431
1432
// We are making a call. Increment the count.
1433
increment_mdp_data_at(in_bytes(CounterData::count_offset()), scratch1, scratch2);
1434
1435
// The method data pointer needs to be updated to reflect the new target.
1436
update_mdp_by_constant(in_bytes(CounterData::counter_data_size()));
1437
bind (profile_continue);
1438
}
1439
}
1440
1441
// Count a final call in the bytecodes.
1442
void InterpreterMacroAssembler::profile_final_call(Register scratch1, Register scratch2) {
1443
if (ProfileInterpreter) {
1444
Label profile_continue;
1445
1446
// If no method data exists, go to profile_continue.
1447
test_method_data_pointer(profile_continue);
1448
1449
// We are making a call. Increment the count.
1450
increment_mdp_data_at(in_bytes(CounterData::count_offset()), scratch1, scratch2);
1451
1452
// The method data pointer needs to be updated to reflect the new target.
1453
update_mdp_by_constant(in_bytes(VirtualCallData::virtual_call_data_size()));
1454
bind (profile_continue);
1455
}
1456
}
1457
1458
// Count a virtual call in the bytecodes.
1459
void InterpreterMacroAssembler::profile_virtual_call(Register Rreceiver,
1460
Register Rscratch1,
1461
Register Rscratch2,
1462
bool receiver_can_be_null) {
1463
if (!ProfileInterpreter) { return; }
1464
Label profile_continue;
1465
1466
// If no method data exists, go to profile_continue.
1467
test_method_data_pointer(profile_continue);
1468
1469
Label skip_receiver_profile;
1470
if (receiver_can_be_null) {
1471
Label not_null;
1472
cmpdi(CCR0, Rreceiver, 0);
1473
bne(CCR0, not_null);
1474
// We are making a call. Increment the count for null receiver.
1475
increment_mdp_data_at(in_bytes(CounterData::count_offset()), Rscratch1, Rscratch2);
1476
b(skip_receiver_profile);
1477
bind(not_null);
1478
}
1479
1480
// Record the receiver type.
1481
record_klass_in_profile(Rreceiver, Rscratch1, Rscratch2, true);
1482
bind(skip_receiver_profile);
1483
1484
// The method data pointer needs to be updated to reflect the new target.
1485
update_mdp_by_constant(in_bytes(VirtualCallData::virtual_call_data_size()));
1486
bind (profile_continue);
1487
}
1488
1489
void InterpreterMacroAssembler::profile_typecheck(Register Rklass, Register Rscratch1, Register Rscratch2) {
1490
if (ProfileInterpreter) {
1491
Label profile_continue;
1492
1493
// If no method data exists, go to profile_continue.
1494
test_method_data_pointer(profile_continue);
1495
1496
int mdp_delta = in_bytes(BitData::bit_data_size());
1497
if (TypeProfileCasts) {
1498
mdp_delta = in_bytes(VirtualCallData::virtual_call_data_size());
1499
1500
// Record the object type.
1501
record_klass_in_profile(Rklass, Rscratch1, Rscratch2, false);
1502
}
1503
1504
// The method data pointer needs to be updated.
1505
update_mdp_by_constant(mdp_delta);
1506
1507
bind (profile_continue);
1508
}
1509
}
1510
1511
void InterpreterMacroAssembler::profile_typecheck_failed(Register Rscratch1, Register Rscratch2) {
1512
if (ProfileInterpreter && TypeProfileCasts) {
1513
Label profile_continue;
1514
1515
// If no method data exists, go to profile_continue.
1516
test_method_data_pointer(profile_continue);
1517
1518
int count_offset = in_bytes(CounterData::count_offset());
1519
// Back up the address, since we have already bumped the mdp.
1520
count_offset -= in_bytes(VirtualCallData::virtual_call_data_size());
1521
1522
// *Decrement* the counter. We expect to see zero or small negatives.
1523
increment_mdp_data_at(count_offset, Rscratch1, Rscratch2, true);
1524
1525
bind (profile_continue);
1526
}
1527
}
1528
1529
// Count a ret in the bytecodes.
1530
void InterpreterMacroAssembler::profile_ret(TosState state, Register return_bci, Register scratch1, Register scratch2) {
1531
if (ProfileInterpreter) {
1532
Label profile_continue;
1533
uint row;
1534
1535
// If no method data exists, go to profile_continue.
1536
test_method_data_pointer(profile_continue);
1537
1538
// Update the total ret count.
1539
increment_mdp_data_at(in_bytes(CounterData::count_offset()), scratch1, scratch2 );
1540
1541
for (row = 0; row < RetData::row_limit(); row++) {
1542
Label next_test;
1543
1544
// See if return_bci is equal to bci[n]:
1545
test_mdp_data_at(in_bytes(RetData::bci_offset(row)), return_bci, next_test, scratch1);
1546
1547
// return_bci is equal to bci[n]. Increment the count.
1548
increment_mdp_data_at(in_bytes(RetData::bci_count_offset(row)), scratch1, scratch2);
1549
1550
// The method data pointer needs to be updated to reflect the new target.
1551
update_mdp_by_offset(in_bytes(RetData::bci_displacement_offset(row)), scratch1);
1552
b(profile_continue);
1553
bind(next_test);
1554
}
1555
1556
update_mdp_for_ret(state, return_bci);
1557
1558
bind (profile_continue);
1559
}
1560
}
1561
1562
// Count the default case of a switch construct.
1563
void InterpreterMacroAssembler::profile_switch_default(Register scratch1, Register scratch2) {
1564
if (ProfileInterpreter) {
1565
Label profile_continue;
1566
1567
// If no method data exists, go to profile_continue.
1568
test_method_data_pointer(profile_continue);
1569
1570
// Update the default case count
1571
increment_mdp_data_at(in_bytes(MultiBranchData::default_count_offset()),
1572
scratch1, scratch2);
1573
1574
// The method data pointer needs to be updated.
1575
update_mdp_by_offset(in_bytes(MultiBranchData::default_displacement_offset()),
1576
scratch1);
1577
1578
bind (profile_continue);
1579
}
1580
}
1581
1582
// Count the index'th case of a switch construct.
1583
void InterpreterMacroAssembler::profile_switch_case(Register index,
1584
Register scratch1,
1585
Register scratch2,
1586
Register scratch3) {
1587
if (ProfileInterpreter) {
1588
assert_different_registers(index, scratch1, scratch2, scratch3);
1589
Label profile_continue;
1590
1591
// If no method data exists, go to profile_continue.
1592
test_method_data_pointer(profile_continue);
1593
1594
// Build the base (index * per_case_size_in_bytes()) + case_array_offset_in_bytes().
1595
li(scratch3, in_bytes(MultiBranchData::case_array_offset()));
1596
1597
assert (in_bytes(MultiBranchData::per_case_size()) == 16, "so that shladd works");
1598
sldi(scratch1, index, exact_log2(in_bytes(MultiBranchData::per_case_size())));
1599
add(scratch1, scratch1, scratch3);
1600
1601
// Update the case count.
1602
increment_mdp_data_at(scratch1, in_bytes(MultiBranchData::relative_count_offset()), scratch2, scratch3);
1603
1604
// The method data pointer needs to be updated.
1605
update_mdp_by_offset(scratch1, in_bytes(MultiBranchData::relative_displacement_offset()), scratch2);
1606
1607
bind (profile_continue);
1608
}
1609
}
1610
1611
void InterpreterMacroAssembler::profile_null_seen(Register Rscratch1, Register Rscratch2) {
1612
if (ProfileInterpreter) {
1613
assert_different_registers(Rscratch1, Rscratch2);
1614
Label profile_continue;
1615
1616
// If no method data exists, go to profile_continue.
1617
test_method_data_pointer(profile_continue);
1618
1619
set_mdp_flag_at(BitData::null_seen_byte_constant(), Rscratch1);
1620
1621
// The method data pointer needs to be updated.
1622
int mdp_delta = in_bytes(BitData::bit_data_size());
1623
if (TypeProfileCasts) {
1624
mdp_delta = in_bytes(VirtualCallData::virtual_call_data_size());
1625
}
1626
update_mdp_by_constant(mdp_delta);
1627
1628
bind (profile_continue);
1629
}
1630
}
1631
1632
void InterpreterMacroAssembler::record_klass_in_profile(Register Rreceiver,
1633
Register Rscratch1, Register Rscratch2,
1634
bool is_virtual_call) {
1635
assert(ProfileInterpreter, "must be profiling");
1636
assert_different_registers(Rreceiver, Rscratch1, Rscratch2);
1637
1638
Label done;
1639
record_klass_in_profile_helper(Rreceiver, Rscratch1, Rscratch2, 0, done, is_virtual_call);
1640
bind (done);
1641
}
1642
1643
void InterpreterMacroAssembler::record_klass_in_profile_helper(
1644
Register receiver, Register scratch1, Register scratch2,
1645
int start_row, Label& done, bool is_virtual_call) {
1646
if (TypeProfileWidth == 0) {
1647
if (is_virtual_call) {
1648
increment_mdp_data_at(in_bytes(CounterData::count_offset()), scratch1, scratch2);
1649
}
1650
return;
1651
}
1652
1653
int last_row = VirtualCallData::row_limit() - 1;
1654
assert(start_row <= last_row, "must be work left to do");
1655
// Test this row for both the receiver and for null.
1656
// Take any of three different outcomes:
1657
// 1. found receiver => increment count and goto done
1658
// 2. found null => keep looking for case 1, maybe allocate this cell
1659
// 3. found something else => keep looking for cases 1 and 2
1660
// Case 3 is handled by a recursive call.
1661
for (int row = start_row; row <= last_row; row++) {
1662
Label next_test;
1663
bool test_for_null_also = (row == start_row);
1664
1665
// See if the receiver is receiver[n].
1666
int recvr_offset = in_bytes(VirtualCallData::receiver_offset(row));
1667
test_mdp_data_at(recvr_offset, receiver, next_test, scratch1);
1668
// delayed()->tst(scratch);
1669
1670
// The receiver is receiver[n]. Increment count[n].
1671
int count_offset = in_bytes(VirtualCallData::receiver_count_offset(row));
1672
increment_mdp_data_at(count_offset, scratch1, scratch2);
1673
b(done);
1674
bind(next_test);
1675
1676
if (test_for_null_also) {
1677
Label found_null;
1678
// Failed the equality check on receiver[n]... Test for null.
1679
if (start_row == last_row) {
1680
// The only thing left to do is handle the null case.
1681
if (is_virtual_call) {
1682
// Scratch1 contains test_out from test_mdp_data_at.
1683
cmpdi(CCR0, scratch1, 0);
1684
beq(CCR0, found_null);
1685
// Receiver did not match any saved receiver and there is no empty row for it.
1686
// Increment total counter to indicate polymorphic case.
1687
increment_mdp_data_at(in_bytes(CounterData::count_offset()), scratch1, scratch2);
1688
b(done);
1689
bind(found_null);
1690
} else {
1691
cmpdi(CCR0, scratch1, 0);
1692
bne(CCR0, done);
1693
}
1694
break;
1695
}
1696
// Since null is rare, make it be the branch-taken case.
1697
cmpdi(CCR0, scratch1, 0);
1698
beq(CCR0, found_null);
1699
1700
// Put all the "Case 3" tests here.
1701
record_klass_in_profile_helper(receiver, scratch1, scratch2, start_row + 1, done, is_virtual_call);
1702
1703
// Found a null. Keep searching for a matching receiver,
1704
// but remember that this is an empty (unused) slot.
1705
bind(found_null);
1706
}
1707
}
1708
1709
// In the fall-through case, we found no matching receiver, but we
1710
// observed the receiver[start_row] is NULL.
1711
1712
// Fill in the receiver field and increment the count.
1713
int recvr_offset = in_bytes(VirtualCallData::receiver_offset(start_row));
1714
set_mdp_data_at(recvr_offset, receiver);
1715
int count_offset = in_bytes(VirtualCallData::receiver_count_offset(start_row));
1716
li(scratch1, DataLayout::counter_increment);
1717
set_mdp_data_at(count_offset, scratch1);
1718
if (start_row > 0) {
1719
b(done);
1720
}
1721
}
1722
1723
// Argument and return type profilig.
1724
// kills: tmp, tmp2, R0, CR0, CR1
1725
void InterpreterMacroAssembler::profile_obj_type(Register obj, Register mdo_addr_base,
1726
RegisterOrConstant mdo_addr_offs, Register tmp, Register tmp2) {
1727
Label do_nothing, do_update;
1728
1729
// tmp2 = obj is allowed
1730
assert_different_registers(obj, mdo_addr_base, tmp, R0);
1731
assert_different_registers(tmp2, mdo_addr_base, tmp, R0);
1732
const Register klass = tmp2;
1733
1734
verify_oop(obj);
1735
1736
ld(tmp, mdo_addr_offs, mdo_addr_base);
1737
1738
// Set null_seen if obj is 0.
1739
cmpdi(CCR0, obj, 0);
1740
ori(R0, tmp, TypeEntries::null_seen);
1741
beq(CCR0, do_update);
1742
1743
load_klass(klass, obj);
1744
1745
clrrdi(R0, tmp, exact_log2(-TypeEntries::type_klass_mask));
1746
// Basically same as andi(R0, tmp, TypeEntries::type_klass_mask);
1747
cmpd(CCR1, R0, klass);
1748
// Klass seen before, nothing to do (regardless of unknown bit).
1749
//beq(CCR1, do_nothing);
1750
1751
andi_(R0, klass, TypeEntries::type_unknown);
1752
// Already unknown. Nothing to do anymore.
1753
//bne(CCR0, do_nothing);
1754
crorc(/*CCR0 eq*/2, /*CCR1 eq*/4+2, /*CCR0 eq*/2); // cr0 eq = cr1 eq or cr0 ne
1755
beq(CCR0, do_nothing);
1756
1757
clrrdi_(R0, tmp, exact_log2(-TypeEntries::type_mask));
1758
orr(R0, klass, tmp); // Combine klass and null_seen bit (only used if (tmp & type_mask)==0).
1759
beq(CCR0, do_update); // First time here. Set profile type.
1760
1761
// Different than before. Cannot keep accurate profile.
1762
ori(R0, tmp, TypeEntries::type_unknown);
1763
1764
bind(do_update);
1765
// update profile
1766
std(R0, mdo_addr_offs, mdo_addr_base);
1767
1768
align(32, 12);
1769
bind(do_nothing);
1770
}
1771
1772
void InterpreterMacroAssembler::profile_arguments_type(Register callee, Register tmp1, Register tmp2, bool is_virtual) {
1773
if (!ProfileInterpreter) {
1774
return;
1775
}
1776
1777
assert_different_registers(callee, tmp1, tmp2, R28_mdx);
1778
1779
if (MethodData::profile_arguments() || MethodData::profile_return()) {
1780
Label profile_continue;
1781
1782
test_method_data_pointer(profile_continue);
1783
1784
int off_to_start = is_virtual ? in_bytes(VirtualCallData::virtual_call_data_size()) : in_bytes(CounterData::counter_data_size());
1785
1786
lbz(tmp1, in_bytes(DataLayout::tag_offset()) - off_to_start, R28_mdx);
1787
cmpwi(CCR0, tmp1, is_virtual ? DataLayout::virtual_call_type_data_tag : DataLayout::call_type_data_tag);
1788
bne(CCR0, profile_continue);
1789
1790
if (MethodData::profile_arguments()) {
1791
Label done;
1792
int off_to_args = in_bytes(TypeEntriesAtCall::args_data_offset());
1793
add(R28_mdx, off_to_args, R28_mdx);
1794
1795
for (int i = 0; i < TypeProfileArgsLimit; i++) {
1796
if (i > 0 || MethodData::profile_return()) {
1797
// If return value type is profiled we may have no argument to profile.
1798
ld(tmp1, in_bytes(TypeEntriesAtCall::cell_count_offset())-off_to_args, R28_mdx);
1799
cmpdi(CCR0, tmp1, (i+1)*TypeStackSlotEntries::per_arg_count());
1800
addi(tmp1, tmp1, -i*TypeStackSlotEntries::per_arg_count());
1801
blt(CCR0, done);
1802
}
1803
ld(tmp1, in_bytes(Method::const_offset()), callee);
1804
lhz(tmp1, in_bytes(ConstMethod::size_of_parameters_offset()), tmp1);
1805
// Stack offset o (zero based) from the start of the argument
1806
// list, for n arguments translates into offset n - o - 1 from
1807
// the end of the argument list. But there's an extra slot at
1808
// the top of the stack. So the offset is n - o from Lesp.
1809
ld(tmp2, in_bytes(TypeEntriesAtCall::stack_slot_offset(i))-off_to_args, R28_mdx);
1810
subf(tmp1, tmp2, tmp1);
1811
1812
sldi(tmp1, tmp1, Interpreter::logStackElementSize);
1813
ldx(tmp1, tmp1, R15_esp);
1814
1815
profile_obj_type(tmp1, R28_mdx, in_bytes(TypeEntriesAtCall::argument_type_offset(i))-off_to_args, tmp2, tmp1);
1816
1817
int to_add = in_bytes(TypeStackSlotEntries::per_arg_size());
1818
addi(R28_mdx, R28_mdx, to_add);
1819
off_to_args += to_add;
1820
}
1821
1822
if (MethodData::profile_return()) {
1823
ld(tmp1, in_bytes(TypeEntriesAtCall::cell_count_offset())-off_to_args, R28_mdx);
1824
addi(tmp1, tmp1, -TypeProfileArgsLimit*TypeStackSlotEntries::per_arg_count());
1825
}
1826
1827
bind(done);
1828
1829
if (MethodData::profile_return()) {
1830
// We're right after the type profile for the last
1831
// argument. tmp1 is the number of cells left in the
1832
// CallTypeData/VirtualCallTypeData to reach its end. Non null
1833
// if there's a return to profile.
1834
assert(ReturnTypeEntry::static_cell_count() < TypeStackSlotEntries::per_arg_count(), "can't move past ret type");
1835
sldi(tmp1, tmp1, exact_log2(DataLayout::cell_size));
1836
add(R28_mdx, tmp1, R28_mdx);
1837
}
1838
} else {
1839
assert(MethodData::profile_return(), "either profile call args or call ret");
1840
update_mdp_by_constant(in_bytes(TypeEntriesAtCall::return_only_size()));
1841
}
1842
1843
// Mdp points right after the end of the
1844
// CallTypeData/VirtualCallTypeData, right after the cells for the
1845
// return value type if there's one.
1846
align(32, 12);
1847
bind(profile_continue);
1848
}
1849
}
1850
1851
void InterpreterMacroAssembler::profile_return_type(Register ret, Register tmp1, Register tmp2) {
1852
assert_different_registers(ret, tmp1, tmp2);
1853
if (ProfileInterpreter && MethodData::profile_return()) {
1854
Label profile_continue;
1855
1856
test_method_data_pointer(profile_continue);
1857
1858
if (MethodData::profile_return_jsr292_only()) {
1859
// If we don't profile all invoke bytecodes we must make sure
1860
// it's a bytecode we indeed profile. We can't go back to the
1861
// begining of the ProfileData we intend to update to check its
1862
// type because we're right after it and we don't known its
1863
// length.
1864
lbz(tmp1, 0, R14_bcp);
1865
lbz(tmp2, Method::intrinsic_id_offset_in_bytes(), R19_method);
1866
cmpwi(CCR0, tmp1, Bytecodes::_invokedynamic);
1867
cmpwi(CCR1, tmp1, Bytecodes::_invokehandle);
1868
cror(/*CR0 eq*/2, /*CR1 eq*/4+2, /*CR0 eq*/2);
1869
cmpwi(CCR1, tmp2, vmIntrinsics::_compiledLambdaForm);
1870
cror(/*CR0 eq*/2, /*CR1 eq*/4+2, /*CR0 eq*/2);
1871
bne(CCR0, profile_continue);
1872
}
1873
1874
profile_obj_type(ret, R28_mdx, -in_bytes(ReturnTypeEntry::size()), tmp1, tmp2);
1875
1876
align(32, 12);
1877
bind(profile_continue);
1878
}
1879
}
1880
1881
void InterpreterMacroAssembler::profile_parameters_type(Register tmp1, Register tmp2, Register tmp3, Register tmp4) {
1882
if (ProfileInterpreter && MethodData::profile_parameters()) {
1883
Label profile_continue, done;
1884
1885
test_method_data_pointer(profile_continue);
1886
1887
// Load the offset of the area within the MDO used for
1888
// parameters. If it's negative we're not profiling any parameters.
1889
lwz(tmp1, in_bytes(MethodData::parameters_type_data_di_offset()) - in_bytes(MethodData::data_offset()), R28_mdx);
1890
cmpwi(CCR0, tmp1, 0);
1891
blt(CCR0, profile_continue);
1892
1893
// Compute a pointer to the area for parameters from the offset
1894
// and move the pointer to the slot for the last
1895
// parameters. Collect profiling from last parameter down.
1896
// mdo start + parameters offset + array length - 1
1897
1898
// Pointer to the parameter area in the MDO.
1899
const Register mdp = tmp1;
1900
add(mdp, tmp1, R28_mdx);
1901
1902
// Pffset of the current profile entry to update.
1903
const Register entry_offset = tmp2;
1904
// entry_offset = array len in number of cells
1905
ld(entry_offset, in_bytes(ArrayData::array_len_offset()), mdp);
1906
1907
int off_base = in_bytes(ParametersTypeData::stack_slot_offset(0));
1908
assert(off_base % DataLayout::cell_size == 0, "should be a number of cells");
1909
1910
// entry_offset (number of cells) = array len - size of 1 entry + offset of the stack slot field
1911
addi(entry_offset, entry_offset, -TypeStackSlotEntries::per_arg_count() + (off_base / DataLayout::cell_size));
1912
// entry_offset in bytes
1913
sldi(entry_offset, entry_offset, exact_log2(DataLayout::cell_size));
1914
1915
Label loop;
1916
align(32, 12);
1917
bind(loop);
1918
1919
// Load offset on the stack from the slot for this parameter.
1920
ld(tmp3, entry_offset, mdp);
1921
sldi(tmp3, tmp3, Interpreter::logStackElementSize);
1922
neg(tmp3, tmp3);
1923
// Read the parameter from the local area.
1924
ldx(tmp3, tmp3, R18_locals);
1925
1926
// Make entry_offset now point to the type field for this parameter.
1927
int type_base = in_bytes(ParametersTypeData::type_offset(0));
1928
assert(type_base > off_base, "unexpected");
1929
addi(entry_offset, entry_offset, type_base - off_base);
1930
1931
// Profile the parameter.
1932
profile_obj_type(tmp3, mdp, entry_offset, tmp4, tmp3);
1933
1934
// Go to next parameter.
1935
int delta = TypeStackSlotEntries::per_arg_count() * DataLayout::cell_size + (type_base - off_base);
1936
cmpdi(CCR0, entry_offset, off_base + delta);
1937
addi(entry_offset, entry_offset, -delta);
1938
bge(CCR0, loop);
1939
1940
align(32, 12);
1941
bind(profile_continue);
1942
}
1943
}
1944
1945
// Add a InterpMonitorElem to stack (see frame_sparc.hpp).
1946
void InterpreterMacroAssembler::add_monitor_to_stack(bool stack_is_empty, Register Rtemp1, Register Rtemp2) {
1947
1948
// Very-local scratch registers.
1949
const Register esp = Rtemp1;
1950
const Register slot = Rtemp2;
1951
1952
// Extracted monitor_size.
1953
int monitor_size = frame::interpreter_frame_monitor_size_in_bytes();
1954
assert(Assembler::is_aligned((unsigned int)monitor_size,
1955
(unsigned int)frame::alignment_in_bytes),
1956
"size of a monitor must respect alignment of SP");
1957
1958
resize_frame(-monitor_size, /*temp*/esp); // Allocate space for new monitor
1959
std(R1_SP, _ijava_state_neg(top_frame_sp), esp); // esp contains fp
1960
1961
// Shuffle expression stack down. Recall that stack_base points
1962
// just above the new expression stack bottom. Old_tos and new_tos
1963
// are used to scan thru the old and new expression stacks.
1964
if (!stack_is_empty) {
1965
Label copy_slot, copy_slot_finished;
1966
const Register n_slots = slot;
1967
1968
addi(esp, R15_esp, Interpreter::stackElementSize); // Point to first element (pre-pushed stack).
1969
subf(n_slots, esp, R26_monitor);
1970
srdi_(n_slots, n_slots, LogBytesPerWord); // Compute number of slots to copy.
1971
assert(LogBytesPerWord == 3, "conflicts assembler instructions");
1972
beq(CCR0, copy_slot_finished); // Nothing to copy.
1973
1974
mtctr(n_slots);
1975
1976
// loop
1977
bind(copy_slot);
1978
ld(slot, 0, esp); // Move expression stack down.
1979
std(slot, -monitor_size, esp); // distance = monitor_size
1980
addi(esp, esp, BytesPerWord);
1981
bdnz(copy_slot);
1982
1983
bind(copy_slot_finished);
1984
}
1985
1986
addi(R15_esp, R15_esp, -monitor_size);
1987
addi(R26_monitor, R26_monitor, -monitor_size);
1988
1989
// Restart interpreter
1990
}
1991
1992
// ============================================================================
1993
// Java locals access
1994
1995
// Load a local variable at index in Rindex into register Rdst_value.
1996
// Also puts address of local into Rdst_address as a service.
1997
// Kills:
1998
// - Rdst_value
1999
// - Rdst_address
2000
void InterpreterMacroAssembler::load_local_int(Register Rdst_value, Register Rdst_address, Register Rindex) {
2001
sldi(Rdst_address, Rindex, Interpreter::logStackElementSize);
2002
subf(Rdst_address, Rdst_address, R18_locals);
2003
lwz(Rdst_value, 0, Rdst_address);
2004
}
2005
2006
// Load a local variable at index in Rindex into register Rdst_value.
2007
// Also puts address of local into Rdst_address as a service.
2008
// Kills:
2009
// - Rdst_value
2010
// - Rdst_address
2011
void InterpreterMacroAssembler::load_local_long(Register Rdst_value, Register Rdst_address, Register Rindex) {
2012
sldi(Rdst_address, Rindex, Interpreter::logStackElementSize);
2013
subf(Rdst_address, Rdst_address, R18_locals);
2014
ld(Rdst_value, -8, Rdst_address);
2015
}
2016
2017
// Load a local variable at index in Rindex into register Rdst_value.
2018
// Also puts address of local into Rdst_address as a service.
2019
// Input:
2020
// - Rindex: slot nr of local variable
2021
// Kills:
2022
// - Rdst_value
2023
// - Rdst_address
2024
void InterpreterMacroAssembler::load_local_ptr(Register Rdst_value, Register Rdst_address, Register Rindex) {
2025
sldi(Rdst_address, Rindex, Interpreter::logStackElementSize);
2026
subf(Rdst_address, Rdst_address, R18_locals);
2027
ld(Rdst_value, 0, Rdst_address);
2028
}
2029
2030
// Load a local variable at index in Rindex into register Rdst_value.
2031
// Also puts address of local into Rdst_address as a service.
2032
// Kills:
2033
// - Rdst_value
2034
// - Rdst_address
2035
void InterpreterMacroAssembler::load_local_float(FloatRegister Rdst_value, Register Rdst_address, Register Rindex) {
2036
sldi(Rdst_address, Rindex, Interpreter::logStackElementSize);
2037
subf(Rdst_address, Rdst_address, R18_locals);
2038
lfs(Rdst_value, 0, Rdst_address);
2039
}
2040
2041
// Load a local variable at index in Rindex into register Rdst_value.
2042
// Also puts address of local into Rdst_address as a service.
2043
// Kills:
2044
// - Rdst_value
2045
// - Rdst_address
2046
void InterpreterMacroAssembler::load_local_double(FloatRegister Rdst_value, Register Rdst_address, Register Rindex) {
2047
sldi(Rdst_address, Rindex, Interpreter::logStackElementSize);
2048
subf(Rdst_address, Rdst_address, R18_locals);
2049
lfd(Rdst_value, -8, Rdst_address);
2050
}
2051
2052
// Store an int value at local variable slot Rindex.
2053
// Kills:
2054
// - Rindex
2055
void InterpreterMacroAssembler::store_local_int(Register Rvalue, Register Rindex) {
2056
sldi(Rindex, Rindex, Interpreter::logStackElementSize);
2057
subf(Rindex, Rindex, R18_locals);
2058
stw(Rvalue, 0, Rindex);
2059
}
2060
2061
// Store a long value at local variable slot Rindex.
2062
// Kills:
2063
// - Rindex
2064
void InterpreterMacroAssembler::store_local_long(Register Rvalue, Register Rindex) {
2065
sldi(Rindex, Rindex, Interpreter::logStackElementSize);
2066
subf(Rindex, Rindex, R18_locals);
2067
std(Rvalue, -8, Rindex);
2068
}
2069
2070
// Store an oop value at local variable slot Rindex.
2071
// Kills:
2072
// - Rindex
2073
void InterpreterMacroAssembler::store_local_ptr(Register Rvalue, Register Rindex) {
2074
sldi(Rindex, Rindex, Interpreter::logStackElementSize);
2075
subf(Rindex, Rindex, R18_locals);
2076
std(Rvalue, 0, Rindex);
2077
}
2078
2079
// Store an int value at local variable slot Rindex.
2080
// Kills:
2081
// - Rindex
2082
void InterpreterMacroAssembler::store_local_float(FloatRegister Rvalue, Register Rindex) {
2083
sldi(Rindex, Rindex, Interpreter::logStackElementSize);
2084
subf(Rindex, Rindex, R18_locals);
2085
stfs(Rvalue, 0, Rindex);
2086
}
2087
2088
// Store an int value at local variable slot Rindex.
2089
// Kills:
2090
// - Rindex
2091
void InterpreterMacroAssembler::store_local_double(FloatRegister Rvalue, Register Rindex) {
2092
sldi(Rindex, Rindex, Interpreter::logStackElementSize);
2093
subf(Rindex, Rindex, R18_locals);
2094
stfd(Rvalue, -8, Rindex);
2095
}
2096
2097
// Read pending exception from thread and jump to interpreter.
2098
// Throw exception entry if one if pending. Fall through otherwise.
2099
void InterpreterMacroAssembler::check_and_forward_exception(Register Rscratch1, Register Rscratch2) {
2100
assert_different_registers(Rscratch1, Rscratch2, R3);
2101
Register Rexception = Rscratch1;
2102
Register Rtmp = Rscratch2;
2103
Label Ldone;
2104
// Get pending exception oop.
2105
ld(Rexception, thread_(pending_exception));
2106
cmpdi(CCR0, Rexception, 0);
2107
beq(CCR0, Ldone);
2108
li(Rtmp, 0);
2109
mr_if_needed(R3, Rexception);
2110
std(Rtmp, thread_(pending_exception)); // Clear exception in thread
2111
if (Interpreter::rethrow_exception_entry() != NULL) {
2112
// Already got entry address.
2113
load_dispatch_table(Rtmp, (address*)Interpreter::rethrow_exception_entry());
2114
} else {
2115
// Dynamically load entry address.
2116
int simm16_rest = load_const_optimized(Rtmp, &Interpreter::_rethrow_exception_entry, R0, true);
2117
ld(Rtmp, simm16_rest, Rtmp);
2118
}
2119
mtctr(Rtmp);
2120
save_interpreter_state(Rtmp);
2121
bctr();
2122
2123
align(32, 12);
2124
bind(Ldone);
2125
}
2126
2127
void InterpreterMacroAssembler::call_VM(Register oop_result, address entry_point, bool check_exceptions) {
2128
save_interpreter_state(R11_scratch1);
2129
2130
MacroAssembler::call_VM(oop_result, entry_point, false);
2131
2132
restore_interpreter_state(R11_scratch1, /*bcp_and_mdx_only*/ true);
2133
2134
check_and_handle_popframe(R11_scratch1);
2135
check_and_handle_earlyret(R11_scratch1);
2136
// Now check exceptions manually.
2137
if (check_exceptions) {
2138
check_and_forward_exception(R11_scratch1, R12_scratch2);
2139
}
2140
}
2141
2142
void InterpreterMacroAssembler::call_VM(Register oop_result, address entry_point, Register arg_1, bool check_exceptions) {
2143
// ARG1 is reserved for the thread.
2144
mr_if_needed(R4_ARG2, arg_1);
2145
call_VM(oop_result, entry_point, check_exceptions);
2146
}
2147
2148
void InterpreterMacroAssembler::call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, bool check_exceptions) {
2149
// ARG1 is reserved for the thread.
2150
mr_if_needed(R4_ARG2, arg_1);
2151
assert(arg_2 != R4_ARG2, "smashed argument");
2152
mr_if_needed(R5_ARG3, arg_2);
2153
call_VM(oop_result, entry_point, check_exceptions);
2154
}
2155
2156
void InterpreterMacroAssembler::call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, Register arg_3, bool check_exceptions) {
2157
// ARG1 is reserved for the thread.
2158
mr_if_needed(R4_ARG2, arg_1);
2159
assert(arg_2 != R4_ARG2, "smashed argument");
2160
mr_if_needed(R5_ARG3, arg_2);
2161
assert(arg_3 != R4_ARG2 && arg_3 != R5_ARG3, "smashed argument");
2162
mr_if_needed(R6_ARG4, arg_3);
2163
call_VM(oop_result, entry_point, check_exceptions);
2164
}
2165
2166
void InterpreterMacroAssembler::save_interpreter_state(Register scratch) {
2167
ld(scratch, 0, R1_SP);
2168
std(R15_esp, _ijava_state_neg(esp), scratch);
2169
std(R14_bcp, _ijava_state_neg(bcp), scratch);
2170
std(R26_monitor, _ijava_state_neg(monitors), scratch);
2171
if (ProfileInterpreter) { std(R28_mdx, _ijava_state_neg(mdx), scratch); }
2172
// Other entries should be unchanged.
2173
}
2174
2175
void InterpreterMacroAssembler::restore_interpreter_state(Register scratch, bool bcp_and_mdx_only) {
2176
ld(scratch, 0, R1_SP);
2177
ld(R14_bcp, _ijava_state_neg(bcp), scratch); // Changed by VM code (exception).
2178
if (ProfileInterpreter) { ld(R28_mdx, _ijava_state_neg(mdx), scratch); } // Changed by VM code.
2179
if (!bcp_and_mdx_only) {
2180
// Following ones are Metadata.
2181
ld(R19_method, _ijava_state_neg(method), scratch);
2182
ld(R27_constPoolCache, _ijava_state_neg(cpoolCache), scratch);
2183
// Following ones are stack addresses and don't require reload.
2184
ld(R15_esp, _ijava_state_neg(esp), scratch);
2185
ld(R18_locals, _ijava_state_neg(locals), scratch);
2186
ld(R26_monitor, _ijava_state_neg(monitors), scratch);
2187
}
2188
#ifdef ASSERT
2189
{
2190
Label Lok;
2191
subf(R0, R1_SP, scratch);
2192
cmpdi(CCR0, R0, frame::abi_reg_args_size + frame::ijava_state_size);
2193
bge(CCR0, Lok);
2194
stop("frame too small (restore istate)", 0x5432);
2195
bind(Lok);
2196
}
2197
{
2198
Label Lok;
2199
ld(R0, _ijava_state_neg(ijava_reserved), scratch);
2200
cmpdi(CCR0, R0, 0x5afe);
2201
beq(CCR0, Lok);
2202
stop("frame corrupted (restore istate)", 0x5afe);
2203
bind(Lok);
2204
}
2205
#endif
2206
}
2207
2208
#endif // !CC_INTERP
2209
2210
void InterpreterMacroAssembler::get_method_counters(Register method,
2211
Register Rcounters,
2212
Label& skip) {
2213
BLOCK_COMMENT("Load and ev. allocate counter object {");
2214
Label has_counters;
2215
ld(Rcounters, in_bytes(Method::method_counters_offset()), method);
2216
cmpdi(CCR0, Rcounters, 0);
2217
bne(CCR0, has_counters);
2218
call_VM(noreg, CAST_FROM_FN_PTR(address,
2219
InterpreterRuntime::build_method_counters), method, false);
2220
ld(Rcounters, in_bytes(Method::method_counters_offset()), method);
2221
cmpdi(CCR0, Rcounters, 0);
2222
beq(CCR0, skip); // No MethodCounters, OutOfMemory.
2223
BLOCK_COMMENT("} Load and ev. allocate counter object");
2224
2225
bind(has_counters);
2226
}
2227
2228
void InterpreterMacroAssembler::increment_invocation_counter(Register Rcounters, Register iv_be_count, Register Rtmp_r0) {
2229
assert(UseCompiler, "incrementing must be useful");
2230
Register invocation_count = iv_be_count;
2231
Register backedge_count = Rtmp_r0;
2232
int delta = InvocationCounter::count_increment;
2233
2234
// Load each counter in a register.
2235
// ld(inv_counter, Rtmp);
2236
// ld(be_counter, Rtmp2);
2237
int inv_counter_offset = in_bytes(MethodCounters::invocation_counter_offset() +
2238
InvocationCounter::counter_offset());
2239
int be_counter_offset = in_bytes(MethodCounters::backedge_counter_offset() +
2240
InvocationCounter::counter_offset());
2241
2242
BLOCK_COMMENT("Increment profiling counters {");
2243
2244
// Load the backedge counter.
2245
lwz(backedge_count, be_counter_offset, Rcounters); // is unsigned int
2246
// Mask the backedge counter.
2247
Register tmp = invocation_count;
2248
li(tmp, InvocationCounter::count_mask_value);
2249
andr(backedge_count, tmp, backedge_count); // Cannot use andi, need sign extension of count_mask_value.
2250
2251
// Load the invocation counter.
2252
lwz(invocation_count, inv_counter_offset, Rcounters); // is unsigned int
2253
// Add the delta to the invocation counter and store the result.
2254
addi(invocation_count, invocation_count, delta);
2255
// Store value.
2256
stw(invocation_count, inv_counter_offset, Rcounters);
2257
2258
// Add invocation counter + backedge counter.
2259
add(iv_be_count, backedge_count, invocation_count);
2260
2261
// Note that this macro must leave the backedge_count + invocation_count in
2262
// register iv_be_count!
2263
BLOCK_COMMENT("} Increment profiling counters");
2264
}
2265
2266
void InterpreterMacroAssembler::verify_oop(Register reg, TosState state) {
2267
if (state == atos) { MacroAssembler::verify_oop(reg); }
2268
}
2269
2270
#ifndef CC_INTERP
2271
// Local helper function for the verify_oop_or_return_address macro.
2272
static bool verify_return_address(Method* m, int bci) {
2273
#ifndef PRODUCT
2274
address pc = (address)(m->constMethod()) + in_bytes(ConstMethod::codes_offset()) + bci;
2275
// Assume it is a valid return address if it is inside m and is preceded by a jsr.
2276
if (!m->contains(pc)) return false;
2277
address jsr_pc;
2278
jsr_pc = pc - Bytecodes::length_for(Bytecodes::_jsr);
2279
if (*jsr_pc == Bytecodes::_jsr && jsr_pc >= m->code_base()) return true;
2280
jsr_pc = pc - Bytecodes::length_for(Bytecodes::_jsr_w);
2281
if (*jsr_pc == Bytecodes::_jsr_w && jsr_pc >= m->code_base()) return true;
2282
#endif // PRODUCT
2283
return false;
2284
}
2285
2286
void InterpreterMacroAssembler::verify_FPU(int stack_depth, TosState state) {
2287
if (VerifyFPU) {
2288
unimplemented("verfiyFPU");
2289
}
2290
}
2291
2292
void InterpreterMacroAssembler::verify_oop_or_return_address(Register reg, Register Rtmp) {
2293
if (!VerifyOops) return;
2294
2295
// The VM documentation for the astore[_wide] bytecode allows
2296
// the TOS to be not only an oop but also a return address.
2297
Label test;
2298
Label skip;
2299
// See if it is an address (in the current method):
2300
2301
const int log2_bytecode_size_limit = 16;
2302
srdi_(Rtmp, reg, log2_bytecode_size_limit);
2303
bne(CCR0, test);
2304
2305
address fd = CAST_FROM_FN_PTR(address, verify_return_address);
2306
const int nbytes_save = 11*8; // volatile gprs except R0
2307
save_volatile_gprs(R1_SP, -nbytes_save); // except R0
2308
save_LR_CR(Rtmp); // Save in old frame.
2309
push_frame_reg_args(nbytes_save, Rtmp);
2310
2311
load_const_optimized(Rtmp, fd, R0);
2312
mr_if_needed(R4_ARG2, reg);
2313
mr(R3_ARG1, R19_method);
2314
call_c(Rtmp); // call C
2315
2316
pop_frame();
2317
restore_LR_CR(Rtmp);
2318
restore_volatile_gprs(R1_SP, -nbytes_save); // except R0
2319
b(skip);
2320
2321
// Perform a more elaborate out-of-line call.
2322
// Not an address; verify it:
2323
bind(test);
2324
verify_oop(reg);
2325
bind(skip);
2326
}
2327
#endif // !CC_INTERP
2328
2329
// Inline assembly for:
2330
//
2331
// if (thread is in interp_only_mode) {
2332
// InterpreterRuntime::post_method_entry();
2333
// }
2334
// if (*jvmpi::event_flags_array_at_addr(JVMPI_EVENT_METHOD_ENTRY ) ||
2335
// *jvmpi::event_flags_array_at_addr(JVMPI_EVENT_METHOD_ENTRY2) ) {
2336
// SharedRuntime::jvmpi_method_entry(method, receiver);
2337
// }
2338
void InterpreterMacroAssembler::notify_method_entry() {
2339
// JVMTI
2340
// Whenever JVMTI puts a thread in interp_only_mode, method
2341
// entry/exit events are sent for that thread to track stack
2342
// depth. If it is possible to enter interp_only_mode we add
2343
// the code to check if the event should be sent.
2344
if (JvmtiExport::can_post_interpreter_events()) {
2345
Label jvmti_post_done;
2346
2347
lwz(R0, in_bytes(JavaThread::interp_only_mode_offset()), R16_thread);
2348
cmpwi(CCR0, R0, 0);
2349
beq(CCR0, jvmti_post_done);
2350
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_method_entry),
2351
/*check_exceptions=*/true CC_INTERP_ONLY(&& false));
2352
2353
bind(jvmti_post_done);
2354
}
2355
}
2356
2357
// Inline assembly for:
2358
//
2359
// if (thread is in interp_only_mode) {
2360
// // save result
2361
// InterpreterRuntime::post_method_exit();
2362
// // restore result
2363
// }
2364
// if (*jvmpi::event_flags_array_at_addr(JVMPI_EVENT_METHOD_EXIT)) {
2365
// // save result
2366
// SharedRuntime::jvmpi_method_exit();
2367
// // restore result
2368
// }
2369
//
2370
// Native methods have their result stored in d_tmp and l_tmp.
2371
// Java methods have their result stored in the expression stack.
2372
void InterpreterMacroAssembler::notify_method_exit(bool is_native_method, TosState state,
2373
NotifyMethodExitMode mode, bool check_exceptions) {
2374
// JVMTI
2375
// Whenever JVMTI puts a thread in interp_only_mode, method
2376
// entry/exit events are sent for that thread to track stack
2377
// depth. If it is possible to enter interp_only_mode we add
2378
// the code to check if the event should be sent.
2379
if (mode == NotifyJVMTI && JvmtiExport::can_post_interpreter_events()) {
2380
Label jvmti_post_done;
2381
2382
lwz(R0, in_bytes(JavaThread::interp_only_mode_offset()), R16_thread);
2383
cmpwi(CCR0, R0, 0);
2384
beq(CCR0, jvmti_post_done);
2385
CC_INTERP_ONLY(assert(is_native_method && !check_exceptions, "must not push state"));
2386
if (!is_native_method) push(state); // Expose tos to GC.
2387
call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_method_exit),
2388
/*check_exceptions=*/check_exceptions);
2389
if (!is_native_method) pop(state);
2390
2391
align(32, 12);
2392
bind(jvmti_post_done);
2393
}
2394
2395
// Dtrace support not implemented.
2396
}
2397
2398
#ifdef CC_INTERP
2399
// Convert the current TOP_IJAVA_FRAME into a PARENT_IJAVA_FRAME
2400
// (using parent_frame_resize) and push a new interpreter
2401
// TOP_IJAVA_FRAME (using frame_size).
2402
void InterpreterMacroAssembler::push_interpreter_frame(Register top_frame_size, Register parent_frame_resize,
2403
Register tmp1, Register tmp2, Register tmp3,
2404
Register tmp4, Register pc) {
2405
assert_different_registers(top_frame_size, parent_frame_resize, tmp1, tmp2, tmp3, tmp4);
2406
ld(tmp1, _top_ijava_frame_abi(frame_manager_lr), R1_SP);
2407
mr(tmp2/*top_frame_sp*/, R1_SP);
2408
// Move initial_caller_sp.
2409
ld(tmp4, _top_ijava_frame_abi(initial_caller_sp), R1_SP);
2410
neg(parent_frame_resize, parent_frame_resize);
2411
resize_frame(parent_frame_resize/*-parent_frame_resize*/, tmp3);
2412
2413
// Set LR in new parent frame.
2414
std(tmp1, _abi(lr), R1_SP);
2415
// Set top_frame_sp info for new parent frame.
2416
std(tmp2, _parent_ijava_frame_abi(top_frame_sp), R1_SP);
2417
std(tmp4, _parent_ijava_frame_abi(initial_caller_sp), R1_SP);
2418
2419
// Push new TOP_IJAVA_FRAME.
2420
push_frame(top_frame_size, tmp2);
2421
2422
get_PC_trash_LR(tmp3);
2423
std(tmp3, _top_ijava_frame_abi(frame_manager_lr), R1_SP);
2424
// Used for non-initial callers by unextended_sp().
2425
std(R1_SP, _top_ijava_frame_abi(initial_caller_sp), R1_SP);
2426
}
2427
2428
// Pop the topmost TOP_IJAVA_FRAME and convert the previous
2429
// PARENT_IJAVA_FRAME back into a TOP_IJAVA_FRAME.
2430
void InterpreterMacroAssembler::pop_interpreter_frame(Register tmp1, Register tmp2, Register tmp3, Register tmp4) {
2431
assert_different_registers(tmp1, tmp2, tmp3, tmp4);
2432
2433
ld(tmp1/*caller's sp*/, _abi(callers_sp), R1_SP);
2434
ld(tmp3, _abi(lr), tmp1);
2435
2436
ld(tmp4, _parent_ijava_frame_abi(initial_caller_sp), tmp1);
2437
2438
ld(tmp2/*caller's caller's sp*/, _abi(callers_sp), tmp1);
2439
// Merge top frame.
2440
std(tmp2, _abi(callers_sp), R1_SP);
2441
2442
ld(tmp2, _parent_ijava_frame_abi(top_frame_sp), tmp1);
2443
2444
// Update C stack pointer to caller's top_abi.
2445
resize_frame_absolute(tmp2/*addr*/, tmp1/*tmp*/, tmp2/*tmp*/);
2446
2447
// Update LR in top_frame.
2448
std(tmp3, _top_ijava_frame_abi(frame_manager_lr), R1_SP);
2449
2450
std(tmp4, _top_ijava_frame_abi(initial_caller_sp), R1_SP);
2451
2452
// Store the top-frame stack-pointer for c2i adapters.
2453
std(R1_SP, _top_ijava_frame_abi(top_frame_sp), R1_SP);
2454
}
2455
2456
// Turn state's interpreter frame into the current TOP_IJAVA_FRAME.
2457
void InterpreterMacroAssembler::pop_interpreter_frame_to_state(Register state, Register tmp1, Register tmp2, Register tmp3) {
2458
assert_different_registers(R14_state, R15_prev_state, tmp1, tmp2, tmp3);
2459
2460
if (state == R14_state) {
2461
ld(tmp1/*state's fp*/, state_(_last_Java_fp));
2462
ld(tmp2/*state's sp*/, state_(_last_Java_sp));
2463
} else if (state == R15_prev_state) {
2464
ld(tmp1/*state's fp*/, prev_state_(_last_Java_fp));
2465
ld(tmp2/*state's sp*/, prev_state_(_last_Java_sp));
2466
} else {
2467
ShouldNotReachHere();
2468
}
2469
2470
// Merge top frames.
2471
std(tmp1, _abi(callers_sp), R1_SP);
2472
2473
// Tmp2 is new SP.
2474
// Tmp1 is parent's SP.
2475
resize_frame_absolute(tmp2/*addr*/, tmp1/*tmp*/, tmp2/*tmp*/);
2476
2477
// Update LR in top_frame.
2478
// Must be interpreter frame.
2479
get_PC_trash_LR(tmp3);
2480
std(tmp3, _top_ijava_frame_abi(frame_manager_lr), R1_SP);
2481
// Used for non-initial callers by unextended_sp().
2482
std(R1_SP, _top_ijava_frame_abi(initial_caller_sp), R1_SP);
2483
}
2484
2485
// Set SP to initial caller's sp, but before fix the back chain.
2486
void InterpreterMacroAssembler::resize_frame_to_initial_caller(Register tmp1, Register tmp2) {
2487
ld(tmp1, _parent_ijava_frame_abi(initial_caller_sp), R1_SP);
2488
ld(tmp2, _parent_ijava_frame_abi(callers_sp), R1_SP);
2489
std(tmp2, _parent_ijava_frame_abi(callers_sp), tmp1); // Fix back chain ...
2490
mr(R1_SP, tmp1); // ... and resize to initial caller.
2491
}
2492
2493
// Pop the current interpreter state (without popping the correspoding
2494
// frame) and restore R14_state and R15_prev_state accordingly.
2495
// Use prev_state_may_be_0 to indicate whether prev_state may be 0
2496
// in order to generate an extra check before retrieving prev_state_(_prev_link).
2497
void InterpreterMacroAssembler::pop_interpreter_state(bool prev_state_may_be_0)
2498
{
2499
// Move prev_state to state and restore prev_state from state_(_prev_link).
2500
Label prev_state_is_0;
2501
mr(R14_state, R15_prev_state);
2502
2503
// Don't retrieve /*state==*/prev_state_(_prev_link)
2504
// if /*state==*/prev_state is 0.
2505
if (prev_state_may_be_0) {
2506
cmpdi(CCR0, R15_prev_state, 0);
2507
beq(CCR0, prev_state_is_0);
2508
}
2509
2510
ld(R15_prev_state, /*state==*/prev_state_(_prev_link));
2511
bind(prev_state_is_0);
2512
}
2513
2514
void InterpreterMacroAssembler::restore_prev_state() {
2515
// _prev_link is private, but cInterpreter is a friend.
2516
ld(R15_prev_state, state_(_prev_link));
2517
}
2518
#endif // CC_INTERP
2519
2520