hotspot/src/cpu/sparc/vm/interpreter_sparc.cpp
author coleenp
Tue, 12 Aug 2014 10:48:55 -0400
changeset 25950 b5c40ed1d349
parent 25715 d5a8dbdc5150
child 33070 54f3f085b165
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:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
25715
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 14631
diff changeset
     2
 * Copyright (c) 1997, 2014, 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"
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents: 13728
diff changeset
    26
#include "asm/macroAssembler.hpp"
7397
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"
25715
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 14631
diff changeset
    31
#include "interpreter/interp_masm.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    32
#include "interpreter/templateTable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    33
#include "oops/arrayOop.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    34
#include "oops/methodData.hpp"
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    35
#include "oops/method.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    36
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    37
#include "prims/jvmtiExport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    38
#include "prims/jvmtiThreadState.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    39
#include "prims/methodHandles.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    40
#include "runtime/arguments.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    41
#include "runtime/deoptimization.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    42
#include "runtime/frame.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    43
#include "runtime/sharedRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    44
#include "runtime/stubRoutines.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    45
#include "runtime/synchronizer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    46
#include "runtime/timer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    47
#include "runtime/vframeArray.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    48
#include "utilities/debug.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    49
#ifdef COMPILER1
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    50
#include "c1/c1_Runtime1.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    51
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
// Generation of Interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
// The InterpreterGenerator generates the interpreter into Interpreter::_code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
#define __ _masm->
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
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
int AbstractInterpreter::BasicType_as_index(BasicType type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  int i = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  switch (type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
    case T_BOOLEAN: i = 0; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
    case T_CHAR   : i = 1; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
    case T_BYTE   : i = 2; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
    case T_SHORT  : i = 3; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
    case T_INT    : i = 4; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
    case T_LONG   : i = 5; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
    case T_VOID   : i = 6; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
    case T_FLOAT  : i = 7; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
    case T_DOUBLE : i = 8; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
    case T_OBJECT : i = 9; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
    case T_ARRAY  : i = 9; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
    default       : ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  assert(0 <= i && i < AbstractInterpreter::number_of_result_handlers, "index out of bounds");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  return i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
#ifndef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
address AbstractInterpreterGenerator::generate_slow_signature_handler() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  address entry = __ pc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  Argument argv(0, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  // We are in the jni transition frame. Save the last_java_frame corresponding to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  // outer interpreter frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  __ set_last_Java_frame(FP, noreg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  // make sure the interpreter frame we've pushed has a valid return pc
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  __ mov(O7, I7);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  __ mov(Lmethod, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  __ mov(Llocals, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  __ save_frame(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  __ mov(G2_thread, L7_thread_cache);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  __ add(argv.address_in_frame(), O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  __ mov(G2_thread, O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  __ mov(G3_scratch, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  __ call(CAST_FROM_FN_PTR(address, InterpreterRuntime::slow_signature_handler), relocInfo::runtime_call_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  __ delayed()->mov(G4_scratch, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  __ mov(L7_thread_cache, G2_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  __ reset_last_Java_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  // load the register arguments (the C code packed them as varargs)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  for (Argument ldarg = argv.successor(); ldarg.is_register(); ldarg = ldarg.successor()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
      __ ld_ptr(ldarg.address_in_frame(), ldarg.as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  __ ret();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  __ delayed()->
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
     restore(O0, 0, Lscratch);  // caller's Lscratch gets the result handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  return entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
// LP64 passes floating point arguments in F1, F3, F5, etc. instead of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
// O0, O1, O2 etc..
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
// Doubles are passed in D0, D2, D4
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
// We store the signature of the first 16 arguments in the first argument
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
// slot because it will be overwritten prior to calling the native
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
// function, with the pointer to the JNIEnv.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
// If LP64 there can be up to 16 floating point arguments in registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
// or 6 integer registers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
address AbstractInterpreterGenerator::generate_slow_signature_handler() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    non_float  = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    float_sig  = 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    double_sig = 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    sig_mask   = 3
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  address entry = __ pc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  Argument argv(0, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  // We are in the jni transition frame. Save the last_java_frame corresponding to the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  // outer interpreter frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  __ set_last_Java_frame(FP, noreg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  // make sure the interpreter frame we've pushed has a valid return pc
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  __ mov(O7, I7);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  __ mov(Lmethod, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  __ mov(Llocals, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  __ save_frame(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  __ mov(G2_thread, L7_thread_cache);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  __ add(argv.address_in_frame(), O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  __ mov(G2_thread, O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  __ mov(G3_scratch, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  __ call(CAST_FROM_FN_PTR(address, InterpreterRuntime::slow_signature_handler), relocInfo::runtime_call_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  __ delayed()->mov(G4_scratch, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  __ mov(L7_thread_cache, G2_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  __ reset_last_Java_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  // load the register arguments (the C code packed them as varargs)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  Address Sig = argv.address_in_frame();        // Argument 0 holds the signature
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  __ ld_ptr( Sig, G3_scratch );                   // Get register argument signature word into G3_scratch
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  __ mov( G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  __ srl( G4_scratch, 2, G4_scratch);             // Skip Arg 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  Label done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  for (Argument ldarg = argv.successor(); ldarg.is_float_register(); ldarg = ldarg.successor()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
    Label NonFloatArg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
    Label LoadFloatArg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
    Label LoadDoubleArg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
    Label NextArg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
    Address a = ldarg.address_in_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
    __ andcc(G4_scratch, sig_mask, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
    __ br(Assembler::zero, false, Assembler::pt, NonFloatArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
    __ cmp(G3_scratch, float_sig );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
    __ br(Assembler::equal, false, Assembler::pt, LoadFloatArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
    __ cmp(G3_scratch, double_sig );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
    __ br(Assembler::equal, false, Assembler::pt, LoadDoubleArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
    __ bind(NonFloatArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
    // There are only 6 integer register arguments!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
    if ( ldarg.is_register() )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
      __ ld_ptr(ldarg.address_in_frame(), ldarg.as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
    // Optimization, see if there are any more args and get out prior to checking
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
    // all 16 float registers.  My guess is that this is rare.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
    // If is_register is false, then we are done the first six integer args.
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 9636
diff changeset
   195
      __ br_null_short(G4_scratch, Assembler::pt, done);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
    }
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 9636
diff changeset
   197
    __ ba(NextArg);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
    __ delayed()->srl( G4_scratch, 2, G4_scratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
    __ bind(LoadFloatArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
    __ ldf( FloatRegisterImpl::S, a, ldarg.as_float_register(), 4);
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 9636
diff changeset
   202
    __ ba(NextArg);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
    __ delayed()->srl( G4_scratch, 2, G4_scratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
    __ bind(LoadDoubleArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
    __ ldf( FloatRegisterImpl::D, a, ldarg.as_double_register() );
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 9636
diff changeset
   207
    __ ba(NextArg);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
    __ delayed()->srl( G4_scratch, 2, G4_scratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
    __ bind(NextArg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  __ ret();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  __ delayed()->
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
     restore(O0, 0, Lscratch);  // caller's Lscratch gets the result handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  return entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
void InterpreterGenerator::generate_counter_overflow(Label& Lcontinue) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  // Generate code to initiate compilation on the counter overflow.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  // InterpreterRuntime::frequency_counter_overflow takes two arguments,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  // the first indicates if the counter overflow occurs at a backwards branch (NULL bcp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  // and the second is only used when the first is true.  We pass zero for both.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  // The call returns the address of the verified entry point for the method or NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  // if the compilation did not complete (either went background or bailed out).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  __ set((int)false, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), O2, O2, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  // returns verified_entry_point or NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  // we ignore it in any case
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 9636
diff changeset
   235
  __ ba_short(Lcontinue);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
// End of helpers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
// Various method entries
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
25950
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   244
address InterpreterGenerator::generate_jump_to_normal_entry(void) {
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   245
  address entry = __ pc();
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   246
  assert(Interpreter::entry_for_kind(Interpreter::zerolocals) != NULL, "should already be generated");
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   247
  AddressLiteral al(Interpreter::entry_for_kind(Interpreter::zerolocals));
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   248
  __ jump_to(al, G3_scratch);
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   249
  __ delayed()->nop();
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   250
  return entry;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   251
}
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   252
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
// Abstract method entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
// Attempt to execute abstract method. Throw exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
address InterpreterGenerator::generate_abstract_entry(void) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  address entry = __ pc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  // abstract method entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  // throw exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  // the call_VM checks for exception, so we should never return here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  __ should_not_reach_here();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  return entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
4645
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 2534
diff changeset
   267
bool AbstractInterpreter::can_be_compiled(methodHandle m) {
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 2534
diff changeset
   268
  // No special entry points that preclude compilation
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 2534
diff changeset
   269
  return true;
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 2534
diff changeset
   270
}
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 2534
diff changeset
   271
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
void Deoptimization::unwind_callee_save_values(frame* f, vframeArray* vframe_array) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  // This code is sort of the equivalent of C2IAdapter::setup_stack_frame back in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  // the days we had adapter frames. When we deoptimize a situation where a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  // compiled caller calls a compiled caller will have registers it expects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  // to survive the call to the callee. If we deoptimize the callee the only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  // way we can restore these registers is to have the oldest interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  // frame that we create restore these values. That is what this routine
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  // will accomplish.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  // At the moment we have modified c2 to not have any callee save registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  // so this problem does not exist and this routine is just a place holder.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  assert(f->is_interpreted_frame(), "must be interpreted");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
// Exceptions