hotspot/src/cpu/sparc/vm/interpreter_sparc.cpp
author johnc
Thu, 07 Apr 2011 09:53:20 -0700
changeset 9176 42d9d1010f38
parent 8676 9098d4e927e1
child 9179 6db9c9dffe1f
permissions -rw-r--r--
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer. Reviewed-by: kvn, iveresov, never, tonyp, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
8676
9098d4e927e1 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 7397
diff changeset
     2
 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5416
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5416
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5416
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#include "asm/assembler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
#include "interpreter/bytecodeHistogram.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "interpreter/interpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "interpreter/interpreterGenerator.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
#include "interpreter/interpreterRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
#include "interpreter/templateTable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    32
#include "oops/arrayOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    33
#include "oops/methodDataOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    34
#include "oops/methodOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    35
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    36
#include "prims/jvmtiExport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    37
#include "prims/jvmtiThreadState.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    38
#include "prims/methodHandles.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    39
#include "runtime/arguments.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    40
#include "runtime/deoptimization.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    41
#include "runtime/frame.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    42
#include "runtime/sharedRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    43
#include "runtime/stubRoutines.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    44
#include "runtime/synchronizer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    45
#include "runtime/timer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    46
#include "runtime/vframeArray.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    47
#include "utilities/debug.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    48
#ifdef COMPILER1
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    49
#include "c1/c1_Runtime1.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    50
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
// Generation of Interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
// The InterpreterGenerator generates the interpreter into Interpreter::_code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
#define __ _masm->
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
int AbstractInterpreter::BasicType_as_index(BasicType type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  int i = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  switch (type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
    case T_BOOLEAN: i = 0; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
    case T_CHAR   : i = 1; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
    case T_BYTE   : i = 2; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
    case T_SHORT  : i = 3; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
    case T_INT    : i = 4; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
    case T_LONG   : i = 5; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
    case T_VOID   : i = 6; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
    case T_FLOAT  : i = 7; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
    case T_DOUBLE : i = 8; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
    case T_OBJECT : i = 9; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
    case T_ARRAY  : i = 9; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
    default       : ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  assert(0 <= i && i < AbstractInterpreter::number_of_result_handlers, "index out of bounds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  return i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
#ifndef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
address AbstractInterpreterGenerator::generate_slow_signature_handler() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  address entry = __ pc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  Argument argv(0, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  // We are in the jni transition frame. Save the last_java_frame corresponding to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  // outer interpreter frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  __ set_last_Java_frame(FP, noreg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  // make sure the interpreter frame we've pushed has a valid return pc
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  __ mov(O7, I7);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  __ mov(Lmethod, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  __ mov(Llocals, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  __ save_frame(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  __ mov(G2_thread, L7_thread_cache);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  __ add(argv.address_in_frame(), O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  __ mov(G2_thread, O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  __ mov(G3_scratch, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  __ call(CAST_FROM_FN_PTR(address, InterpreterRuntime::slow_signature_handler), relocInfo::runtime_call_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  __ delayed()->mov(G4_scratch, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  __ mov(L7_thread_cache, G2_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  __ reset_last_Java_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  // load the register arguments (the C code packed them as varargs)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  for (Argument ldarg = argv.successor(); ldarg.is_register(); ldarg = ldarg.successor()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
      __ ld_ptr(ldarg.address_in_frame(), ldarg.as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  __ ret();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  __ delayed()->
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
     restore(O0, 0, Lscratch);  // caller's Lscratch gets the result handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  return entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
// LP64 passes floating point arguments in F1, F3, F5, etc. instead of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
// O0, O1, O2 etc..
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
// Doubles are passed in D0, D2, D4
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
// We store the signature of the first 16 arguments in the first argument
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
// slot because it will be overwritten prior to calling the native
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
// function, with the pointer to the JNIEnv.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
// If LP64 there can be up to 16 floating point arguments in registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
// or 6 integer registers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
address AbstractInterpreterGenerator::generate_slow_signature_handler() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    non_float  = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    float_sig  = 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    double_sig = 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    sig_mask   = 3
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  address entry = __ pc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  Argument argv(0, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  // We are in the jni transition frame. Save the last_java_frame corresponding to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  // outer interpreter frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  __ set_last_Java_frame(FP, noreg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  // make sure the interpreter frame we've pushed has a valid return pc
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  __ mov(O7, I7);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  __ mov(Lmethod, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  __ mov(Llocals, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  __ save_frame(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  __ mov(G2_thread, L7_thread_cache);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  __ add(argv.address_in_frame(), O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  __ mov(G2_thread, O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  __ mov(G3_scratch, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  __ call(CAST_FROM_FN_PTR(address, InterpreterRuntime::slow_signature_handler), relocInfo::runtime_call_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  __ delayed()->mov(G4_scratch, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  __ mov(L7_thread_cache, G2_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  __ reset_last_Java_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  // load the register arguments (the C code packed them as varargs)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  Address Sig = argv.address_in_frame();        // Argument 0 holds the signature
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  __ ld_ptr( Sig, G3_scratch );                   // Get register argument signature word into G3_scratch
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  __ mov( G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  __ srl( G4_scratch, 2, G4_scratch);             // Skip Arg 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  Label done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  for (Argument ldarg = argv.successor(); ldarg.is_float_register(); ldarg = ldarg.successor()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
    Label NonFloatArg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
    Label LoadFloatArg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
    Label LoadDoubleArg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
    Label NextArg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
    Address a = ldarg.address_in_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
    __ andcc(G4_scratch, sig_mask, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
    __ br(Assembler::zero, false, Assembler::pt, NonFloatArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
    __ cmp(G3_scratch, float_sig );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
    __ br(Assembler::equal, false, Assembler::pt, LoadFloatArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
    __ cmp(G3_scratch, double_sig );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
    __ br(Assembler::equal, false, Assembler::pt, LoadDoubleArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
    __ bind(NonFloatArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
    // There are only 6 integer register arguments!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
    if ( ldarg.is_register() )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
      __ ld_ptr(ldarg.address_in_frame(), ldarg.as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
    // Optimization, see if there are any more args and get out prior to checking
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
    // all 16 float registers.  My guess is that this is rare.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
    // If is_register is false, then we are done the first six integer args.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
      __ tst(G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
      __ brx(Assembler::zero, false, Assembler::pt, done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
      __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
    __ ba(false, NextArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
    __ delayed()->srl( G4_scratch, 2, G4_scratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
    __ bind(LoadFloatArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
    __ ldf( FloatRegisterImpl::S, a, ldarg.as_float_register(), 4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
    __ ba(false, NextArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
    __ delayed()->srl( G4_scratch, 2, G4_scratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
    __ bind(LoadDoubleArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
    __ ldf( FloatRegisterImpl::D, a, ldarg.as_double_register() );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
    __ ba(false, NextArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
    __ delayed()->srl( G4_scratch, 2, G4_scratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
    __ bind(NextArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  __ ret();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  __ delayed()->
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
     restore(O0, 0, Lscratch);  // caller's Lscratch gets the result handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  return entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
void InterpreterGenerator::generate_counter_overflow(Label& Lcontinue) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  // Generate code to initiate compilation on the counter overflow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  // InterpreterRuntime::frequency_counter_overflow takes two arguments,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  // the first indicates if the counter overflow occurs at a backwards branch (NULL bcp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  // and the second is only used when the first is true.  We pass zero for both.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  // The call returns the address of the verified entry point for the method or NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  // if the compilation did not complete (either went background or bailed out).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  __ set((int)false, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), O2, O2, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  // returns verified_entry_point or NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  // we ignore it in any case
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  __ ba(false, Lcontinue);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
// End of helpers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
// Various method entries
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
// Abstract method entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
// Attempt to execute abstract method. Throw exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
address InterpreterGenerator::generate_abstract_entry(void) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  address entry = __ pc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  // abstract method entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  // throw exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  // the call_VM checks for exception, so we should never return here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  __ should_not_reach_here();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  return entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   262
// Method handle invoker
8676
9098d4e927e1 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 7397
diff changeset
   263
// Dispatch a method of the form java.lang.invoke.MethodHandles::invoke(...)
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   264
address InterpreterGenerator::generate_method_handle_entry(void) {
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   265
  if (!EnableMethodHandles) {
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   266
    return generate_abstract_entry();
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   267
  }
5416
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 4645
diff changeset
   268
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 4645
diff changeset
   269
  return MethodHandles::generate_method_handle_interpreter_entry(_masm);
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   270
}
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   271
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   272
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
// Entry points & stack frame layout
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
// Here we generate the various kind of entries into the interpreter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
// The two main entry type are generic bytecode methods and native call method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
// These both come in synchronized and non-synchronized versions but the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
// frame layout they create is very similar. The other method entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
// types are really just special purpose entries that are really entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
// and interpretation all in one. These are for trivial methods like
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
// accessor, empty, or special math methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
// When control flow reaches any of the entry types for the interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
// the following holds ->
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
// C2 Calling Conventions:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
// The entry code below assumes that the following registers are set
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
// when coming in:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
//    G5_method: holds the methodOop of the method to call
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
//    Lesp:    points to the TOS of the callers expression stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
//             after having pushed all the parameters
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
// The entry code does the following to setup an interpreter frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
//   pop parameters from the callers stack by adjusting Lesp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
//   set O0 to Lesp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
//   compute X = (max_locals - num_parameters)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
//   bump SP up by X to accomadate the extra locals
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
//   compute X = max_expression_stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
//               + vm_local_words
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
//               + 16 words of register save area
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
//   save frame doing a save sp, -X, sp growing towards lower addresses
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
//   set Lbcp, Lmethod, LcpoolCache
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
//   set Llocals to i0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
//   set Lmonitors to FP - rounded_vm_local_words
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
//   set Lesp to Lmonitors - 4
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
//  The frame has now been setup to do the rest of the entry code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
// Try this optimization:  Most method entries could live in a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
// "one size fits all" stack frame without all the dynamic size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
// calculations.  It might be profitable to do all this calculation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
// statically and approximately for "small enough" methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
//-----------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
// C1 Calling conventions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
// Upon method entry, the following registers are setup:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
// g2 G2_thread: current thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
// g5 G5_method: method to activate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
// g4 Gargs  : pointer to last argument
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
// Stack:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
// +---------------+ <--- sp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
// : reg save area :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
// +---------------+ <--- sp + 0x40
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
// : extra 7 slots :      note: these slots are not really needed for the interpreter (fix later)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
// +---------------+ <--- sp + 0x5c
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
// :     free      :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
// +---------------+ <--- Gargs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
// :   arguments   :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
// +---------------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
// AFTER FRAME HAS BEEN SETUP for method interpretation the stack looks like:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
// +---------------+ <--- sp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
// : reg save area :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
// +---------------+ <--- sp + 0x40
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
// : extra 7 slots :      note: these slots are not really needed for the interpreter (fix later)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
// +---------------+ <--- sp + 0x5c
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
// :               :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
// |               | <--- Lesp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
// +---------------+ <--- Lmonitors (fp - 0x18)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
// |   VM locals   |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
// +---------------+ <--- fp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
// : reg save area :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
// +---------------+ <--- fp + 0x40
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
// : extra 7 slots :      note: these slots are not really needed for the interpreter (fix later)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
// +---------------+ <--- fp + 0x5c
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
// :     free      :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
// +---------------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
// : nonarg locals :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
// +---------------+
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
// :   arguments   :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
// |               | <--- Llocals
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
// +---------------+ <--- Gargs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
// |               |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
address AbstractInterpreterGenerator::generate_method_entry(AbstractInterpreter::MethodKind kind) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  // determine code generation flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  bool synchronized = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  address entry_point = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  switch (kind) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
    case Interpreter::zerolocals             :                                                                             break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
    case Interpreter::zerolocals_synchronized: synchronized = true;                                                        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
    case Interpreter::native                 : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(false);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
    case Interpreter::native_synchronized    : entry_point = ((InterpreterGenerator*)this)->generate_native_entry(true);   break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
    case Interpreter::empty                  : entry_point = ((InterpreterGenerator*)this)->generate_empty_entry();        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
    case Interpreter::accessor               : entry_point = ((InterpreterGenerator*)this)->generate_accessor_entry();     break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
    case Interpreter::abstract               : entry_point = ((InterpreterGenerator*)this)->generate_abstract_entry();     break;
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   402
    case Interpreter::method_handle          : entry_point = ((InterpreterGenerator*)this)->generate_method_handle_entry(); break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
    case Interpreter::java_lang_math_sin     :                                                                             break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
    case Interpreter::java_lang_math_cos     :                                                                             break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
    case Interpreter::java_lang_math_tan     :                                                                             break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
    case Interpreter::java_lang_math_sqrt    :                                                                             break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
    case Interpreter::java_lang_math_abs     :                                                                             break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
    case Interpreter::java_lang_math_log     :                                                                             break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
    case Interpreter::java_lang_math_log10   :                                                                             break;
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
   410
    case Interpreter::java_lang_ref_reference_get
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
   411
                                             : entry_point = ((InterpreterGenerator*)this)->generate_Reference_get_entry(); break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
    default                                  : ShouldNotReachHere();                                                       break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  if (entry_point) return entry_point;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  return ((InterpreterGenerator*)this)->generate_normal_entry(synchronized);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
4645
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 2534
diff changeset
   421
bool AbstractInterpreter::can_be_compiled(methodHandle m) {
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 2534
diff changeset
   422
  // No special entry points that preclude compilation
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 2534
diff changeset
   423
  return true;
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 2534
diff changeset
   424
}
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 2534
diff changeset
   425
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
// This method tells the deoptimizer how big an interpreted frame must be:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
int AbstractInterpreter::size_activation(methodOop method,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
                                         int tempcount,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
                                         int popframe_extra_args,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
                                         int moncount,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
                                         int callee_param_count,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
                                         int callee_locals,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
                                         bool is_top_frame) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  return layout_activation(method,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
                           tempcount,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
                           popframe_extra_args,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
                           moncount,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
                           callee_param_count,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
                           callee_locals,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
                           (frame*)NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
                           (frame*)NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
                           is_top_frame);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
void Deoptimization::unwind_callee_save_values(frame* f, vframeArray* vframe_array) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  // This code is sort of the equivalent of C2IAdapter::setup_stack_frame back in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  // the days we had adapter frames. When we deoptimize a situation where a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  // compiled caller calls a compiled caller will have registers it expects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  // to survive the call to the callee. If we deoptimize the callee the only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  // way we can restore these registers is to have the oldest interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  // frame that we create restore these values. That is what this routine
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  // will accomplish.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  // At the moment we have modified c2 to not have any callee save registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  // so this problem does not exist and this routine is just a place holder.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  assert(f->is_interpreted_frame(), "must be interpreted");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
// Exceptions