hotspot/src/cpu/ppc/vm/templateInterpreter_ppc.cpp
author coleenp
Tue, 12 Aug 2014 10:48:55 -0400
changeset 25950 b5c40ed1d349
parent 25916 c5c22fab48fd
child 28187 fc19df82d6ee
permissions -rw-r--r--
8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero Summary: These options have been long disabled in Xmixed mode because they prevent these small methods from being inlined and are subject to bit rot, and we don't need more macro assembler code to maintain and change if the constant pool cache format changes. Reviewed-by: simonis, kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
     1
/*
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
     2
 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
     3
 * Copyright 2013, 2014 SAP AG. All rights reserved.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
     5
 *
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
     8
 * published by the Free Software Foundation.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
     9
 *
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    14
 * accompanied this code).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    15
 *
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    19
 *
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    22
 * questions.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    23
 *
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    24
 */
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    25
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    26
#include "precompiled.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    27
#ifndef CC_INTERP
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    28
#include "asm/macroAssembler.inline.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    29
#include "interpreter/bytecodeHistogram.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    30
#include "interpreter/interpreter.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    31
#include "interpreter/interpreterGenerator.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    32
#include "interpreter/interpreterRuntime.hpp"
25715
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24349
diff changeset
    33
#include "interpreter/interp_masm.hpp"
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    34
#include "interpreter/templateTable.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    35
#include "oops/arrayOop.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    36
#include "oops/methodData.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    37
#include "oops/method.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    38
#include "oops/oop.inline.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    39
#include "prims/jvmtiExport.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    40
#include "prims/jvmtiThreadState.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    41
#include "runtime/arguments.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    42
#include "runtime/deoptimization.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    43
#include "runtime/frame.inline.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    44
#include "runtime/sharedRuntime.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    45
#include "runtime/stubRoutines.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    46
#include "runtime/synchronizer.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    47
#include "runtime/timer.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    48
#include "runtime/vframeArray.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    49
#include "utilities/debug.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    50
#include "utilities/macros.hpp"
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    51
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    52
#undef __
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    53
#define __ _masm->
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    54
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    55
#ifdef PRODUCT
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    56
#define BLOCK_COMMENT(str) /* nothing */
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    57
#else
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    58
#define BLOCK_COMMENT(str) __ block_comment(str)
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    59
#endif
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    60
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    61
#define BIND(label) bind(label); BLOCK_COMMENT(#label ":")
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    62
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    63
//-----------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    64
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    65
// Actually we should never reach here since we do stack overflow checks before pushing any frame.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    66
address TemplateInterpreterGenerator::generate_StackOverflowError_handler() {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    67
  address entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    68
  __ unimplemented("generate_StackOverflowError_handler");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    69
  return entry;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    70
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    71
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    72
address TemplateInterpreterGenerator::generate_ArrayIndexOutOfBounds_handler(const char* name) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    73
  address entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    74
  __ empty_expression_stack();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    75
  __ load_const_optimized(R4_ARG2, (address) name);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    76
  // Index is in R17_tos.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    77
  __ mr(R5_ARG3, R17_tos);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    78
  __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_ArrayIndexOutOfBoundsException));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    79
  return entry;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    80
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    81
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    82
#if 0
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    83
// Call special ClassCastException constructor taking object to cast
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    84
// and target class as arguments.
24349
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
    85
address TemplateInterpreterGenerator::generate_ClassCastException_verbose_handler() {
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    86
  address entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    87
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    88
  // Expression stack must be empty before entering the VM if an
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    89
  // exception happened.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    90
  __ empty_expression_stack();
24349
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
    91
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    92
  // Thread will be loaded to R3_ARG1.
24349
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
    93
  // Target class oop is in register R5_ARG3 by convention!
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
    94
  __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_ClassCastException_verbose, R17_tos, R5_ARG3));
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    95
  // Above call must not return here since exception pending.
24349
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
    96
  DEBUG_ONLY(__ should_not_reach_here();)
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    97
  return entry;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    98
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
    99
#endif
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   100
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   101
address TemplateInterpreterGenerator::generate_ClassCastException_handler() {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   102
  address entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   103
  // Expression stack must be empty before entering the VM if an
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   104
  // exception happened.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   105
  __ empty_expression_stack();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   106
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   107
  // Load exception object.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   108
  // Thread will be loaded to R3_ARG1.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   109
  __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_ClassCastException), R17_tos);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   110
#ifdef ASSERT
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   111
  // Above call must not return here since exception pending.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   112
  __ should_not_reach_here();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   113
#endif
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   114
  return entry;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   115
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   116
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   117
address TemplateInterpreterGenerator::generate_exception_handler_common(const char* name, const char* message, bool pass_oop) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   118
  address entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   119
  //__ untested("generate_exception_handler_common");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   120
  Register Rexception = R17_tos;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   121
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   122
  // Expression stack must be empty before entering the VM if an exception happened.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   123
  __ empty_expression_stack();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   124
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   125
  __ load_const_optimized(R4_ARG2, (address) name, R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   126
  if (pass_oop) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   127
    __ mr(R5_ARG3, Rexception);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   128
    __ call_VM(Rexception, CAST_FROM_FN_PTR(address, InterpreterRuntime::create_klass_exception), false);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   129
  } else {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   130
    __ load_const_optimized(R5_ARG3, (address) message, R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   131
    __ call_VM(Rexception, CAST_FROM_FN_PTR(address, InterpreterRuntime::create_exception), false);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   132
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   133
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   134
  // Throw exception.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   135
  __ mr(R3_ARG1, Rexception);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   136
  __ load_const_optimized(R11_scratch1, Interpreter::throw_exception_entry(), R12_scratch2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   137
  __ mtctr(R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   138
  __ bctr();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   139
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   140
  return entry;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   141
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   142
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   143
address TemplateInterpreterGenerator::generate_continuation_for(TosState state) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   144
  address entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   145
  __ unimplemented("generate_continuation_for");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   146
  return entry;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   147
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   148
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   149
// This entry is returned to when a call returns to the interpreter.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   150
// When we arrive here, we expect that the callee stack frame is already popped.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   151
address TemplateInterpreterGenerator::generate_return_entry_for(TosState state, int step, size_t index_size) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   152
  address entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   153
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   154
  // Move the value out of the return register back to the TOS cache of current frame.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   155
  switch (state) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   156
    case ltos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   157
    case btos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   158
    case ctos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   159
    case stos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   160
    case atos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   161
    case itos: __ mr(R17_tos, R3_RET); break;   // RET -> TOS cache
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   162
    case ftos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   163
    case dtos: __ fmr(F15_ftos, F1_RET); break; // TOS cache -> GR_FRET
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   164
    case vtos: break;                           // Nothing to do, this was a void return.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   165
    default  : ShouldNotReachHere();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   166
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   167
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   168
  __ restore_interpreter_state(R11_scratch1); // Sets R11_scratch1 = fp.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   169
  __ ld(R12_scratch2, _ijava_state_neg(top_frame_sp), R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   170
  __ resize_frame_absolute(R12_scratch2, R11_scratch1, R0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   171
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   172
  // Compiled code destroys templateTableBase, reload.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   173
  __ load_const_optimized(R25_templateTableBase, (address)Interpreter::dispatch_table((TosState)0), R12_scratch2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   174
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   175
  const Register cache = R11_scratch1;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   176
  const Register size  = R12_scratch2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   177
  __ get_cache_and_index_at_bcp(cache, 1, index_size);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   178
25916
c5c22fab48fd 8050942: PPC64: implement template interpreter for ppc64le
kvn
parents: 25715
diff changeset
   179
  // Get least significant byte of 64 bit value:
c5c22fab48fd 8050942: PPC64: implement template interpreter for ppc64le
kvn
parents: 25715
diff changeset
   180
#if defined(VM_LITTLE_ENDIAN)
c5c22fab48fd 8050942: PPC64: implement template interpreter for ppc64le
kvn
parents: 25715
diff changeset
   181
  __ lbz(size, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset()), cache);
c5c22fab48fd 8050942: PPC64: implement template interpreter for ppc64le
kvn
parents: 25715
diff changeset
   182
#else
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   183
  __ lbz(size, in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::flags_offset()) + 7, cache);
25916
c5c22fab48fd 8050942: PPC64: implement template interpreter for ppc64le
kvn
parents: 25715
diff changeset
   184
#endif
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   185
  __ sldi(size, size, Interpreter::logStackElementSize);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   186
  __ add(R15_esp, R15_esp, size);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   187
  __ dispatch_next(state, step);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   188
  return entry;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   189
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   190
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   191
address TemplateInterpreterGenerator::generate_deopt_entry_for(TosState state, int step) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   192
  address entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   193
  // If state != vtos, we're returning from a native method, which put it's result
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   194
  // into the result register. So move the value out of the return register back
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   195
  // to the TOS cache of current frame.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   196
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   197
  switch (state) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   198
    case ltos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   199
    case btos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   200
    case ctos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   201
    case stos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   202
    case atos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   203
    case itos: __ mr(R17_tos, R3_RET); break;   // GR_RET -> TOS cache
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   204
    case ftos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   205
    case dtos: __ fmr(F15_ftos, F1_RET); break; // TOS cache -> GR_FRET
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   206
    case vtos: break;                           // Nothing to do, this was a void return.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   207
    default  : ShouldNotReachHere();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   208
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   209
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   210
  // Load LcpoolCache @@@ should be already set!
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   211
  __ get_constant_pool_cache(R27_constPoolCache);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   212
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   213
  // Handle a pending exception, fall through if none.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   214
  __ check_and_forward_exception(R11_scratch1, R12_scratch2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   215
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   216
  // Start executing bytecodes.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   217
  __ dispatch_next(state, step);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   218
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   219
  return entry;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   220
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   222
// A result handler converts the native result into java format.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   223
// Use the shared code between c++ and template interpreter.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   224
address TemplateInterpreterGenerator::generate_result_handler_for(BasicType type) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   225
  return AbstractInterpreterGenerator::generate_result_handler_for(type);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   226
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   227
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   228
address TemplateInterpreterGenerator::generate_safept_entry_for(TosState state, address runtime_entry) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   229
  address entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   230
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   231
  __ push(state);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   232
  __ call_VM(noreg, runtime_entry);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   233
  __ dispatch_via(vtos, Interpreter::_normal_table.table_for(vtos));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   234
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   235
  return entry;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   236
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   237
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   238
// Helpers for commoning out cases in the various type of method entries.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   239
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   240
// Increment invocation count & check for overflow.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   241
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   242
// Note: checking for negative value instead of overflow
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   243
//       so we have a 'sticky' overflow test.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   244
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   245
void TemplateInterpreterGenerator::generate_counter_incr(Label* overflow, Label* profile_method, Label* profile_method_continue) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   246
  // Note: In tiered we increment either counters in method or in MDO depending if we're profiling or not.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   247
  Register Rscratch1   = R11_scratch1;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   248
  Register Rscratch2   = R12_scratch2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   249
  Register R3_counters = R3_ARG1;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   250
  Label done;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   251
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   252
  if (TieredCompilation) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   253
    const int increment = InvocationCounter::count_increment;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   254
    const int mask = ((1 << Tier0InvokeNotifyFreqLog) - 1) << InvocationCounter::count_shift;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   255
    Label no_mdo;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   256
    if (ProfileInterpreter) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   257
      const Register Rmdo = Rscratch1;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   258
      // If no method data exists, go to profile_continue.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   259
      __ ld(Rmdo, in_bytes(Method::method_data_offset()), R19_method);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   260
      __ cmpdi(CCR0, Rmdo, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   261
      __ beq(CCR0, no_mdo);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   262
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   263
      // Increment backedge counter in the MDO.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   264
      const int mdo_bc_offs = in_bytes(MethodData::backedge_counter_offset()) + in_bytes(InvocationCounter::counter_offset());
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   265
      __ lwz(Rscratch2, mdo_bc_offs, Rmdo);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   266
      __ addi(Rscratch2, Rscratch2, increment);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   267
      __ stw(Rscratch2, mdo_bc_offs, Rmdo);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   268
      __ load_const_optimized(Rscratch1, mask, R0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   269
      __ and_(Rscratch1, Rscratch2, Rscratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   270
      __ bne(CCR0, done);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   271
      __ b(*overflow);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   272
    }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   273
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   274
    // Increment counter in MethodCounters*.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   275
    const int mo_bc_offs = in_bytes(MethodCounters::backedge_counter_offset()) + in_bytes(InvocationCounter::counter_offset());
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   276
    __ bind(no_mdo);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   277
    __ get_method_counters(R19_method, R3_counters, done);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   278
    __ lwz(Rscratch2, mo_bc_offs, R3_counters);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   279
    __ addi(Rscratch2, Rscratch2, increment);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   280
    __ stw(Rscratch2, mo_bc_offs, R3_counters);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   281
    __ load_const_optimized(Rscratch1, mask, R0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   282
    __ and_(Rscratch1, Rscratch2, Rscratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   283
    __ beq(CCR0, *overflow);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   284
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   285
    __ bind(done);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   286
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   287
  } else {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   288
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   289
    // Update standard invocation counters.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   290
    Register Rsum_ivc_bec = R4_ARG2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   291
    __ get_method_counters(R19_method, R3_counters, done);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   292
    __ increment_invocation_counter(R3_counters, Rsum_ivc_bec, R12_scratch2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   293
    // Increment interpreter invocation counter.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   294
    if (ProfileInterpreter) {  // %%% Merge this into methodDataOop.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   295
      __ lwz(R12_scratch2, in_bytes(MethodCounters::interpreter_invocation_counter_offset()), R3_counters);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   296
      __ addi(R12_scratch2, R12_scratch2, 1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   297
      __ stw(R12_scratch2, in_bytes(MethodCounters::interpreter_invocation_counter_offset()), R3_counters);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   298
    }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   299
    // Check if we must create a method data obj.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   300
    if (ProfileInterpreter && profile_method != NULL) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   301
      const Register profile_limit = Rscratch1;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   302
      int pl_offs = __ load_const_optimized(profile_limit, &InvocationCounter::InterpreterProfileLimit, R0, true);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   303
      __ lwz(profile_limit, pl_offs, profile_limit);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   304
      // Test to see if we should create a method data oop.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   305
      __ cmpw(CCR0, Rsum_ivc_bec, profile_limit);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   306
      __ blt(CCR0, *profile_method_continue);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   307
      // If no method data exists, go to profile_method.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   308
      __ test_method_data_pointer(*profile_method);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   309
    }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   310
    // Finally check for counter overflow.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   311
    if (overflow) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   312
      const Register invocation_limit = Rscratch1;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   313
      int il_offs = __ load_const_optimized(invocation_limit, &InvocationCounter::InterpreterInvocationLimit, R0, true);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   314
      __ lwz(invocation_limit, il_offs, invocation_limit);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   315
      assert(4 == sizeof(InvocationCounter::InterpreterInvocationLimit), "unexpected field size");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   316
      __ cmpw(CCR0, Rsum_ivc_bec, invocation_limit);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   317
      __ bge(CCR0, *overflow);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   318
    }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   319
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   320
    __ bind(done);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   321
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   322
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   323
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   324
// Generate code to initiate compilation on invocation counter overflow.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   325
void TemplateInterpreterGenerator::generate_counter_overflow(Label& continue_entry) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   326
  // Generate code to initiate compilation on the counter overflow.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   327
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   328
  // InterpreterRuntime::frequency_counter_overflow takes one arguments,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   329
  // which indicates if the counter overflow occurs at a backwards branch (NULL bcp)
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   330
  // We pass zero in.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   331
  // The call returns the address of the verified entry point for the method or NULL
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   332
  // if the compilation did not complete (either went background or bailed out).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   333
  //
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   334
  // Unlike the C++ interpreter above: Check exceptions!
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   335
  // Assumption: Caller must set the flag "do_not_unlock_if_sychronized" if the monitor of a sync'ed
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   336
  // method has not yet been created. Thus, no unlocking of a non-existing monitor can occur.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   337
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   338
  __ li(R4_ARG2, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   339
  __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), R4_ARG2, true);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   340
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   341
  // Returns verified_entry_point or NULL.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   342
  // We ignore it in any case.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   343
  __ b(continue_entry);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   344
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   345
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   346
void TemplateInterpreterGenerator::generate_stack_overflow_check(Register Rmem_frame_size, Register Rscratch1) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   347
  assert_different_registers(Rmem_frame_size, Rscratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   348
  __ generate_stack_overflow_check_with_compare_and_throw(Rmem_frame_size, Rscratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   349
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   350
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   351
void TemplateInterpreterGenerator::unlock_method(bool check_exceptions) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   352
  __ unlock_object(R26_monitor, check_exceptions);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   353
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   354
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   355
// Lock the current method, interpreter register window must be set up!
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   356
void TemplateInterpreterGenerator::lock_method(Register Rflags, Register Rscratch1, Register Rscratch2, bool flags_preloaded) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   357
  const Register Robj_to_lock = Rscratch2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   358
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   359
  {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   360
    if (!flags_preloaded) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   361
      __ lwz(Rflags, method_(access_flags));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   362
    }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   363
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   364
#ifdef ASSERT
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   365
    // Check if methods needs synchronization.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   366
    {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   367
      Label Lok;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   368
      __ testbitdi(CCR0, R0, Rflags, JVM_ACC_SYNCHRONIZED_BIT);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   369
      __ btrue(CCR0,Lok);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   370
      __ stop("method doesn't need synchronization");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   371
      __ bind(Lok);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   372
    }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   373
#endif // ASSERT
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   374
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   375
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   376
  // Get synchronization object to Rscratch2.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   377
  {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   378
    const int mirror_offset = in_bytes(Klass::java_mirror_offset());
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   379
    Label Lstatic;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   380
    Label Ldone;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   381
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   382
    __ testbitdi(CCR0, R0, Rflags, JVM_ACC_STATIC_BIT);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   383
    __ btrue(CCR0, Lstatic);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   384
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   385
    // Non-static case: load receiver obj from stack and we're done.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   386
    __ ld(Robj_to_lock, R18_locals);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   387
    __ b(Ldone);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   388
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   389
    __ bind(Lstatic); // Static case: Lock the java mirror
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   390
    __ ld(Robj_to_lock, in_bytes(Method::const_offset()), R19_method);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   391
    __ ld(Robj_to_lock, in_bytes(ConstMethod::constants_offset()), Robj_to_lock);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   392
    __ ld(Robj_to_lock, ConstantPool::pool_holder_offset_in_bytes(), Robj_to_lock);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   393
    __ ld(Robj_to_lock, mirror_offset, Robj_to_lock);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   394
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   395
    __ bind(Ldone);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   396
    __ verify_oop(Robj_to_lock);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   397
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   398
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   399
  // Got the oop to lock => execute!
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   400
  __ add_monitor_to_stack(true, Rscratch1, R0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   401
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   402
  __ std(Robj_to_lock, BasicObjectLock::obj_offset_in_bytes(), R26_monitor);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   403
  __ lock_object(R26_monitor, Robj_to_lock);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   404
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   405
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   406
// Generate a fixed interpreter frame for pure interpreter
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   407
// and I2N native transition frames.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   408
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   409
// Before (stack grows downwards):
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   410
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   411
//         |  ...         |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   412
//         |------------- |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   413
//         |  java arg0   |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   414
//         |  ...         |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   415
//         |  java argn   |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   416
//         |              |   <-   R15_esp
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   417
//         |              |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   418
//         |--------------|
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   419
//         | abi_112      |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   420
//         |              |   <-   R1_SP
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   421
//         |==============|
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   422
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   423
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   424
// After:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   425
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   426
//         |  ...         |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   427
//         |  java arg0   |<-   R18_locals
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   428
//         |  ...         |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   429
//         |  java argn   |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   430
//         |--------------|
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   431
//         |              |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   432
//         |  java locals |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   433
//         |              |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   434
//         |--------------|
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   435
//         |  abi_48      |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   436
//         |==============|
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   437
//         |              |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   438
//         |   istate     |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   439
//         |              |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   440
//         |--------------|
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   441
//         |   monitor    |<-   R26_monitor
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   442
//         |--------------|
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   443
//         |              |<-   R15_esp
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   444
//         | expression   |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   445
//         | stack        |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   446
//         |              |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   447
//         |--------------|
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   448
//         |              |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   449
//         | abi_112      |<-   R1_SP
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   450
//         |==============|
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   451
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   452
// The top most frame needs an abi space of 112 bytes. This space is needed,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   453
// since we call to c. The c function may spill their arguments to the caller
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   454
// frame. When we call to java, we don't need these spill slots. In order to save
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   455
// space on the stack, we resize the caller. However, java local reside in
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   456
// the caller frame and the frame has to be increased. The frame_size for the
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   457
// current frame was calculated based on max_stack as size for the expression
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   458
// stack. At the call, just a part of the expression stack might be used.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   459
// We don't want to waste this space and cut the frame back accordingly.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   460
// The resulting amount for resizing is calculated as follows:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   461
// resize =   (number_of_locals - number_of_arguments) * slot_size
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   462
//          + (R1_SP - R15_esp) + 48
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   463
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   464
// The size for the callee frame is calculated:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   465
// framesize = 112 + max_stack + monitor + state_size
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   466
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   467
// maxstack:   Max number of slots on the expression stack, loaded from the method.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   468
// monitor:    We statically reserve room for one monitor object.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   469
// state_size: We save the current state of the interpreter to this area.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   470
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   471
void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call, Register Rsize_of_parameters, Register Rsize_of_locals) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   472
  Register parent_frame_resize = R6_ARG4, // Frame will grow by this number of bytes.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   473
           top_frame_size      = R7_ARG5,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   474
           Rconst_method       = R8_ARG6;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   475
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   476
  assert_different_registers(Rsize_of_parameters, Rsize_of_locals, parent_frame_resize, top_frame_size);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   477
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   478
  __ ld(Rconst_method, method_(const));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   479
  __ lhz(Rsize_of_parameters /* number of params */,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   480
         in_bytes(ConstMethod::size_of_parameters_offset()), Rconst_method);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   481
  if (native_call) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   482
    // If we're calling a native method, we reserve space for the worst-case signature
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   483
    // handler varargs vector, which is max(Argument::n_register_parameters, parameter_count+2).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   484
    // We add two slots to the parameter_count, one for the jni
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   485
    // environment and one for a possible native mirror.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   486
    Label skip_native_calculate_max_stack;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   487
    __ addi(top_frame_size, Rsize_of_parameters, 2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   488
    __ cmpwi(CCR0, top_frame_size, Argument::n_register_parameters);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   489
    __ bge(CCR0, skip_native_calculate_max_stack);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   490
    __ li(top_frame_size, Argument::n_register_parameters);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   491
    __ bind(skip_native_calculate_max_stack);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   492
    __ sldi(Rsize_of_parameters, Rsize_of_parameters, Interpreter::logStackElementSize);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   493
    __ sldi(top_frame_size, top_frame_size, Interpreter::logStackElementSize);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   494
    __ sub(parent_frame_resize, R1_SP, R15_esp); // <0, off by Interpreter::stackElementSize!
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   495
    assert(Rsize_of_locals == noreg, "Rsize_of_locals not initialized"); // Only relevant value is Rsize_of_parameters.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   496
  } else {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   497
    __ lhz(Rsize_of_locals /* number of params */, in_bytes(ConstMethod::size_of_locals_offset()), Rconst_method);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   498
    __ sldi(Rsize_of_parameters, Rsize_of_parameters, Interpreter::logStackElementSize);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   499
    __ sldi(Rsize_of_locals, Rsize_of_locals, Interpreter::logStackElementSize);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   500
    __ lhz(top_frame_size, in_bytes(ConstMethod::max_stack_offset()), Rconst_method);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   501
    __ sub(R11_scratch1, Rsize_of_locals, Rsize_of_parameters); // >=0
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   502
    __ sub(parent_frame_resize, R1_SP, R15_esp); // <0, off by Interpreter::stackElementSize!
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   503
    __ sldi(top_frame_size, top_frame_size, Interpreter::logStackElementSize);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   504
    __ add(parent_frame_resize, parent_frame_resize, R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   505
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   506
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   507
  // Compute top frame size.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   508
  __ addi(top_frame_size, top_frame_size, frame::abi_reg_args_size + frame::ijava_state_size);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   509
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   510
  // Cut back area between esp and max_stack.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   511
  __ addi(parent_frame_resize, parent_frame_resize, frame::abi_minframe_size - Interpreter::stackElementSize);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   512
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   513
  __ round_to(top_frame_size, frame::alignment_in_bytes);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   514
  __ round_to(parent_frame_resize, frame::alignment_in_bytes);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   515
  // parent_frame_resize = (locals-parameters) - (ESP-SP-ABI48) Rounded to frame alignment size.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   516
  // Enlarge by locals-parameters (not in case of native_call), shrink by ESP-SP-ABI48.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   517
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   518
  {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   519
    // --------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   520
    // Stack overflow check
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   521
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   522
    Label cont;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   523
    __ add(R11_scratch1, parent_frame_resize, top_frame_size);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   524
    generate_stack_overflow_check(R11_scratch1, R12_scratch2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   525
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   526
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   527
  // Set up interpreter state registers.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   528
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   529
  __ add(R18_locals, R15_esp, Rsize_of_parameters);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   530
  __ ld(R27_constPoolCache, in_bytes(ConstMethod::constants_offset()), Rconst_method);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   531
  __ ld(R27_constPoolCache, ConstantPool::cache_offset_in_bytes(), R27_constPoolCache);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   532
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   533
  // Set method data pointer.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   534
  if (ProfileInterpreter) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   535
    Label zero_continue;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   536
    __ ld(R28_mdx, method_(method_data));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   537
    __ cmpdi(CCR0, R28_mdx, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   538
    __ beq(CCR0, zero_continue);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   539
    __ addi(R28_mdx, R28_mdx, in_bytes(MethodData::data_offset()));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   540
    __ bind(zero_continue);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   541
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   542
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   543
  if (native_call) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   544
    __ li(R14_bcp, 0); // Must initialize.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   545
  } else {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   546
    __ add(R14_bcp, in_bytes(ConstMethod::codes_offset()), Rconst_method);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   547
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   548
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   549
  // Resize parent frame.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   550
  __ mflr(R12_scratch2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   551
  __ neg(parent_frame_resize, parent_frame_resize);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   552
  __ resize_frame(parent_frame_resize, R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   553
  __ std(R12_scratch2, _abi(lr), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   554
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   555
  __ addi(R26_monitor, R1_SP, - frame::ijava_state_size);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   556
  __ addi(R15_esp, R26_monitor, - Interpreter::stackElementSize);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   557
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   558
  // Store values.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   559
  // R15_esp, R14_bcp, R26_monitor, R28_mdx are saved at java calls
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   560
  // in InterpreterMacroAssembler::call_from_interpreter.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   561
  __ std(R19_method, _ijava_state_neg(method), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   562
  __ std(R21_sender_SP, _ijava_state_neg(sender_sp), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   563
  __ std(R27_constPoolCache, _ijava_state_neg(cpoolCache), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   564
  __ std(R18_locals, _ijava_state_neg(locals), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   565
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   566
  // Note: esp, bcp, monitor, mdx live in registers. Hence, the correct version can only
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   567
  // be found in the frame after save_interpreter_state is done. This is always true
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   568
  // for non-top frames. But when a signal occurs, dumping the top frame can go wrong,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   569
  // because e.g. frame::interpreter_frame_bcp() will not access the correct value
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   570
  // (Enhanced Stack Trace).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   571
  // The signal handler does not save the interpreter state into the frame.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   572
  __ li(R0, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   573
#ifdef ASSERT
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   574
  // Fill remaining slots with constants.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   575
  __ load_const_optimized(R11_scratch1, 0x5afe);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   576
  __ load_const_optimized(R12_scratch2, 0xdead);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   577
#endif
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   578
  // We have to initialize some frame slots for native calls (accessed by GC).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   579
  if (native_call) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   580
    __ std(R26_monitor, _ijava_state_neg(monitors), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   581
    __ std(R14_bcp, _ijava_state_neg(bcp), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   582
    if (ProfileInterpreter) { __ std(R28_mdx, _ijava_state_neg(mdx), R1_SP); }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   583
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   584
#ifdef ASSERT
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   585
  else {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   586
    __ std(R12_scratch2, _ijava_state_neg(monitors), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   587
    __ std(R12_scratch2, _ijava_state_neg(bcp), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   588
    __ std(R12_scratch2, _ijava_state_neg(mdx), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   589
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   590
  __ std(R11_scratch1, _ijava_state_neg(ijava_reserved), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   591
  __ std(R12_scratch2, _ijava_state_neg(esp), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   592
  __ std(R12_scratch2, _ijava_state_neg(lresult), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   593
  __ std(R12_scratch2, _ijava_state_neg(fresult), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   594
#endif
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   595
  __ subf(R12_scratch2, top_frame_size, R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   596
  __ std(R0, _ijava_state_neg(oop_tmp), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   597
  __ std(R12_scratch2, _ijava_state_neg(top_frame_sp), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   598
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   599
  // Push top frame.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   600
  __ push_frame(top_frame_size, R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   601
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   602
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   603
// End of helpers
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   604
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   605
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   606
// Support abs and sqrt like in compiler.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   607
// For others we can use a normal (native) entry.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   608
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   609
inline bool math_entry_available(AbstractInterpreter::MethodKind kind) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   610
  // Provide math entry with debugging on demand.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   611
  // Note: Debugging changes which code will get executed:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   612
  // Debugging or disabled InlineIntrinsics: java method will get interpreted and performs a native call.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   613
  // Not debugging and enabled InlineIntrinics: processor instruction will get used.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   614
  // Result might differ slightly due to rounding etc.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   615
  if (!InlineIntrinsics && (!FLAG_IS_ERGO(InlineIntrinsics))) return false; // Generate a vanilla entry.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   616
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   617
  return ((kind==Interpreter::java_lang_math_sqrt && VM_Version::has_fsqrt()) ||
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   618
          (kind==Interpreter::java_lang_math_abs));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   619
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   620
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   621
address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::MethodKind kind) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   622
  if (!math_entry_available(kind)) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   623
    NOT_PRODUCT(__ should_not_reach_here();)
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   624
    return Interpreter::entry_for_kind(Interpreter::zerolocals);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   625
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   626
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   627
  Label Lslow_path;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   628
  const Register Rjvmti_mode = R11_scratch1;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   629
  address entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   630
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   631
  // Provide math entry with debugging on demand.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   632
  __ lwz(Rjvmti_mode, thread_(interp_only_mode));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   633
  __ cmpwi(CCR0, Rjvmti_mode, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   634
  __ bne(CCR0, Lslow_path); // jvmti_mode!=0
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   635
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   636
  __ lfd(F1_RET, Interpreter::stackElementSize, R15_esp);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   637
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   638
  // Pop c2i arguments (if any) off when we return.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   639
#ifdef ASSERT
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   640
  __ ld(R9_ARG7, 0, R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   641
  __ ld(R10_ARG8, 0, R21_sender_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   642
  __ cmpd(CCR0, R9_ARG7, R10_ARG8);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   643
  __ asm_assert_eq("backlink", 0x545);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   644
#endif // ASSERT
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   645
  __ mr(R1_SP, R21_sender_SP); // Cut the stack back to where the caller started.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   646
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   647
  if (kind == Interpreter::java_lang_math_sqrt) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   648
    __ fsqrt(F1_RET, F1_RET);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   649
  } else if (kind == Interpreter::java_lang_math_abs) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   650
    __ fabs(F1_RET, F1_RET);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   651
  } else {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   652
    ShouldNotReachHere();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   653
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   654
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   655
  // And we're done.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   656
  __ blr();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   657
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   658
  // Provide slow path for JVMTI case.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   659
  __ bind(Lslow_path);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   660
  __ branch_to_entry(Interpreter::entry_for_kind(Interpreter::zerolocals), R12_scratch2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   661
  __ flush();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   662
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   663
  return entry;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   664
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   665
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   666
// Interpreter stub for calling a native method. (asm interpreter)
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   667
// This sets up a somewhat different looking stack for calling the
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   668
// native method than the typical interpreter frame setup.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   669
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   670
// On entry:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   671
//   R19_method    - method
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   672
//   R16_thread    - JavaThread*
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   673
//   R15_esp       - intptr_t* sender tos
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   674
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   675
//   abstract stack (grows up)
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   676
//     [  IJava (caller of JNI callee)  ]  <-- ASP
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   677
//        ...
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   678
address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   679
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   680
  address entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   681
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   682
  const bool inc_counter = UseCompiler || CountCompiledCalls;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   683
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   684
  // -----------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   685
  // Allocate a new frame that represents the native callee (i2n frame).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   686
  // This is not a full-blown interpreter frame, but in particular, the
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   687
  // following registers are valid after this:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   688
  // - R19_method
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   689
  // - R18_local (points to start of argumuments to native function)
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   690
  //
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   691
  //   abstract stack (grows up)
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   692
  //     [  IJava (caller of JNI callee)  ]  <-- ASP
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   693
  //        ...
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   694
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   695
  const Register signature_handler_fd = R11_scratch1;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   696
  const Register pending_exception    = R0;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   697
  const Register result_handler_addr  = R31;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   698
  const Register native_method_fd     = R11_scratch1;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   699
  const Register access_flags         = R22_tmp2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   700
  const Register active_handles       = R11_scratch1; // R26_monitor saved to state.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   701
  const Register sync_state           = R12_scratch2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   702
  const Register sync_state_addr      = sync_state;   // Address is dead after use.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   703
  const Register suspend_flags        = R11_scratch1;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   704
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   705
  //=============================================================================
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   706
  // Allocate new frame and initialize interpreter state.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   707
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   708
  Label exception_return;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   709
  Label exception_return_sync_check;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   710
  Label stack_overflow_return;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   711
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   712
  // Generate new interpreter state and jump to stack_overflow_return in case of
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   713
  // a stack overflow.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   714
  //generate_compute_interpreter_state(stack_overflow_return);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   715
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   716
  Register size_of_parameters = R22_tmp2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   717
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   718
  generate_fixed_frame(true, size_of_parameters, noreg /* unused */);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   719
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   720
  //=============================================================================
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   721
  // Increment invocation counter. On overflow, entry to JNI method
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   722
  // will be compiled.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   723
  Label invocation_counter_overflow, continue_after_compile;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   724
  if (inc_counter) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   725
    if (synchronized) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   726
      // Since at this point in the method invocation the exception handler
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   727
      // would try to exit the monitor of synchronized methods which hasn't
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   728
      // been entered yet, we set the thread local variable
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   729
      // _do_not_unlock_if_synchronized to true. If any exception was thrown by
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   730
      // runtime, exception handling i.e. unlock_if_synchronized_method will
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   731
      // check this thread local flag.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   732
      // This flag has two effects, one is to force an unwind in the topmost
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   733
      // interpreter frame and not perform an unlock while doing so.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   734
      __ li(R0, 1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   735
      __ stb(R0, in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()), R16_thread);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   736
    }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   737
    generate_counter_incr(&invocation_counter_overflow, NULL, NULL);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   738
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   739
    __ BIND(continue_after_compile);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   740
    // Reset the _do_not_unlock_if_synchronized flag.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   741
    if (synchronized) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   742
      __ li(R0, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   743
      __ stb(R0, in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()), R16_thread);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   744
    }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   745
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   746
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   747
  // access_flags = method->access_flags();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   748
  // Load access flags.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   749
  assert(access_flags->is_nonvolatile(),
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   750
         "access_flags must be in a non-volatile register");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   751
  // Type check.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   752
  assert(4 == sizeof(AccessFlags), "unexpected field size");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   753
  __ lwz(access_flags, method_(access_flags));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   754
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   755
  // We don't want to reload R19_method and access_flags after calls
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   756
  // to some helper functions.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   757
  assert(R19_method->is_nonvolatile(),
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   758
         "R19_method must be a non-volatile register");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   759
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   760
  // Check for synchronized methods. Must happen AFTER invocation counter
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   761
  // check, so method is not locked if counter overflows.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   762
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   763
  if (synchronized) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   764
    lock_method(access_flags, R11_scratch1, R12_scratch2, true);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   765
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   766
    // Update monitor in state.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   767
    __ ld(R11_scratch1, 0, R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   768
    __ std(R26_monitor, _ijava_state_neg(monitors), R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   769
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   770
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   771
  // jvmti/jvmpi support
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   772
  __ notify_method_entry();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   773
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   774
  //=============================================================================
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   775
  // Get and call the signature handler.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   776
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   777
  __ ld(signature_handler_fd, method_(signature_handler));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   778
  Label call_signature_handler;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   779
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   780
  __ cmpdi(CCR0, signature_handler_fd, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   781
  __ bne(CCR0, call_signature_handler);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   782
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   783
  // Method has never been called. Either generate a specialized
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   784
  // handler or point to the slow one.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   785
  //
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   786
  // Pass parameter 'false' to avoid exception check in call_VM.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   787
  __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::prepare_native_call), R19_method, false);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   788
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   789
  // Check for an exception while looking up the target method. If we
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   790
  // incurred one, bail.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   791
  __ ld(pending_exception, thread_(pending_exception));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   792
  __ cmpdi(CCR0, pending_exception, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   793
  __ bne(CCR0, exception_return_sync_check); // Has pending exception.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   794
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   795
  // Reload signature handler, it may have been created/assigned in the meanwhile.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   796
  __ ld(signature_handler_fd, method_(signature_handler));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   797
  __ twi_0(signature_handler_fd); // Order wrt. load of klass mirror and entry point (isync is below).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   798
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   799
  __ BIND(call_signature_handler);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   800
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   801
  // Before we call the signature handler we push a new frame to
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   802
  // protect the interpreter frame volatile registers when we return
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   803
  // from jni but before we can get back to Java.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   804
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   805
  // First set the frame anchor while the SP/FP registers are
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   806
  // convenient and the slow signature handler can use this same frame
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   807
  // anchor.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   808
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   809
  // We have a TOP_IJAVA_FRAME here, which belongs to us.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   810
  __ set_top_ijava_frame_at_SP_as_last_Java_frame(R1_SP, R12_scratch2/*tmp*/);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   811
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   812
  // Now the interpreter frame (and its call chain) have been
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   813
  // invalidated and flushed. We are now protected against eager
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   814
  // being enabled in native code. Even if it goes eager the
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   815
  // registers will be reloaded as clean and we will invalidate after
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   816
  // the call so no spurious flush should be possible.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   817
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   818
  // Call signature handler and pass locals address.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   819
  //
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   820
  // Our signature handlers copy required arguments to the C stack
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   821
  // (outgoing C args), R3_ARG1 to R10_ARG8, and FARG1 to FARG13.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   822
  __ mr(R3_ARG1, R18_locals);
25916
c5c22fab48fd 8050942: PPC64: implement template interpreter for ppc64le
kvn
parents: 25715
diff changeset
   823
#if !defined(ABI_ELFv2)
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   824
  __ ld(signature_handler_fd, 0, signature_handler_fd);
25916
c5c22fab48fd 8050942: PPC64: implement template interpreter for ppc64le
kvn
parents: 25715
diff changeset
   825
#endif
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   826
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   827
  __ call_stub(signature_handler_fd);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   828
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   829
  // Remove the register parameter varargs slots we allocated in
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   830
  // compute_interpreter_state. SP+16 ends up pointing to the ABI
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   831
  // outgoing argument area.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   832
  //
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   833
  // Not needed on PPC64.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   834
  //__ add(SP, SP, Argument::n_register_parameters*BytesPerWord);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   835
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   836
  assert(result_handler_addr->is_nonvolatile(), "result_handler_addr must be in a non-volatile register");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   837
  // Save across call to native method.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   838
  __ mr(result_handler_addr, R3_RET);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   839
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   840
  __ isync(); // Acquire signature handler before trying to fetch the native entry point and klass mirror.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   841
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   842
  // Set up fixed parameters and call the native method.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   843
  // If the method is static, get mirror into R4_ARG2.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   844
  {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   845
    Label method_is_not_static;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   846
    // Access_flags is non-volatile and still, no need to restore it.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   847
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   848
    // Restore access flags.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   849
    __ testbitdi(CCR0, R0, access_flags, JVM_ACC_STATIC_BIT);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   850
    __ bfalse(CCR0, method_is_not_static);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   851
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   852
    // constants = method->constants();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   853
    __ ld(R11_scratch1, in_bytes(Method::const_offset()), R19_method);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   854
    __ ld(R11_scratch1, in_bytes(ConstMethod::constants_offset()), R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   855
    // pool_holder = method->constants()->pool_holder();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   856
    __ ld(R11_scratch1/*pool_holder*/, ConstantPool::pool_holder_offset_in_bytes(),
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   857
          R11_scratch1/*constants*/);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   858
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   859
    const int mirror_offset = in_bytes(Klass::java_mirror_offset());
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   860
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   861
    // mirror = pool_holder->klass_part()->java_mirror();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   862
    __ ld(R0/*mirror*/, mirror_offset, R11_scratch1/*pool_holder*/);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   863
    // state->_native_mirror = mirror;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   864
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   865
    __ ld(R11_scratch1, 0, R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   866
    __ std(R0/*mirror*/, _ijava_state_neg(oop_tmp), R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   867
    // R4_ARG2 = &state->_oop_temp;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   868
    __ addi(R4_ARG2, R11_scratch1, _ijava_state_neg(oop_tmp));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   869
    __ BIND(method_is_not_static);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   870
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   871
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   872
  // At this point, arguments have been copied off the stack into
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   873
  // their JNI positions. Oops are boxed in-place on the stack, with
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   874
  // handles copied to arguments. The result handler address is in a
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   875
  // register.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   876
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   877
  // Pass JNIEnv address as first parameter.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   878
  __ addir(R3_ARG1, thread_(jni_environment));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   879
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   880
  // Load the native_method entry before we change the thread state.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   881
  __ ld(native_method_fd, method_(native_function));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   882
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   883
  //=============================================================================
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   884
  // Transition from _thread_in_Java to _thread_in_native. As soon as
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   885
  // we make this change the safepoint code needs to be certain that
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   886
  // the last Java frame we established is good. The pc in that frame
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   887
  // just needs to be near here not an actual return address.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   888
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   889
  // We use release_store_fence to update values like the thread state, where
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   890
  // we don't want the current thread to continue until all our prior memory
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   891
  // accesses (including the new thread state) are visible to other threads.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   892
  __ li(R0, _thread_in_native);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   893
  __ release();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   894
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   895
  // TODO PPC port assert(4 == JavaThread::sz_thread_state(), "unexpected field size");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   896
  __ stw(R0, thread_(thread_state));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   897
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   898
  if (UseMembar) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   899
    __ fence();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   900
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   901
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   902
  //=============================================================================
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   903
  // Call the native method. Argument registers must not have been
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   904
  // overwritten since "__ call_stub(signature_handler);" (except for
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   905
  // ARG1 and ARG2 for static methods).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   906
  __ call_c(native_method_fd);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   907
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   908
  __ li(R0, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   909
  __ ld(R11_scratch1, 0, R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   910
  __ std(R3_RET, _ijava_state_neg(lresult), R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   911
  __ stfd(F1_RET, _ijava_state_neg(fresult), R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   912
  __ std(R0/*mirror*/, _ijava_state_neg(oop_tmp), R11_scratch1); // reset
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   913
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   914
  // Note: C++ interpreter needs the following here:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   915
  // The frame_manager_lr field, which we use for setting the last
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   916
  // java frame, gets overwritten by the signature handler. Restore
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   917
  // it now.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   918
  //__ get_PC_trash_LR(R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   919
  //__ std(R11_scratch1, _top_ijava_frame_abi(frame_manager_lr), R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   920
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   921
  // Because of GC R19_method may no longer be valid.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   922
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   923
  // Block, if necessary, before resuming in _thread_in_Java state.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   924
  // In order for GC to work, don't clear the last_Java_sp until after
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   925
  // blocking.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   926
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   927
  //=============================================================================
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   928
  // Switch thread to "native transition" state before reading the
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   929
  // synchronization state. This additional state is necessary
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   930
  // because reading and testing the synchronization state is not
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   931
  // atomic w.r.t. GC, as this scenario demonstrates: Java thread A,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   932
  // in _thread_in_native state, loads _not_synchronized and is
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   933
  // preempted. VM thread changes sync state to synchronizing and
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   934
  // suspends threads for GC. Thread A is resumed to finish this
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   935
  // native method, but doesn't block here since it didn't see any
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   936
  // synchronization in progress, and escapes.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   937
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   938
  // We use release_store_fence to update values like the thread state, where
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   939
  // we don't want the current thread to continue until all our prior memory
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   940
  // accesses (including the new thread state) are visible to other threads.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   941
  __ li(R0/*thread_state*/, _thread_in_native_trans);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   942
  __ release();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   943
  __ stw(R0/*thread_state*/, thread_(thread_state));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   944
  if (UseMembar) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   945
    __ fence();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   946
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   947
  // Write serialization page so that the VM thread can do a pseudo remote
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   948
  // membar. We use the current thread pointer to calculate a thread
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   949
  // specific offset to write to within the page. This minimizes bus
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   950
  // traffic due to cache line collision.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   951
  else {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   952
    __ serialize_memory(R16_thread, R11_scratch1, R12_scratch2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   953
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   954
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   955
  // Now before we return to java we must look for a current safepoint
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   956
  // (a new safepoint can not start since we entered native_trans).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   957
  // We must check here because a current safepoint could be modifying
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   958
  // the callers registers right this moment.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   959
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   960
  // Acquire isn't strictly necessary here because of the fence, but
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   961
  // sync_state is declared to be volatile, so we do it anyway
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   962
  // (cmp-br-isync on one path, release (same as acquire on PPC64) on the other path).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   963
  int sync_state_offs = __ load_const_optimized(sync_state_addr, SafepointSynchronize::address_of_state(), /*temp*/R0, true);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   964
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   965
  // TODO PPC port assert(4 == SafepointSynchronize::sz_state(), "unexpected field size");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   966
  __ lwz(sync_state, sync_state_offs, sync_state_addr);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   967
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   968
  // TODO PPC port assert(4 == Thread::sz_suspend_flags(), "unexpected field size");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   969
  __ lwz(suspend_flags, thread_(suspend_flags));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   970
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   971
  Label sync_check_done;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   972
  Label do_safepoint;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   973
  // No synchronization in progress nor yet synchronized.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   974
  __ cmpwi(CCR0, sync_state, SafepointSynchronize::_not_synchronized);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   975
  // Not suspended.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   976
  __ cmpwi(CCR1, suspend_flags, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   977
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   978
  __ bne(CCR0, do_safepoint);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   979
  __ beq(CCR1, sync_check_done);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   980
  __ bind(do_safepoint);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   981
  __ isync();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   982
  // Block. We do the call directly and leave the current
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   983
  // last_Java_frame setup undisturbed. We must save any possible
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   984
  // native result across the call. No oop is present.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   985
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   986
  __ mr(R3_ARG1, R16_thread);
25916
c5c22fab48fd 8050942: PPC64: implement template interpreter for ppc64le
kvn
parents: 25715
diff changeset
   987
#if defined(ABI_ELFv2)
c5c22fab48fd 8050942: PPC64: implement template interpreter for ppc64le
kvn
parents: 25715
diff changeset
   988
  __ call_c(CAST_FROM_FN_PTR(address, JavaThread::check_special_condition_for_native_trans),
c5c22fab48fd 8050942: PPC64: implement template interpreter for ppc64le
kvn
parents: 25715
diff changeset
   989
            relocInfo::none);
c5c22fab48fd 8050942: PPC64: implement template interpreter for ppc64le
kvn
parents: 25715
diff changeset
   990
#else
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   991
  __ call_c(CAST_FROM_FN_PTR(FunctionDescriptor*, JavaThread::check_special_condition_for_native_trans),
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   992
            relocInfo::none);
25916
c5c22fab48fd 8050942: PPC64: implement template interpreter for ppc64le
kvn
parents: 25715
diff changeset
   993
#endif
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   994
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   995
  __ bind(sync_check_done);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   996
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   997
  //=============================================================================
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   998
  // <<<<<< Back in Interpreter Frame >>>>>
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
   999
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1000
  // We are in thread_in_native_trans here and back in the normal
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1001
  // interpreter frame. We don't have to do anything special about
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1002
  // safepoints and we can switch to Java mode anytime we are ready.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1003
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1004
  // Note: frame::interpreter_frame_result has a dependency on how the
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1005
  // method result is saved across the call to post_method_exit. For
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1006
  // native methods it assumes that the non-FPU/non-void result is
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1007
  // saved in _native_lresult and a FPU result in _native_fresult. If
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1008
  // this changes then the interpreter_frame_result implementation
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1009
  // will need to be updated too.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1010
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1011
  // On PPC64, we have stored the result directly after the native call.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1012
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1013
  //=============================================================================
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1014
  // Back in Java
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1015
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1016
  // We use release_store_fence to update values like the thread state, where
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1017
  // we don't want the current thread to continue until all our prior memory
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1018
  // accesses (including the new thread state) are visible to other threads.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1019
  __ li(R0/*thread_state*/, _thread_in_Java);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1020
  __ release();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1021
  __ stw(R0/*thread_state*/, thread_(thread_state));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1022
  if (UseMembar) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1023
    __ fence();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1024
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1025
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1026
  __ reset_last_Java_frame();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1027
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1028
  // Jvmdi/jvmpi support. Whether we've got an exception pending or
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1029
  // not, and whether unlocking throws an exception or not, we notify
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1030
  // on native method exit. If we do have an exception, we'll end up
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1031
  // in the caller's context to handle it, so if we don't do the
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1032
  // notify here, we'll drop it on the floor.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1033
  __ notify_method_exit(true/*native method*/,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1034
                        ilgl /*illegal state (not used for native methods)*/,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1035
                        InterpreterMacroAssembler::NotifyJVMTI,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1036
                        false /*check_exceptions*/);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1037
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1038
  //=============================================================================
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1039
  // Handle exceptions
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1040
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1041
  if (synchronized) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1042
    // Don't check for exceptions since we're still in the i2n frame. Do that
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1043
    // manually afterwards.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1044
    unlock_method(false);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1045
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1046
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1047
  // Reset active handles after returning from native.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1048
  // thread->active_handles()->clear();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1049
  __ ld(active_handles, thread_(active_handles));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1050
  // TODO PPC port assert(4 == JNIHandleBlock::top_size_in_bytes(), "unexpected field size");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1051
  __ li(R0, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1052
  __ stw(R0, JNIHandleBlock::top_offset_in_bytes(), active_handles);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1053
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1054
  Label exception_return_sync_check_already_unlocked;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1055
  __ ld(R0/*pending_exception*/, thread_(pending_exception));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1056
  __ cmpdi(CCR0, R0/*pending_exception*/, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1057
  __ bne(CCR0, exception_return_sync_check_already_unlocked);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1058
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1059
  //-----------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1060
  // No exception pending.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1061
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1062
  // Move native method result back into proper registers and return.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1063
  // Invoke result handler (may unbox/promote).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1064
  __ ld(R11_scratch1, 0, R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1065
  __ ld(R3_RET, _ijava_state_neg(lresult), R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1066
  __ lfd(F1_RET, _ijava_state_neg(fresult), R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1067
  __ call_stub(result_handler_addr);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1068
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1069
  __ merge_frames(/*top_frame_sp*/ R21_sender_SP, /*return_pc*/ R0, R11_scratch1, R12_scratch2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1070
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1071
  // Must use the return pc which was loaded from the caller's frame
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1072
  // as the VM uses return-pc-patching for deoptimization.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1073
  __ mtlr(R0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1074
  __ blr();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1075
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1076
  //-----------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1077
  // An exception is pending. We call into the runtime only if the
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1078
  // caller was not interpreted. If it was interpreted the
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1079
  // interpreter will do the correct thing. If it isn't interpreted
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1080
  // (call stub/compiled code) we will change our return and continue.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1081
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1082
  __ BIND(exception_return_sync_check);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1083
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1084
  if (synchronized) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1085
    // Don't check for exceptions since we're still in the i2n frame. Do that
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1086
    // manually afterwards.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1087
    unlock_method(false);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1088
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1089
  __ BIND(exception_return_sync_check_already_unlocked);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1090
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1091
  const Register return_pc = R31;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1092
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1093
  __ ld(return_pc, 0, R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1094
  __ ld(return_pc, _abi(lr), return_pc);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1095
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1096
  // Get the address of the exception handler.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1097
  __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::exception_handler_for_return_address),
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1098
                  R16_thread,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1099
                  return_pc /* return pc */);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1100
  __ merge_frames(/*top_frame_sp*/ R21_sender_SP, noreg, R11_scratch1, R12_scratch2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1101
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1102
  // Load the PC of the the exception handler into LR.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1103
  __ mtlr(R3_RET);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1104
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1105
  // Load exception into R3_ARG1 and clear pending exception in thread.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1106
  __ ld(R3_ARG1/*exception*/, thread_(pending_exception));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1107
  __ li(R4_ARG2, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1108
  __ std(R4_ARG2, thread_(pending_exception));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1109
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1110
  // Load the original return pc into R4_ARG2.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1111
  __ mr(R4_ARG2/*issuing_pc*/, return_pc);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1112
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1113
  // Return to exception handler.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1114
  __ blr();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1115
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1116
  //=============================================================================
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1117
  // Counter overflow.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1118
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1119
  if (inc_counter) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1120
    // Handle invocation counter overflow.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1121
    __ bind(invocation_counter_overflow);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1122
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1123
    generate_counter_overflow(continue_after_compile);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1124
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1125
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1126
  return entry;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1127
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1128
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1129
// Generic interpreted method entry to (asm) interpreter.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1130
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1131
address TemplateInterpreterGenerator::generate_normal_entry(bool synchronized) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1132
  bool inc_counter = UseCompiler || CountCompiledCalls;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1133
  address entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1134
  // Generate the code to allocate the interpreter stack frame.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1135
  Register Rsize_of_parameters = R4_ARG2, // Written by generate_fixed_frame.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1136
           Rsize_of_locals     = R5_ARG3; // Written by generate_fixed_frame.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1137
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1138
  generate_fixed_frame(false, Rsize_of_parameters, Rsize_of_locals);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1139
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1140
#ifdef FAST_DISPATCH
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1141
  __ unimplemented("Fast dispatch in generate_normal_entry");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1142
#if 0
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1143
  __ set((intptr_t)Interpreter::dispatch_table(), IdispatchTables);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1144
  // Set bytecode dispatch table base.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1145
#endif
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1146
#endif
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1147
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1148
  // --------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1149
  // Zero out non-parameter locals.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1150
  // Note: *Always* zero out non-parameter locals as Sparc does. It's not
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1151
  // worth to ask the flag, just do it.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1152
  Register Rslot_addr = R6_ARG4,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1153
           Rnum       = R7_ARG5;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1154
  Label Lno_locals, Lzero_loop;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1155
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1156
  // Set up the zeroing loop.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1157
  __ subf(Rnum, Rsize_of_parameters, Rsize_of_locals);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1158
  __ subf(Rslot_addr, Rsize_of_parameters, R18_locals);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1159
  __ srdi_(Rnum, Rnum, Interpreter::logStackElementSize);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1160
  __ beq(CCR0, Lno_locals);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1161
  __ li(R0, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1162
  __ mtctr(Rnum);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1163
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1164
  // The zero locals loop.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1165
  __ bind(Lzero_loop);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1166
  __ std(R0, 0, Rslot_addr);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1167
  __ addi(Rslot_addr, Rslot_addr, -Interpreter::stackElementSize);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1168
  __ bdnz(Lzero_loop);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1169
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1170
  __ bind(Lno_locals);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1171
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1172
  // --------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1173
  // Counter increment and overflow check.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1174
  Label invocation_counter_overflow,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1175
        profile_method,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1176
        profile_method_continue;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1177
  if (inc_counter || ProfileInterpreter) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1178
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1179
    Register Rdo_not_unlock_if_synchronized_addr = R11_scratch1;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1180
    if (synchronized) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1181
      // Since at this point in the method invocation the exception handler
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1182
      // would try to exit the monitor of synchronized methods which hasn't
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1183
      // been entered yet, we set the thread local variable
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1184
      // _do_not_unlock_if_synchronized to true. If any exception was thrown by
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1185
      // runtime, exception handling i.e. unlock_if_synchronized_method will
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1186
      // check this thread local flag.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1187
      // This flag has two effects, one is to force an unwind in the topmost
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1188
      // interpreter frame and not perform an unlock while doing so.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1189
      __ li(R0, 1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1190
      __ stb(R0, in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()), R16_thread);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1191
    }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1192
    // Increment invocation counter and check for overflow.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1193
    if (inc_counter) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1194
      generate_counter_incr(&invocation_counter_overflow, &profile_method, &profile_method_continue);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1195
    }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1196
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1197
    __ bind(profile_method_continue);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1198
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1199
    // Reset the _do_not_unlock_if_synchronized flag.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1200
    if (synchronized) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1201
      __ li(R0, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1202
      __ stb(R0, in_bytes(JavaThread::do_not_unlock_if_synchronized_offset()), R16_thread);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1203
    }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1204
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1205
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1206
  // --------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1207
  // Locking of synchronized methods. Must happen AFTER invocation_counter
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1208
  // check and stack overflow check, so method is not locked if overflows.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1209
  if (synchronized) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1210
    lock_method(R3_ARG1, R4_ARG2, R5_ARG3);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1211
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1212
#ifdef ASSERT
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1213
  else {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1214
    Label Lok;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1215
    __ lwz(R0, in_bytes(Method::access_flags_offset()), R19_method);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1216
    __ andi_(R0, R0, JVM_ACC_SYNCHRONIZED);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1217
    __ asm_assert_eq("method needs synchronization", 0x8521);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1218
    __ bind(Lok);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1219
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1220
#endif // ASSERT
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1222
  __ verify_thread();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1223
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1224
  // --------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1225
  // JVMTI support
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1226
  __ notify_method_entry();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1227
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1228
  // --------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1229
  // Start executing instructions.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1230
  __ dispatch_next(vtos);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1231
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1232
  // --------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1233
  // Out of line counter overflow and MDO creation code.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1234
  if (ProfileInterpreter) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1235
    // We have decided to profile this method in the interpreter.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1236
    __ bind(profile_method);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1237
    __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1238
    __ set_method_data_pointer_for_bcp();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1239
    __ b(profile_method_continue);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1240
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1241
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1242
  if (inc_counter) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1243
    // Handle invocation counter overflow.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1244
    __ bind(invocation_counter_overflow);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1245
    generate_counter_overflow(profile_method_continue);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1246
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1247
  return entry;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1248
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1249
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1250
// These should never be compiled since the interpreter will prefer
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1251
// the compiled version to the intrinsic version.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1252
bool AbstractInterpreter::can_be_compiled(methodHandle m) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1253
  return !math_entry_available(method_kind(m));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1254
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1255
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1256
// How much stack a method activation needs in stack slots.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1257
// We must calc this exactly like in generate_fixed_frame.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1258
// Note: This returns the conservative size assuming maximum alignment.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1259
int AbstractInterpreter::size_top_interpreter_activation(Method* method) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1260
  const int max_alignment_size = 2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1261
  const int abi_scratch = frame::abi_reg_args_size;
24018
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1262
  return method->max_locals() + method->max_stack() +
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1263
         frame::interpreter_frame_monitor_size() + max_alignment_size + abi_scratch;
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1264
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1265
24018
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1266
// Returns number of stackElementWords needed for the interpreter frame with the
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1267
// given sections.
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1268
// This overestimates the stack by one slot in case of alignments.
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1269
int AbstractInterpreter::size_activation(int max_stack,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1270
                                         int temps,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1271
                                         int extra_args,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1272
                                         int monitors,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1273
                                         int callee_params,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1274
                                         int callee_locals,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1275
                                         bool is_top_frame) {
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1276
  // Note: This calculation must exactly parallel the frame setup
25950
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25916
diff changeset
  1277
  // in InterpreterGenerator::generate_fixed_frame.
24018
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1278
  assert(Interpreter::stackElementWords == 1, "sanity");
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1279
  const int max_alignment_space = StackAlignmentInBytes / Interpreter::stackElementSize;
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1280
  const int abi_scratch = is_top_frame ? (frame::abi_reg_args_size / Interpreter::stackElementSize) :
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1281
                                         (frame::abi_minframe_size / Interpreter::stackElementSize);
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1282
  const int size =
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1283
    max_stack                                                +
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1284
    (callee_locals - callee_params)                          +
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1285
    monitors * frame::interpreter_frame_monitor_size()       +
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1286
    max_alignment_space                                      +
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1287
    abi_scratch                                              +
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1288
    frame::ijava_state_size / Interpreter::stackElementSize;
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1289
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1290
  // Fixed size of an interpreter frame, align to 16-byte.
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1291
  return (size & -2);
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1292
}
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1293
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1294
// Fills a sceletal interpreter frame generated during deoptimizations.
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1295
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1296
// Parameters:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1297
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1298
// interpreter_frame != NULL:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1299
//   set up the method, locals, and monitors.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1300
//   The frame interpreter_frame, if not NULL, is guaranteed to be the
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1301
//   right size, as determined by a previous call to this method.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1302
//   It is also guaranteed to be walkable even though it is in a skeletal state
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1303
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1304
// is_top_frame == true:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1305
//   We're processing the *oldest* interpreter frame!
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1306
//
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1307
// pop_frame_extra_args:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1308
//   If this is != 0 we are returning to a deoptimized frame by popping
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1309
//   off the callee frame. We want to re-execute the call that called the
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1310
//   callee interpreted, but since the return to the interpreter would pop
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1311
//   the arguments off advance the esp by dummy popframe_extra_args slots.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1312
//   Popping off those will establish the stack layout as it was before the call.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1313
//
24018
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1314
void AbstractInterpreter::layout_activation(Method* method,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1315
                                            int tempcount,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1316
                                            int popframe_extra_args,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1317
                                            int moncount,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1318
                                            int caller_actual_parameters,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1319
                                            int callee_param_count,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1320
                                            int callee_locals_count,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1321
                                            frame* caller,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1322
                                            frame* interpreter_frame,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1323
                                            bool is_top_frame,
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1324
                                            bool is_bottom_frame) {
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1325
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1326
  const int abi_scratch = is_top_frame ? (frame::abi_reg_args_size / Interpreter::stackElementSize) :
24018
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1327
                                         (frame::abi_minframe_size / Interpreter::stackElementSize);
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1328
24018
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1329
  intptr_t* locals_base  = (caller->is_interpreted_frame()) ?
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1330
    caller->interpreter_frame_esp() + caller_actual_parameters :
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1331
    caller->sp() + method->max_locals() - 1 + (frame::abi_minframe_size / Interpreter::stackElementSize) ;
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1332
24018
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1333
  intptr_t* monitor_base = caller->sp() - frame::ijava_state_size / Interpreter::stackElementSize ;
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1334
  intptr_t* monitor      = monitor_base - (moncount * frame::interpreter_frame_monitor_size());
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1335
  intptr_t* esp_base     = monitor - 1;
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1336
  intptr_t* esp          = esp_base - tempcount - popframe_extra_args;
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1337
  intptr_t* sp           = (intptr_t *) (((intptr_t) (esp_base - callee_locals_count + callee_param_count - method->max_stack()- abi_scratch)) & -StackAlignmentInBytes);
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1338
  intptr_t* sender_sp    = caller->sp() + (frame::abi_minframe_size - frame::abi_reg_args_size) / Interpreter::stackElementSize;
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1339
  intptr_t* top_frame_sp = is_top_frame ? sp : sp + (frame::abi_minframe_size - frame::abi_reg_args_size) / Interpreter::stackElementSize;
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1340
24018
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1341
  interpreter_frame->interpreter_frame_set_method(method);
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1342
  interpreter_frame->interpreter_frame_set_locals(locals_base);
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1343
  interpreter_frame->interpreter_frame_set_cpcache(method->constants()->cache());
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1344
  interpreter_frame->interpreter_frame_set_esp(esp);
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1345
  interpreter_frame->interpreter_frame_set_monitor_end((BasicObjectLock *)monitor);
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1346
  interpreter_frame->interpreter_frame_set_top_frame_sp(top_frame_sp);
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1347
  if (!is_bottom_frame) {
77b156916bab 8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents: 23522
diff changeset
  1348
    interpreter_frame->interpreter_frame_set_sender_sp(sender_sp);
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1349
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1350
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1351
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1352
// =============================================================================
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1353
// Exceptions
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1354
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1355
void TemplateInterpreterGenerator::generate_throw_exception() {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1356
  Register Rexception    = R17_tos,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1357
           Rcontinuation = R3_RET;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1358
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1359
  // --------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1360
  // Entry point if an method returns with a pending exception (rethrow).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1361
  Interpreter::_rethrow_exception_entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1362
  {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1363
    __ restore_interpreter_state(R11_scratch1); // Sets R11_scratch1 = fp.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1364
    __ ld(R12_scratch2, _ijava_state_neg(top_frame_sp), R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1365
    __ resize_frame_absolute(R12_scratch2, R11_scratch1, R0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1366
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1367
    // Compiled code destroys templateTableBase, reload.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1368
    __ load_const_optimized(R25_templateTableBase, (address)Interpreter::dispatch_table((TosState)0), R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1369
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1370
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1371
  // Entry point if a interpreted method throws an exception (throw).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1372
  Interpreter::_throw_exception_entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1373
  {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1374
    __ mr(Rexception, R3_RET);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1375
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1376
    __ verify_thread();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1377
    __ verify_oop(Rexception);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1378
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1379
    // Expression stack must be empty before entering the VM in case of an exception.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1380
    __ empty_expression_stack();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1381
    // Find exception handler address and preserve exception oop.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1382
    // Call C routine to find handler and jump to it.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1383
    __ call_VM(Rexception, CAST_FROM_FN_PTR(address, InterpreterRuntime::exception_handler_for_exception), Rexception);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1384
    __ mtctr(Rcontinuation);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1385
    // Push exception for exception handler bytecodes.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1386
    __ push_ptr(Rexception);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1387
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1388
    // Jump to exception handler (may be remove activation entry!).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1389
    __ bctr();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1390
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1391
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1392
  // If the exception is not handled in the current frame the frame is
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1393
  // removed and the exception is rethrown (i.e. exception
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1394
  // continuation is _rethrow_exception).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1395
  //
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1396
  // Note: At this point the bci is still the bxi for the instruction
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1397
  // which caused the exception and the expression stack is
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1398
  // empty. Thus, for any VM calls at this point, GC will find a legal
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1399
  // oop map (with empty expression stack).
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1400
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1401
  // In current activation
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1402
  // tos: exception
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1403
  // bcp: exception bcp
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1404
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1405
  // --------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1406
  // JVMTI PopFrame support
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1407
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1408
  Interpreter::_remove_activation_preserving_args_entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1409
  {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1410
    // Set the popframe_processing bit in popframe_condition indicating that we are
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1411
    // currently handling popframe, so that call_VMs that may happen later do not
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1412
    // trigger new popframe handling cycles.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1413
    __ lwz(R11_scratch1, in_bytes(JavaThread::popframe_condition_offset()), R16_thread);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1414
    __ ori(R11_scratch1, R11_scratch1, JavaThread::popframe_processing_bit);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1415
    __ stw(R11_scratch1, in_bytes(JavaThread::popframe_condition_offset()), R16_thread);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1416
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1417
    // Empty the expression stack, as in normal exception handling.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1418
    __ empty_expression_stack();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1419
    __ unlock_if_synchronized_method(vtos, /* throw_monitor_exception */ false, /* install_monitor_exception */ false);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1420
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1421
    // Check to see whether we are returning to a deoptimized frame.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1422
    // (The PopFrame call ensures that the caller of the popped frame is
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1423
    // either interpreted or compiled and deoptimizes it if compiled.)
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1424
    // Note that we don't compare the return PC against the
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1425
    // deoptimization blob's unpack entry because of the presence of
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1426
    // adapter frames in C2.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1427
    Label Lcaller_not_deoptimized;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1428
    Register return_pc = R3_ARG1;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1429
    __ ld(return_pc, 0, R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1430
    __ ld(return_pc, _abi(lr), return_pc);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1431
    __ call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::interpreter_contains), return_pc);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1432
    __ cmpdi(CCR0, R3_RET, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1433
    __ bne(CCR0, Lcaller_not_deoptimized);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1434
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1435
    // The deoptimized case.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1436
    // In this case, we can't call dispatch_next() after the frame is
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1437
    // popped, but instead must save the incoming arguments and restore
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1438
    // them after deoptimization has occurred.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1439
    __ ld(R4_ARG2, in_bytes(Method::const_offset()), R19_method);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1440
    __ lhz(R4_ARG2 /* number of params */, in_bytes(ConstMethod::size_of_parameters_offset()), R4_ARG2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1441
    __ slwi(R4_ARG2, R4_ARG2, Interpreter::logStackElementSize);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1442
    __ addi(R5_ARG3, R18_locals, Interpreter::stackElementSize);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1443
    __ subf(R5_ARG3, R4_ARG2, R5_ARG3);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1444
    // Save these arguments.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1445
    __ call_VM_leaf(CAST_FROM_FN_PTR(address, Deoptimization::popframe_preserve_args), R16_thread, R4_ARG2, R5_ARG3);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1446
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1447
    // Inform deoptimization that it is responsible for restoring these arguments.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1448
    __ load_const_optimized(R11_scratch1, JavaThread::popframe_force_deopt_reexecution_bit);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1449
    __ stw(R11_scratch1, in_bytes(JavaThread::popframe_condition_offset()), R16_thread);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1450
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1451
    // Return from the current method into the deoptimization blob. Will eventually
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1452
    // end up in the deopt interpeter entry, deoptimization prepared everything that
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1453
    // we will reexecute the call that called us.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1454
    __ merge_frames(/*top_frame_sp*/ R21_sender_SP, /*reload return_pc*/ return_pc, R11_scratch1, R12_scratch2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1455
    __ mtlr(return_pc);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1456
    __ blr();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1457
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1458
    // The non-deoptimized case.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1459
    __ bind(Lcaller_not_deoptimized);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1460
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1461
    // Clear the popframe condition flag.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1462
    __ li(R0, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1463
    __ stw(R0, in_bytes(JavaThread::popframe_condition_offset()), R16_thread);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1464
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1465
    // Get out of the current method and re-execute the call that called us.
24349
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1466
    __ merge_frames(/*top_frame_sp*/ R21_sender_SP, /*return_pc*/ noreg, R11_scratch1, R12_scratch2);
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1467
    __ restore_interpreter_state(R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1468
    __ ld(R12_scratch2, _ijava_state_neg(top_frame_sp), R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1469
    __ resize_frame_absolute(R12_scratch2, R11_scratch1, R0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1470
    if (ProfileInterpreter) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1471
      __ set_method_data_pointer_for_bcp();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1472
    }
24349
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1473
#if INCLUDE_JVMTI
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1474
    Label L_done;
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1475
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1476
    __ lbz(R11_scratch1, 0, R14_bcp);
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1477
    __ cmpwi(CCR0, R11_scratch1, Bytecodes::_invokestatic);
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1478
    __ bne(CCR0, L_done);
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1479
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1480
    // The member name argument must be restored if _invokestatic is re-executed after a PopFrame call.
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1481
    // Detect such a case in the InterpreterRuntime function and return the member name argument, or NULL.
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1482
    __ ld(R4_ARG2, 0, R18_locals);
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1483
    __ call_VM(R11_scratch1, CAST_FROM_FN_PTR(address, InterpreterRuntime::member_name_arg_or_null),
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1484
               R4_ARG2, R19_method, R14_bcp);
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1485
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1486
    __ cmpdi(CCR0, R11_scratch1, 0);
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1487
    __ beq(CCR0, L_done);
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1488
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1489
    __ std(R11_scratch1, wordSize, R15_esp);
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1490
    __ bind(L_done);
d8f40e5b392d 8042309: Some bugfixes for the ppc64 port.
goetz
parents: 24018
diff changeset
  1491
#endif // INCLUDE_JVMTI
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1492
    __ dispatch_next(vtos);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1493
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1494
  // end of JVMTI PopFrame support
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1495
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1496
  // --------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1497
  // Remove activation exception entry.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1498
  // This is jumped to if an interpreted method can't handle an exception itself
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1499
  // (we come from the throw/rethrow exception entry above). We're going to call
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1500
  // into the VM to find the exception handler in the caller, pop the current
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1501
  // frame and return the handler we calculated.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1502
  Interpreter::_remove_activation_entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1503
  {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1504
    __ pop_ptr(Rexception);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1505
    __ verify_thread();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1506
    __ verify_oop(Rexception);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1507
    __ std(Rexception, in_bytes(JavaThread::vm_result_offset()), R16_thread);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1508
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1509
    __ unlock_if_synchronized_method(vtos, /* throw_monitor_exception */ false, true);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1510
    __ notify_method_exit(false, vtos, InterpreterMacroAssembler::SkipNotifyJVMTI, false);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1511
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1512
    __ get_vm_result(Rexception);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1513
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1514
    // We are done with this activation frame; find out where to go next.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1515
    // The continuation point will be an exception handler, which expects
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1516
    // the following registers set up:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1517
    //
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1518
    // RET:  exception oop
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1519
    // ARG2: Issuing PC (see generate_exception_blob()), only used if the caller is compiled.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1520
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1521
    Register return_pc = R31; // Needs to survive the runtime call.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1522
    __ ld(return_pc, 0, R1_SP);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1523
    __ ld(return_pc, _abi(lr), return_pc);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1524
    __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::exception_handler_for_return_address), R16_thread, return_pc);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1525
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1526
    // Remove the current activation.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1527
    __ merge_frames(/*top_frame_sp*/ R21_sender_SP, /*return_pc*/ noreg, R11_scratch1, R12_scratch2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1528
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1529
    __ mr(R4_ARG2, return_pc);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1530
    __ mtlr(R3_RET);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1531
    __ mr(R3_RET, Rexception);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1532
    __ blr();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1533
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1534
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1535
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1536
// JVMTI ForceEarlyReturn support.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1537
// Returns "in the middle" of a method with a "fake" return value.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1538
address TemplateInterpreterGenerator::generate_earlyret_entry_for(TosState state) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1539
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1540
  Register Rscratch1 = R11_scratch1,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1541
           Rscratch2 = R12_scratch2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1542
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1543
  address entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1544
  __ empty_expression_stack();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1545
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1546
  __ load_earlyret_value(state, Rscratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1547
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1548
  __ ld(Rscratch1, in_bytes(JavaThread::jvmti_thread_state_offset()), R16_thread);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1549
  // Clear the earlyret state.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1550
  __ li(R0, 0);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1551
  __ stw(R0, in_bytes(JvmtiThreadState::earlyret_state_offset()), Rscratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1552
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1553
  __ remove_activation(state, false, false);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1554
  // Copied from TemplateTable::_return.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1555
  // Restoration of lr done by remove_activation.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1556
  switch (state) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1557
    case ltos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1558
    case btos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1559
    case ctos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1560
    case stos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1561
    case atos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1562
    case itos: __ mr(R3_RET, R17_tos); break;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1563
    case ftos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1564
    case dtos: __ fmr(F1_RET, F15_ftos); break;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1565
    case vtos: // This might be a constructor. Final fields (and volatile fields on PPC64) need
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1566
               // to get visible before the reference to the object gets stored anywhere.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1567
               __ membar(Assembler::StoreStore); break;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1568
    default  : ShouldNotReachHere();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1569
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1570
  __ blr();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1571
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1572
  return entry;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1573
} // end of ForceEarlyReturn support
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1574
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1575
//-----------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1576
// Helper for vtos entry point generation
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1577
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1578
void TemplateInterpreterGenerator::set_vtos_entry_points(Template* t,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1579
                                                         address& bep,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1580
                                                         address& cep,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1581
                                                         address& sep,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1582
                                                         address& aep,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1583
                                                         address& iep,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1584
                                                         address& lep,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1585
                                                         address& fep,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1586
                                                         address& dep,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1587
                                                         address& vep) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1588
  assert(t->is_valid() && t->tos_in() == vtos, "illegal template");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1589
  Label L;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1590
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1591
  aep = __ pc();  __ push_ptr();  __ b(L);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1592
  fep = __ pc();  __ push_f();    __ b(L);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1593
  dep = __ pc();  __ push_d();    __ b(L);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1594
  lep = __ pc();  __ push_l();    __ b(L);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1595
  __ align(32, 12, 24); // align L
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1596
  bep = cep = sep =
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1597
  iep = __ pc();  __ push_i();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1598
  vep = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1599
  __ bind(L);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1600
  generate_and_dispatch(t);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1601
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1602
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1603
//-----------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1604
// Generation of individual instructions
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1605
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1606
// helpers for generate_and_dispatch
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1607
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1608
InterpreterGenerator::InterpreterGenerator(StubQueue* code)
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1609
  : TemplateInterpreterGenerator(code) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1610
  generate_all(); // Down here so it can be "virtual".
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1611
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1612
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1613
//-----------------------------------------------------------------------------
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1614
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1615
// Non-product code
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1616
#ifndef PRODUCT
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1617
address TemplateInterpreterGenerator::generate_trace_code(TosState state) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1618
  //__ flush_bundle();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1619
  address entry = __ pc();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1620
23522
217a6a90aad3 8038201: Clean up misleading usage of malloc() in init_system_properties_values()
goetz
parents: 23221
diff changeset
  1621
  const char *bname = NULL;
23221
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1622
  uint tsize = 0;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1623
  switch(state) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1624
  case ftos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1625
    bname = "trace_code_ftos {";
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1626
    tsize = 2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1627
    break;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1628
  case btos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1629
    bname = "trace_code_btos {";
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1630
    tsize = 2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1631
    break;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1632
  case ctos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1633
    bname = "trace_code_ctos {";
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1634
    tsize = 2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1635
    break;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1636
  case stos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1637
    bname = "trace_code_stos {";
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1638
    tsize = 2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1639
    break;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1640
  case itos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1641
    bname = "trace_code_itos {";
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1642
    tsize = 2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1643
    break;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1644
  case ltos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1645
    bname = "trace_code_ltos {";
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1646
    tsize = 3;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1647
    break;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1648
  case atos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1649
    bname = "trace_code_atos {";
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1650
    tsize = 2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1651
    break;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1652
  case vtos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1653
    // Note: In case of vtos, the topmost of stack value could be a int or doubl
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1654
    // In case of a double (2 slots) we won't see the 2nd stack value.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1655
    // Maybe we simply should print the topmost 3 stack slots to cope with the problem.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1656
    bname = "trace_code_vtos {";
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1657
    tsize = 2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1658
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1659
    break;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1660
  case dtos:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1661
    bname = "trace_code_dtos {";
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1662
    tsize = 3;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1663
    break;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1664
  default:
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1665
    ShouldNotReachHere();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1666
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1667
  BLOCK_COMMENT(bname);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1668
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1669
  // Support short-cut for TraceBytecodesAt.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1670
  // Don't call into the VM if we don't want to trace to speed up things.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1671
  Label Lskip_vm_call;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1672
  if (TraceBytecodesAt > 0 && TraceBytecodesAt < max_intx) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1673
    int offs1 = __ load_const_optimized(R11_scratch1, (address) &TraceBytecodesAt, R0, true);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1674
    int offs2 = __ load_const_optimized(R12_scratch2, (address) &BytecodeCounter::_counter_value, R0, true);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1675
    __ ld(R11_scratch1, offs1, R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1676
    __ lwa(R12_scratch2, offs2, R12_scratch2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1677
    __ cmpd(CCR0, R12_scratch2, R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1678
    __ blt(CCR0, Lskip_vm_call);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1679
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1680
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1681
  __ push(state);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1682
  // Load 2 topmost expression stack values.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1683
  __ ld(R6_ARG4, tsize*Interpreter::stackElementSize, R15_esp);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1684
  __ ld(R5_ARG3, Interpreter::stackElementSize, R15_esp);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1685
  __ mflr(R31);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1686
  __ call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::trace_bytecode), /* unused */ R4_ARG2, R5_ARG3, R6_ARG4, false);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1687
  __ mtlr(R31);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1688
  __ pop(state);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1689
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1690
  if (TraceBytecodesAt > 0 && TraceBytecodesAt < max_intx) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1691
    __ bind(Lskip_vm_call);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1692
  }
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1693
  __ blr();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1694
  BLOCK_COMMENT("} trace_code");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1695
  return entry;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1696
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1697
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1698
void TemplateInterpreterGenerator::count_bytecode() {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1699
  int offs = __ load_const_optimized(R11_scratch1, (address) &BytecodeCounter::_counter_value, R12_scratch2, true);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1700
  __ lwz(R12_scratch2, offs, R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1701
  __ addi(R12_scratch2, R12_scratch2, 1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1702
  __ stw(R12_scratch2, offs, R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1703
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1704
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1705
void TemplateInterpreterGenerator::histogram_bytecode(Template* t) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1706
  int offs = __ load_const_optimized(R11_scratch1, (address) &BytecodeHistogram::_counters[t->bytecode()], R12_scratch2, true);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1707
  __ lwz(R12_scratch2, offs, R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1708
  __ addi(R12_scratch2, R12_scratch2, 1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1709
  __ stw(R12_scratch2, offs, R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1710
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1711
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1712
void TemplateInterpreterGenerator::histogram_bytecode_pair(Template* t) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1713
  const Register addr = R11_scratch1,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1714
                 tmp  = R12_scratch2;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1715
  // Get index, shift out old bytecode, bring in new bytecode, and store it.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1716
  // _index = (_index >> log2_number_of_codes) |
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1717
  //          (bytecode << log2_number_of_codes);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1718
  int offs1 = __ load_const_optimized(addr, (address)&BytecodePairHistogram::_index, tmp, true);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1719
  __ lwz(tmp, offs1, addr);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1720
  __ srwi(tmp, tmp, BytecodePairHistogram::log2_number_of_codes);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1721
  __ ori(tmp, tmp, ((int) t->bytecode()) << BytecodePairHistogram::log2_number_of_codes);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1722
  __ stw(tmp, offs1, addr);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1723
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1724
  // Bump bucket contents.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1725
  // _counters[_index] ++;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1726
  int offs2 = __ load_const_optimized(addr, (address)&BytecodePairHistogram::_counters, R0, true);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1727
  __ sldi(tmp, tmp, LogBytesPerInt);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1728
  __ add(addr, tmp, addr);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1729
  __ lwz(tmp, offs2, addr);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1730
  __ addi(tmp, tmp, 1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1731
  __ stw(tmp, offs2, addr);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1732
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1733
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1734
void TemplateInterpreterGenerator::trace_bytecode(Template* t) {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1735
  // Call a little run-time stub to avoid blow-up for each bytecode.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1736
  // The run-time runtime saves the right registers, depending on
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1737
  // the tosca in-state for the given template.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1738
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1739
  assert(Interpreter::trace_code(t->tos_in()) != NULL,
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1740
         "entry must have been generated");
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1741
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1742
  // Note: we destroy LR here.
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1743
  __ bl(Interpreter::trace_code(t->tos_in()));
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1744
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1745
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1746
void TemplateInterpreterGenerator::stop_interpreter_at() {
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1747
  Label L;
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1748
  int offs1 = __ load_const_optimized(R11_scratch1, (address) &StopInterpreterAt, R0, true);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1749
  int offs2 = __ load_const_optimized(R12_scratch2, (address) &BytecodeCounter::_counter_value, R0, true);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1750
  __ ld(R11_scratch1, offs1, R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1751
  __ lwa(R12_scratch2, offs2, R12_scratch2);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1752
  __ cmpd(CCR0, R12_scratch2, R11_scratch1);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1753
  __ bne(CCR0, L);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1754
  __ illtrap();
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1755
  __ bind(L);
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1756
}
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1757
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1758
#endif // !PRODUCT
b70675ece1ce 8036976: PPC64: implement the template interpreter
goetz
parents:
diff changeset
  1759
#endif // !CC_INTERP