hotspot/src/cpu/sparc/vm/templateTable_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
/*
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
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: 5419
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5419
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: 5419
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: 7114
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7114
diff changeset
    26
#include "interpreter/interpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7114
diff changeset
    27
#include "interpreter/interpreterRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7114
diff changeset
    28
#include "interpreter/templateTable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7114
diff changeset
    29
#include "memory/universe.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7114
diff changeset
    30
#include "oops/methodDataOop.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7114
diff changeset
    31
#include "oops/objArrayKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7114
diff changeset
    32
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7114
diff changeset
    33
#include "prims/methodHandles.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7114
diff changeset
    34
#include "runtime/sharedRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7114
diff changeset
    35
#include "runtime/stubRoutines.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7114
diff changeset
    36
#include "runtime/synchronizer.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
#ifndef CC_INTERP
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
#define __ _masm->
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    41
// Misc helpers
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    42
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    43
// Do an oop store like *(base + index + offset) = val
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    44
// index can be noreg,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    45
static void do_oop_store(InterpreterMacroAssembler* _masm,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    46
                         Register base,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    47
                         Register index,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    48
                         int offset,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    49
                         Register val,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    50
                         Register tmp,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    51
                         BarrierSet::Name barrier,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    52
                         bool precise) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    53
  assert(tmp != val && tmp != base && tmp != index, "register collision");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    54
  assert(index == noreg || offset == 0, "only one offset");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    55
  switch (barrier) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    56
#ifndef SERIALGC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    57
    case BarrierSet::G1SATBCT:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    58
    case BarrierSet::G1SATBCTLogging:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    59
      {
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
    60
        // Load and record the previous value.
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
    61
        __ g1_write_barrier_pre(base, index, offset,
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
    62
                                noreg /* pre_val */,
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
    63
                                tmp, true /*preserve_o_regs*/);
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
    64
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    65
        if (index == noreg ) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    66
          assert(Assembler::is_simm13(offset), "fix this code");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    67
          __ store_heap_oop(val, base, offset);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    68
        } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    69
          __ store_heap_oop(val, base, index);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    70
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    71
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    72
        // No need for post barrier if storing NULL
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    73
        if (val != G0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    74
          if (precise) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    75
            if (index == noreg) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    76
              __ add(base, offset, base);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    77
            } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    78
              __ add(base, index, base);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    79
            }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    80
          }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    81
          __ g1_write_barrier_post(base, val, tmp);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    82
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    83
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    84
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    85
#endif // SERIALGC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    86
    case BarrierSet::CardTableModRef:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    87
    case BarrierSet::CardTableExtension:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    88
      {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    89
        if (index == noreg ) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    90
          assert(Assembler::is_simm13(offset), "fix this code");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    91
          __ store_heap_oop(val, base, offset);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    92
        } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    93
          __ store_heap_oop(val, base, index);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    94
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    95
        // No need for post barrier if storing NULL
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    96
        if (val != G0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    97
          if (precise) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    98
            if (index == noreg) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
    99
              __ add(base, offset, base);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   100
            } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   101
              __ add(base, index, base);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   102
            }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   103
          }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   104
          __ card_write_barrier_post(base, val, tmp);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   105
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   106
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   107
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   108
    case BarrierSet::ModRef:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   109
    case BarrierSet::Other:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   110
      ShouldNotReachHere();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   111
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   112
    default      :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   113
      ShouldNotReachHere();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   114
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   115
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   116
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   117
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
// Platform-dependent initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
void TemplateTable::pd_initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  // (none)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
// Condition conversion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
Assembler::Condition ccNot(TemplateTable::Condition cc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  switch (cc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    case TemplateTable::equal        : return Assembler::notEqual;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    case TemplateTable::not_equal    : return Assembler::equal;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
    case TemplateTable::less         : return Assembler::greaterEqual;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    case TemplateTable::less_equal   : return Assembler::greater;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    case TemplateTable::greater      : return Assembler::lessEqual;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    case TemplateTable::greater_equal: return Assembler::less;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  return Assembler::zero;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
// Miscelaneous helper routines
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
Address TemplateTable::at_bcp(int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
   148
  return Address(Lbcp, offset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register Rbyte_code,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
                                   Register Rscratch,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
                                   bool load_bc_into_scratch /*=true*/) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  // With sharing on, may need to test methodOop flag.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  if (!RewriteBytecodes) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  if (load_bc_into_scratch) __ set(bc, Rbyte_code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  Label patch_done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  if (JvmtiExport::can_post_breakpoint()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
    Label fast_patch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
    __ ldub(at_bcp(0), Rscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
    __ cmp(Rscratch, Bytecodes::_breakpoint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
    __ br(Assembler::notEqual, false, Assembler::pt, fast_patch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
    __ delayed()->nop();  // don't bother to hoist the stb here
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
    // perform the quickening, slowly, in the bowels of the breakpoint table
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
    __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::set_original_bytecode_at), Lmethod, Lbcp, Rbyte_code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
    __ ba(false, patch_done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
    __ bind(fast_patch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  Bytecodes::Code orig_bytecode =  Bytecodes::java_code(bc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  Label okay;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  __ ldub(at_bcp(0), Rscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  __ cmp(Rscratch, orig_bytecode);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  __ br(Assembler::equal, false, Assembler::pt, okay);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  __ delayed() ->cmp(Rscratch, Rbyte_code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  __ br(Assembler::equal, false, Assembler::pt, okay);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  __ stop("Rewriting wrong bytecode location");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  __ bind(okay);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  __ stb(Rbyte_code, at_bcp(0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  __ bind(patch_done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
// Individual instructions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
void TemplateTable::nop() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  // nothing to do
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
void TemplateTable::shouldnotreachhere() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  __ stop("shouldnotreachhere bytecode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
void TemplateTable::aconst_null() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  transition(vtos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  __ clr(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
void TemplateTable::iconst(int value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  __ set(value, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
void TemplateTable::lconst(int value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  transition(vtos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  assert(value >= 0, "check this code");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  __ set(value, Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  __ set(value, Otos_l2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  __ clr( Otos_l1);
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
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
void TemplateTable::fconst(int value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  transition(vtos, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  static float zero = 0.0, one = 1.0, two = 2.0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  float* p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  switch( value ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
   default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
   case 0:  p = &zero;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
   case 1:  p = &one;   break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
   case 2:  p = &two;   break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  }
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
   234
  AddressLiteral a(p);
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
   235
  __ sethi(a, G3_scratch);
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
   236
  __ ldf(FloatRegisterImpl::S, G3_scratch, a.low10(), Ftos_f);
1
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
void TemplateTable::dconst(int value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  transition(vtos, dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  static double zero = 0.0, one = 1.0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  double* p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  switch( value ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
   default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
   case 0:  p = &zero;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
   case 1:  p = &one;   break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  }
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
   249
  AddressLiteral a(p);
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
   250
  __ sethi(a, G3_scratch);
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
   251
  __ ldf(FloatRegisterImpl::D, G3_scratch, a.low10(), Ftos_d);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
// %%%%% Should factore most snippet templates across platforms
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
void TemplateTable::bipush() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  __ ldsb( at_bcp(1), Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
void TemplateTable::sipush() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  __ get_2_byte_integer_at_bcp(1, G3_scratch, Otos_i, InterpreterMacroAssembler::Signed);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
void TemplateTable::ldc(bool wide) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  Label call_ldc, notInt, notString, notClass, exit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  if (wide) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
    __ get_2_byte_integer_at_bcp(1, G3_scratch, O1, InterpreterMacroAssembler::Unsigned);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
    __ ldub(Lbcp, 1, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  __ get_cpool_and_tags(O0, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  const int base_offset = constantPoolOopDesc::header_size() * wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  // get type from tags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  __ add(O2, tags_offset, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  __ ldub(O2, O1, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  __ cmp(O2, JVM_CONSTANT_UnresolvedString);    // unresolved string? If so, must resolve
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  __ brx(Assembler::equal, true, Assembler::pt, call_ldc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  __ cmp(O2, JVM_CONSTANT_UnresolvedClass);     // unresolved class? If so, must resolve
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  __ brx(Assembler::equal, true, Assembler::pt, call_ldc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  __ cmp(O2, JVM_CONSTANT_UnresolvedClassInError);     // unresolved class in error state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  __ brx(Assembler::equal, true, Assembler::pn, call_ldc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  __ cmp(O2, JVM_CONSTANT_Class);      // need to call vm to get java mirror of the class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  __ brx(Assembler::notEqual, true, Assembler::pt, notClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  __ delayed()->add(O0, base_offset, O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  __ bind(call_ldc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  __ set(wide, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::ldc), O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  __ push(atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  __ ba(false, exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  __ bind(notClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
 // __ add(O0, base_offset, O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  __ sll(O1, LogBytesPerWord, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  __ cmp(O2, JVM_CONSTANT_Integer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  __ brx(Assembler::notEqual, true, Assembler::pt, notInt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  __ delayed()->cmp(O2, JVM_CONSTANT_String);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  __ ld(O0, O1, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  __ push(itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  __ ba(false, exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  __ bind(notInt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
 // __ cmp(O2, JVM_CONSTANT_String);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  __ brx(Assembler::notEqual, true, Assembler::pt, notString);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  __ delayed()->ldf(FloatRegisterImpl::S, O0, O1, Ftos_f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  __ ld_ptr(O0, O1, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  __ verify_oop(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  __ push(atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  __ ba(false, exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  __ bind(notString);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
 // __ ldf(FloatRegisterImpl::S, O0, O1, Ftos_f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  __ push(ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  __ bind(exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   335
// Fast path for caching oop constants.
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   336
// %%% We should use this to handle Class and String constants also.
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   337
// %%% It will simplify the ldc/primitive path considerably.
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   338
void TemplateTable::fast_aldc(bool wide) {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   339
  transition(vtos, atos);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   340
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   341
  if (!EnableMethodHandles) {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   342
    // We should not encounter this bytecode if !EnableMethodHandles.
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   343
    // The verifier will stop it.  However, if we get past the verifier,
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   344
    // this will stop the thread in a reasonable way, without crashing the JVM.
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   345
    __ call_VM(noreg, CAST_FROM_FN_PTR(address,
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   346
                     InterpreterRuntime::throw_IncompatibleClassChangeError));
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   347
    // the call_VM checks for exception, so we should never return here.
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   348
    __ should_not_reach_here();
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   349
    return;
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   350
  }
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   351
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   352
  Register Rcache = G3_scratch;
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   353
  Register Rscratch = G4_scratch;
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   354
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   355
  resolve_cache_and_index(f1_oop, Otos_i, Rcache, Rscratch, wide ? sizeof(u2) : sizeof(u1));
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   356
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   357
  __ verify_oop(Otos_i);
7114
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   358
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   359
  Label L_done;
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   360
  const Register Rcon_klass = G3_scratch;  // same as Rcache
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   361
  const Register Rarray_klass = G4_scratch;  // same as Rscratch
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   362
  __ load_klass(Otos_i, Rcon_klass);
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   363
  AddressLiteral array_klass_addr((address)Universe::systemObjArrayKlassObj_addr());
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   364
  __ load_contents(array_klass_addr, Rarray_klass);
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   365
  __ cmp(Rarray_klass, Rcon_klass);
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   366
  __ brx(Assembler::notEqual, false, Assembler::pt, L_done);
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   367
  __ delayed()->nop();
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   368
  __ ld(Address(Otos_i, arrayOopDesc::length_offset_in_bytes()), Rcon_klass);
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   369
  __ tst(Rcon_klass);
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   370
  __ brx(Assembler::zero, true, Assembler::pt, L_done);
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   371
  __ delayed()->clr(Otos_i);    // executed only if branch is taken
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   372
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   373
  // Load the exception from the system-array which wraps it:
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   374
  __ load_heap_oop(Otos_i, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Otos_i);
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   375
  __ throw_if_not_x(Assembler::never, Interpreter::throw_exception_entry(), G3_scratch);
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   376
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   377
  __ bind(L_done);
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   378
}
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   379
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
void TemplateTable::ldc2_w() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  Label retry, resolved, Long, exit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  __ bind(retry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  __ get_2_byte_integer_at_bcp(1, G3_scratch, O1, InterpreterMacroAssembler::Unsigned);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  __ get_cpool_and_tags(O0, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  const int base_offset = constantPoolOopDesc::header_size() * wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  // get type from tags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  __ add(O2, tags_offset, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  __ ldub(O2, O1, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  __ sll(O1, LogBytesPerWord, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  __ add(O0, O1, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  __ cmp(O2, JVM_CONSTANT_Double);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  __ brx(Assembler::notEqual, false, Assembler::pt, Long);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  // A double can be placed at word-aligned locations in the constant pool.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  // Check out Conversions.java for an example.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  // Also constantPoolOopDesc::header_size() is 20, which makes it very difficult
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  // to double-align double on the constant pool.  SG, 11/7/97
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  __ ldf(FloatRegisterImpl::D, G3_scratch, base_offset, Ftos_d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  FloatRegister f = Ftos_d;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  __ ldf(FloatRegisterImpl::S, G3_scratch, base_offset, f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  __ ldf(FloatRegisterImpl::S, G3_scratch, base_offset + sizeof(jdouble)/2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
         f->successor());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  __ push(dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  __ ba(false, exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  __ bind(Long);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  __ ldx(G3_scratch, base_offset, Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  __ ld(G3_scratch, base_offset, Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  __ ld(G3_scratch, base_offset + sizeof(jlong)/2, Otos_l->successor());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  __ push(ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  __ bind(exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
void TemplateTable::locals_index(Register reg, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  __ ldub( at_bcp(offset), reg );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
void TemplateTable::locals_index_wide(Register reg) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  // offset is 2, not 1, because Lbcp points to wide prefix code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  __ get_2_byte_integer_at_bcp(2, G4_scratch, reg, InterpreterMacroAssembler::Unsigned);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
void TemplateTable::iload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  // Rewrite iload,iload  pair into fast_iload2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  //         iload,caload pair into fast_icaload
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  if (RewriteFrequentPairs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
    Label rewrite, done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
    // get next byte
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
    __ ldub(at_bcp(Bytecodes::length_for(Bytecodes::_iload)), G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
    // if _iload, wait to rewrite to iload2.  We only want to rewrite the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
    // last two iloads in a pair.  Comparing against fast_iload means that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
    // the next bytecode is neither an iload or a caload, and therefore
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
    // an iload pair.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
    __ cmp(G3_scratch, (int)Bytecodes::_iload);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
    __ br(Assembler::equal, false, Assembler::pn, done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
    __ cmp(G3_scratch, (int)Bytecodes::_fast_iload);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
    __ br(Assembler::equal, false, Assembler::pn, rewrite);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
    __ delayed()->set(Bytecodes::_fast_iload2, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
    __ cmp(G3_scratch, (int)Bytecodes::_caload);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
    __ br(Assembler::equal, false, Assembler::pn, rewrite);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
    __ delayed()->set(Bytecodes::_fast_icaload, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
    __ set(Bytecodes::_fast_iload, G4_scratch);  // don't check again
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
    // rewrite
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
    // G4_scratch: fast bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
    __ bind(rewrite);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
    patch_bytecode(Bytecodes::_iload, G4_scratch, G3_scratch, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
    __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  // Get the local value into tos
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  locals_index(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  __ access_local_int( G3_scratch, Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
void TemplateTable::fast_iload2() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  locals_index(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  __ access_local_int( G3_scratch, Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  __ push_i();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
  locals_index(G3_scratch, 3);  // get next bytecode's local index.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  __ access_local_int( G3_scratch, Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
void TemplateTable::fast_iload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  locals_index(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  __ access_local_int( G3_scratch, Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
void TemplateTable::lload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  transition(vtos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
  locals_index(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  __ access_local_long( G3_scratch, Otos_l );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
void TemplateTable::fload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  transition(vtos, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  locals_index(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  __ access_local_float( G3_scratch, Ftos_f );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
void TemplateTable::dload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  transition(vtos, dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  locals_index(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
  __ access_local_double( G3_scratch, Ftos_d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
void TemplateTable::aload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  transition(vtos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  locals_index(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  __ access_local_ptr( G3_scratch, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
void TemplateTable::wide_iload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  locals_index_wide(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  __ access_local_int( G3_scratch, Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
void TemplateTable::wide_lload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  transition(vtos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  locals_index_wide(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  __ access_local_long( G3_scratch, Otos_l );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
void TemplateTable::wide_fload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  transition(vtos, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  locals_index_wide(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  __ access_local_float( G3_scratch, Ftos_f );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
void TemplateTable::wide_dload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  transition(vtos, dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  locals_index_wide(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  __ access_local_double( G3_scratch, Ftos_d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
void TemplateTable::wide_aload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  transition(vtos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  locals_index_wide(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  __ access_local_ptr( G3_scratch, Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  __ verify_oop(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
void TemplateTable::iaload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  // Otos_i: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  // tos: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  __ index_check(O2, Otos_i, LogBytesPerInt, G3_scratch, O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  __ ld(O3, arrayOopDesc::base_offset_in_bytes(T_INT), Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
void TemplateTable::laload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  transition(itos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  // Otos_i: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  // O2: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
  __ index_check(O2, Otos_i, LogBytesPerLong, G3_scratch, O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  __ ld_long(O3, arrayOopDesc::base_offset_in_bytes(T_LONG), Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
void TemplateTable::faload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  transition(itos, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  // Otos_i: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  // O2: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
  __ index_check(O2, Otos_i, LogBytesPerInt, G3_scratch, O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  __ ldf(FloatRegisterImpl::S, O3, arrayOopDesc::base_offset_in_bytes(T_FLOAT), Ftos_f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
void TemplateTable::daload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  transition(itos, dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  // Otos_i: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  // O2: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
  __ index_check(O2, Otos_i, LogBytesPerLong, G3_scratch, O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  __ ldf(FloatRegisterImpl::D, O3, arrayOopDesc::base_offset_in_bytes(T_DOUBLE), Ftos_d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
void TemplateTable::aaload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
  transition(itos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  // Otos_i: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  // tos: array
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   597
  __ index_check(O2, Otos_i, UseCompressedOops ? 2 : LogBytesPerWord, G3_scratch, O3);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   598
  __ load_heap_oop(O3, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Otos_i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
  __ verify_oop(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
void TemplateTable::baload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
  // Otos_i: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  // tos: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
  __ index_check(O2, Otos_i, 0, G3_scratch, O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  __ ldsb(O3, arrayOopDesc::base_offset_in_bytes(T_BYTE), Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
void TemplateTable::caload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
  // Otos_i: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  // tos: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
  __ index_check(O2, Otos_i, LogBytesPerShort, G3_scratch, O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  __ lduh(O3, arrayOopDesc::base_offset_in_bytes(T_CHAR), Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
void TemplateTable::fast_icaload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
  // Otos_i: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  // tos: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
  locals_index(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  __ access_local_int( G3_scratch, Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  __ index_check(O2, Otos_i, LogBytesPerShort, G3_scratch, O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  __ lduh(O3, arrayOopDesc::base_offset_in_bytes(T_CHAR), Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
void TemplateTable::saload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
  // Otos_i: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
  // tos: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
  __ index_check(O2, Otos_i, LogBytesPerShort, G3_scratch, O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
  __ ldsh(O3, arrayOopDesc::base_offset_in_bytes(T_SHORT), Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
void TemplateTable::iload(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
  __ ld( Llocals, Interpreter::local_offset_in_bytes(n), Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
void TemplateTable::lload(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
  transition(vtos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  assert(n+1 < Argument::n_register_parameters, "would need more code");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  __ load_unaligned_long(Llocals, Interpreter::local_offset_in_bytes(n+1), Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
void TemplateTable::fload(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  transition(vtos, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
  assert(n < Argument::n_register_parameters, "would need more code");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
  __ ldf( FloatRegisterImpl::S, Llocals, Interpreter::local_offset_in_bytes(n),     Ftos_f );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
void TemplateTable::dload(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
  transition(vtos, dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
  FloatRegister dst = Ftos_d;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  __ load_unaligned_double(Llocals, Interpreter::local_offset_in_bytes(n+1), dst);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
void TemplateTable::aload(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
  transition(vtos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  __ ld_ptr( Llocals, Interpreter::local_offset_in_bytes(n), Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
void TemplateTable::aload_0() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
  transition(vtos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
  // According to bytecode histograms, the pairs:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  // _aload_0, _fast_igetfield (itos)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
  // _aload_0, _fast_agetfield (atos)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
  // _aload_0, _fast_fgetfield (ftos)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  // occur frequently. If RewriteFrequentPairs is set, the (slow) _aload_0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
  // bytecode checks the next bytecode and then rewrites the current
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
  // bytecode into a pair bytecode; otherwise it rewrites the current
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  // bytecode into _fast_aload_0 that doesn't do the pair check anymore.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
  if (RewriteFrequentPairs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
    Label rewrite, done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
    // get next byte
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
    __ ldub(at_bcp(Bytecodes::length_for(Bytecodes::_aload_0)), G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
    // do actual aload_0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
    aload(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
    // if _getfield then wait with rewrite
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
    __ cmp(G3_scratch, (int)Bytecodes::_getfield);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
    __ br(Assembler::equal, false, Assembler::pn, done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
    // if _igetfield then rewrite to _fast_iaccess_0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
    assert(Bytecodes::java_code(Bytecodes::_fast_iaccess_0) == Bytecodes::_aload_0, "adjust fast bytecode def");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
    __ cmp(G3_scratch, (int)Bytecodes::_fast_igetfield);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
    __ br(Assembler::equal, false, Assembler::pn, rewrite);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
    __ delayed()->set(Bytecodes::_fast_iaccess_0, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
    // if _agetfield then rewrite to _fast_aaccess_0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
    assert(Bytecodes::java_code(Bytecodes::_fast_aaccess_0) == Bytecodes::_aload_0, "adjust fast bytecode def");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
    __ cmp(G3_scratch, (int)Bytecodes::_fast_agetfield);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
    __ br(Assembler::equal, false, Assembler::pn, rewrite);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
    __ delayed()->set(Bytecodes::_fast_aaccess_0, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
    // if _fgetfield then rewrite to _fast_faccess_0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
    assert(Bytecodes::java_code(Bytecodes::_fast_faccess_0) == Bytecodes::_aload_0, "adjust fast bytecode def");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
    __ cmp(G3_scratch, (int)Bytecodes::_fast_fgetfield);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
    __ br(Assembler::equal, false, Assembler::pn, rewrite);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
    __ delayed()->set(Bytecodes::_fast_faccess_0, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
    // else rewrite to _fast_aload0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
    assert(Bytecodes::java_code(Bytecodes::_fast_aload_0) == Bytecodes::_aload_0, "adjust fast bytecode def");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
    __ set(Bytecodes::_fast_aload_0, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
    // rewrite
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
    // G4_scratch: fast bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
    __ bind(rewrite);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
    patch_bytecode(Bytecodes::_aload_0, G4_scratch, G3_scratch, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
    __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
    aload(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
void TemplateTable::istore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
  locals_index(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
  __ store_local_int( G3_scratch, Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
void TemplateTable::lstore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
  transition(ltos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
  locals_index(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
  __ store_local_long( G3_scratch, Otos_l );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
void TemplateTable::fstore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  transition(ftos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
  locals_index(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
  __ store_local_float( G3_scratch, Ftos_f );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
void TemplateTable::dstore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
  transition(dtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
  locals_index(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
  __ store_local_double( G3_scratch, Ftos_d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
void TemplateTable::astore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
  transition(vtos, vtos);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   764
  __ load_ptr(0, Otos_i);
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   765
  __ inc(Lesp, Interpreter::stackElementSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
  __ verify_oop_or_return_address(Otos_i, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  locals_index(G3_scratch);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   768
  __ store_local_ptr(G3_scratch, Otos_i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
void TemplateTable::wide_istore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  __ pop_i();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
  locals_index_wide(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
  __ store_local_int( G3_scratch, Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
void TemplateTable::wide_lstore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
  __ pop_l();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
  locals_index_wide(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
  __ store_local_long( G3_scratch, Otos_l );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
void TemplateTable::wide_fstore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
  __ pop_f();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
  locals_index_wide(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
  __ store_local_float( G3_scratch, Ftos_f );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
void TemplateTable::wide_dstore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  __ pop_d();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
  locals_index_wide(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  __ store_local_double( G3_scratch, Ftos_d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
void TemplateTable::wide_astore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
  transition(vtos, vtos);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   806
  __ load_ptr(0, Otos_i);
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   807
  __ inc(Lesp, Interpreter::stackElementSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
  __ verify_oop_or_return_address(Otos_i, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
  locals_index_wide(G3_scratch);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   810
  __ store_local_ptr(G3_scratch, Otos_i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
void TemplateTable::iastore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
  __ pop_i(O2); // index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  // Otos_i: val
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  // O3: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  __ index_check(O3, O2, LogBytesPerInt, G3_scratch, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
  __ st(Otos_i, O2, arrayOopDesc::base_offset_in_bytes(T_INT));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
void TemplateTable::lastore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
  transition(ltos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
  __ pop_i(O2); // index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  // Otos_l: val
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
  // O3: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
  __ index_check(O3, O2, LogBytesPerLong, G3_scratch, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
  __ st_long(Otos_l, O2, arrayOopDesc::base_offset_in_bytes(T_LONG));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
void TemplateTable::fastore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
  transition(ftos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
  __ pop_i(O2); // index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
  // Ftos_f: val
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  // O3: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  __ index_check(O3, O2, LogBytesPerInt, G3_scratch, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
  __ stf(FloatRegisterImpl::S, Ftos_f, O2, arrayOopDesc::base_offset_in_bytes(T_FLOAT));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
void TemplateTable::dastore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
  transition(dtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
  __ pop_i(O2); // index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  // Fos_d: val
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  // O3: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
  __ index_check(O3, O2, LogBytesPerLong, G3_scratch, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
  __ stf(FloatRegisterImpl::D, Ftos_d, O2, arrayOopDesc::base_offset_in_bytes(T_DOUBLE));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
void TemplateTable::aastore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
  Label store_ok, is_null, done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
  __ ld_ptr(Lesp, Interpreter::expr_offset_in_bytes(0), Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
  __ ld(Lesp, Interpreter::expr_offset_in_bytes(1), O2);         // get index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
  __ ld_ptr(Lesp, Interpreter::expr_offset_in_bytes(2), O3);     // get array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
  // Otos_i: val
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
  // O2: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
  // O3: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
  __ verify_oop(Otos_i);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   864
  __ index_check_without_pop(O3, O2, UseCompressedOops ? 2 : LogBytesPerWord, G3_scratch, O1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
  // do array store check - check for NULL value first
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
  __ br_null( Otos_i, false, Assembler::pn, is_null );
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   868
  __ delayed()->nop();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   869
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   870
  __ load_klass(O3, O4); // get array klass
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
   871
  __ load_klass(Otos_i, O5); // get value klass
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
  // do fast instanceof cache test
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
  __ ld_ptr(O4,     sizeof(oopDesc) + objArrayKlass::element_klass_offset_in_bytes(),  O4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
  assert(Otos_i == O0, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
  // Otos_i:    value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
  // O1:        addr - offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
  // O2:        index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
  // O3:        array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
  // O4:        array element klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
  // O5:        value klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   886
  // Address element(O1, 0, arrayOopDesc::base_offset_in_bytes(T_OBJECT));
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   887
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
  // Generate a fast subtype check.  Branch to store_ok if no
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
  // failure.  Throw if failure.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
  __ gen_subtype_check( O5, O4, G3_scratch, G4_scratch, G1_scratch, store_ok );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  // Not a subtype; so must throw exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
  __ throw_if_not_x( Assembler::never, Interpreter::_throw_ArrayStoreException_entry, G3_scratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
  // Store is OK.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
  __ bind(store_ok);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   897
  do_oop_store(_masm, O1, noreg, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Otos_i, G3_scratch, _bs->kind(), true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   898
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
  __ ba(false,done);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   900
  __ delayed()->inc(Lesp, 3* Interpreter::stackElementSize); // adj sp (pops array, index and value)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
  __ bind(is_null);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   903
  do_oop_store(_masm, O1, noreg, arrayOopDesc::base_offset_in_bytes(T_OBJECT), G0, G4_scratch, _bs->kind(), true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   904
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
  __ profile_null_seen(G3_scratch);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   906
  __ inc(Lesp, 3* Interpreter::stackElementSize);     // adj sp (pops array, index and value)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
  __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
void TemplateTable::bastore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
  __ pop_i(O2); // index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
  // Otos_i: val
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
  // O3: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
  __ index_check(O3, O2, 0, G3_scratch, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
  __ stb(Otos_i, O2, arrayOopDesc::base_offset_in_bytes(T_BYTE));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
void TemplateTable::castore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
  __ pop_i(O2); // index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  // Otos_i: val
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
  // O3: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
  __ index_check(O3, O2, LogBytesPerShort, G3_scratch, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
  __ sth(Otos_i, O2, arrayOopDesc::base_offset_in_bytes(T_CHAR));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
void TemplateTable::sastore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
  // %%%%% Factor across platform
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
  castore();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
void TemplateTable::istore(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
  __ st(Otos_i, Llocals, Interpreter::local_offset_in_bytes(n));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
void TemplateTable::lstore(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
  transition(ltos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
  assert(n+1 < Argument::n_register_parameters, "only handle register cases");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
  __ store_unaligned_long(Otos_l, Llocals, Interpreter::local_offset_in_bytes(n+1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
void TemplateTable::fstore(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
  transition(ftos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
  assert(n < Argument::n_register_parameters, "only handle register cases");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
  __ stf(FloatRegisterImpl::S, Ftos_f, Llocals, Interpreter::local_offset_in_bytes(n));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
void TemplateTable::dstore(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
  transition(dtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
  FloatRegister src = Ftos_d;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
  __ store_unaligned_double(src, Llocals, Interpreter::local_offset_in_bytes(n+1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
void TemplateTable::astore(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
  transition(vtos, vtos);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   967
  __ load_ptr(0, Otos_i);
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   968
  __ inc(Lesp, Interpreter::stackElementSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
  __ verify_oop_or_return_address(Otos_i, G3_scratch);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   970
  __ store_local_ptr(n, Otos_i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
void TemplateTable::pop() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
  transition(vtos, vtos);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   976
  __ inc(Lesp, Interpreter::stackElementSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
void TemplateTable::pop2() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
  transition(vtos, vtos);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   982
  __ inc(Lesp, 2 * Interpreter::stackElementSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
void TemplateTable::dup() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
  // stack: ..., a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
  // load a and tag
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   990
  __ load_ptr(0, Otos_i);
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   991
  __ push_ptr(Otos_i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
  // stack: ..., a, a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
void TemplateTable::dup_x1() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
  // stack: ..., a, b
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
   999
  __ load_ptr( 1, G3_scratch);  // get a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1000
  __ load_ptr( 0, Otos_l1);     // get b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1001
  __ store_ptr(1, Otos_l1);     // put b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1002
  __ store_ptr(0, G3_scratch);  // put a - like swap
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1003
  __ push_ptr(Otos_l1);         // push b
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
  // stack: ..., b, a, b
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
void TemplateTable::dup_x2() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
  // stack: ..., a, b, c
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
  // get c and push on stack, reuse registers
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1012
  __ load_ptr( 0, G3_scratch);  // get c
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1013
  __ push_ptr(G3_scratch);      // push c with tag
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
  // stack: ..., a, b, c, c  (c in reg)  (Lesp - 4)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
  // (stack offsets n+1 now)
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1016
  __ load_ptr( 3, Otos_l1);     // get a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1017
  __ store_ptr(3, G3_scratch);  // put c at 3
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
  // stack: ..., c, b, c, c  (a in reg)
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1019
  __ load_ptr( 2, G3_scratch);  // get b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1020
  __ store_ptr(2, Otos_l1);     // put a at 2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
  // stack: ..., c, a, c, c  (b in reg)
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1022
  __ store_ptr(1, G3_scratch);  // put b at 1
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
  // stack: ..., c, a, b, c
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
void TemplateTable::dup2() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
  transition(vtos, vtos);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1029
  __ load_ptr(1, G3_scratch);  // get a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1030
  __ load_ptr(0, Otos_l1);     // get b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1031
  __ push_ptr(G3_scratch);     // push a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1032
  __ push_ptr(Otos_l1);        // push b
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
  // stack: ..., a, b, a, b
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
void TemplateTable::dup2_x1() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
  // stack: ..., a, b, c
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1040
  __ load_ptr( 1, Lscratch);    // get b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1041
  __ load_ptr( 2, Otos_l1);     // get a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1042
  __ store_ptr(2, Lscratch);    // put b at a
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
  // stack: ..., b, b, c
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1044
  __ load_ptr( 0, G3_scratch);  // get c
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1045
  __ store_ptr(1, G3_scratch);  // put c at b
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  // stack: ..., b, c, c
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1047
  __ store_ptr(0, Otos_l1);     // put a at c
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
  // stack: ..., b, c, a
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1049
  __ push_ptr(Lscratch);        // push b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1050
  __ push_ptr(G3_scratch);      // push c
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
  // stack: ..., b, c, a, b, c
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
// The spec says that these types can be a mixture of category 1 (1 word)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
// types and/or category 2 types (long and doubles)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
void TemplateTable::dup2_x2() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
  // stack: ..., a, b, c, d
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1060
  __ load_ptr( 1, Lscratch);    // get c
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1061
  __ load_ptr( 3, Otos_l1);     // get a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1062
  __ store_ptr(3, Lscratch);    // put c at 3
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1063
  __ store_ptr(1, Otos_l1);     // put a at 1
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
  // stack: ..., c, b, a, d
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1065
  __ load_ptr( 2, G3_scratch);  // get b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1066
  __ load_ptr( 0, Otos_l1);     // get d
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1067
  __ store_ptr(0, G3_scratch);  // put b at 0
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1068
  __ store_ptr(2, Otos_l1);     // put d at 2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
  // stack: ..., c, d, a, b
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1070
  __ push_ptr(Lscratch);        // push c
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1071
  __ push_ptr(Otos_l1);         // push d
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
  // stack: ..., c, d, a, b, c, d
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
void TemplateTable::swap() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
  // stack: ..., a, b
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1079
  __ load_ptr( 1, G3_scratch);  // get a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1080
  __ load_ptr( 0, Otos_l1);     // get b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1081
  __ store_ptr(0, G3_scratch);  // put b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1082
  __ store_ptr(1, Otos_l1);     // put a
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
  // stack: ..., b, a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
void TemplateTable::iop2(Operation op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
  __ pop_i(O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
  switch (op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
   case  add:  __  add(O1, Otos_i, Otos_i);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
   case  sub:  __  sub(O1, Otos_i, Otos_i);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
     // %%%%% Mul may not exist: better to call .mul?
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
   case  mul:  __ smul(O1, Otos_i, Otos_i);  break;
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1095
   case _and:  __ and3(O1, Otos_i, Otos_i);  break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1096
   case  _or:  __  or3(O1, Otos_i, Otos_i);  break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1097
   case _xor:  __ xor3(O1, Otos_i, Otos_i);  break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
   case  shl:  __  sll(O1, Otos_i, Otos_i);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
   case  shr:  __  sra(O1, Otos_i, Otos_i);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
   case ushr:  __  srl(O1, Otos_i, Otos_i);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
   default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
void TemplateTable::lop2(Operation op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
  transition(ltos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
  __ pop_l(O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  switch (op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
#ifdef _LP64
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1111
   case  add:  __  add(O2, Otos_l, Otos_l);  break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1112
   case  sub:  __  sub(O2, Otos_l, Otos_l);  break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1113
   case _and:  __ and3(O2, Otos_l, Otos_l);  break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1114
   case  _or:  __  or3(O2, Otos_l, Otos_l);  break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1115
   case _xor:  __ xor3(O2, Otos_l, Otos_l);  break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
   case  add:  __ addcc(O3, Otos_l2, Otos_l2);  __ addc(O2, Otos_l1, Otos_l1);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
   case  sub:  __ subcc(O3, Otos_l2, Otos_l2);  __ subc(O2, Otos_l1, Otos_l1);  break;
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1119
   case _and:  __  and3(O3, Otos_l2, Otos_l2);  __ and3(O2, Otos_l1, Otos_l1);  break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1120
   case  _or:  __   or3(O3, Otos_l2, Otos_l2);  __  or3(O2, Otos_l1, Otos_l1);  break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1121
   case _xor:  __  xor3(O3, Otos_l2, Otos_l2);  __ xor3(O2, Otos_l1, Otos_l1);  break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
   default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
void TemplateTable::idiv() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
  // %%%%% Later: ForSPARC/V7 call .sdiv library routine,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  // %%%%% Use ldsw...sdivx on pure V9 ABI. 64 bit safe.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
  __ pop_i(O1); // get 1st op
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
  // Y contains upper 32 bits of result, set it to 0 or all ones
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
  __ wry(G0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
  __ mov(~0, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
  __ tst(O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
     Label neg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
  __ br(Assembler::negative, true, Assembler::pn, neg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
  __ delayed()->wry(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
  __ bind(neg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
     Label ok;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
  __ tst(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
  __ throw_if_not_icc( Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
  const int min_int = 0x80000000;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
  Label regular;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
  __ cmp(Otos_i, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
  __ br(Assembler::notEqual, false, Assembler::pt, regular);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
  // Don't put set in delay slot
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
  // Set will turn into multiple instructions in 64 bit mode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
  __ set(min_int, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
  __ delayed()->set(min_int, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
  Label done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
  __ cmp(O1, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
  __ br(Assembler::equal, true, Assembler::pt, done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
  __ delayed()->mov(O1, Otos_i);   // (mov only executed if branch taken)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
  __ bind(regular);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
  __ sdiv(O1, Otos_i, Otos_i); // note: irem uses O1 after this instruction!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
  __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
void TemplateTable::irem() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
  __ mov(Otos_i, O2); // save divisor
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
  idiv();                               // %%%% Hack: exploits fact that idiv leaves dividend in O1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
  __ smul(Otos_i, O2, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
  __ sub(O1, Otos_i, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
void TemplateTable::lmul() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
  transition(ltos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
  __ pop_l(O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
  __ mulx(Otos_l, O2, Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
  __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::lmul));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
void TemplateTable::ldiv() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
  transition(ltos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
  // check for zero
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
  __ pop_l(O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
  __ tst(Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
  __ throw_if_not_xcc( Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
  __ sdivx(O2, Otos_l, Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
  __ orcc(Otos_l1, Otos_l2, G0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
  __ throw_if_not_icc( Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
  __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::ldiv));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
void TemplateTable::lrem() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
  transition(ltos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
  // check for zero
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
  __ pop_l(O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
  __ tst(Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
  __ throw_if_not_xcc( Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
  __ sdivx(O2, Otos_l, Otos_l2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
  __ mulx (Otos_l2, Otos_l, Otos_l2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
  __ sub  (O2, Otos_l2, Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
  __ orcc(Otos_l1, Otos_l2, G0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
  __ throw_if_not_icc(Assembler::notZero, Interpreter::_throw_ArithmeticException_entry, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
  __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::lrem));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
void TemplateTable::lshl() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
  transition(itos, ltos); // %%%% could optimize, fill delay slot or opt for ultra
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
  __ pop_l(O2);                          // shift value in O2, O3
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
  __ sllx(O2, Otos_i, Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
  __ lshl(O2, O3, Otos_i, Otos_l1, Otos_l2, O4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
void TemplateTable::lshr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
  transition(itos, ltos); // %%%% see lshl comment
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
  __ pop_l(O2);                          // shift value in O2, O3
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
  __ srax(O2, Otos_i, Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
  __ lshr(O2, O3, Otos_i, Otos_l1, Otos_l2, O4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
void TemplateTable::lushr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
  transition(itos, ltos); // %%%% see lshl comment
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
  __ pop_l(O2);                          // shift value in O2, O3
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
  __ srlx(O2, Otos_i, Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
  __ lushr(O2, O3, Otos_i, Otos_l1, Otos_l2, O4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1266
void TemplateTable::fop2(Operation op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
  transition(ftos, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
  switch (op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
   case  add:  __  pop_f(F4); __ fadd(FloatRegisterImpl::S, F4, Ftos_f, Ftos_f);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
   case  sub:  __  pop_f(F4); __ fsub(FloatRegisterImpl::S, F4, Ftos_f, Ftos_f);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
   case  mul:  __  pop_f(F4); __ fmul(FloatRegisterImpl::S, F4, Ftos_f, Ftos_f);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
   case  div:  __  pop_f(F4); __ fdiv(FloatRegisterImpl::S, F4, Ftos_f, Ftos_f);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
   case  rem:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
     assert(Ftos_f == F0, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
     // LP64 calling conventions use F1, F3 for passing 2 floats
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
     __ pop_f(F1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
     __ fmov(FloatRegisterImpl::S, Ftos_f, F3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
     __ pop_i(O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
     __ stf(FloatRegisterImpl::S, Ftos_f, __ d_tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
     __ ld( __ d_tmp, O1 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
     __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::frem));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
     assert( Ftos_f == F0, "fix this code" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
     break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
   default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1291
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
void TemplateTable::dop2(Operation op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
  transition(dtos, dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
  switch (op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
   case  add:  __  pop_d(F4); __ fadd(FloatRegisterImpl::D, F4, Ftos_d, Ftos_d);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
   case  sub:  __  pop_d(F4); __ fsub(FloatRegisterImpl::D, F4, Ftos_d, Ftos_d);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
   case  mul:  __  pop_d(F4); __ fmul(FloatRegisterImpl::D, F4, Ftos_d, Ftos_d);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
   case  div:  __  pop_d(F4); __ fdiv(FloatRegisterImpl::D, F4, Ftos_d, Ftos_d);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
   case  rem:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
     // Pass arguments in D0, D2
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
     __ fmov(FloatRegisterImpl::D, Ftos_f, F2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
     __ pop_d( F0 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
     // Pass arguments in O0O1, O2O3
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
     __ stf(FloatRegisterImpl::D, Ftos_f, __ d_tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1308
     __ ldd( __ d_tmp, O2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
     __ pop_d(Ftos_f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
     __ stf(FloatRegisterImpl::D, Ftos_f, __ d_tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
     __ ldd( __ d_tmp, O0 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
     __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::drem));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
     assert( Ftos_d == F0, "fix this code" );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
     break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1317
   default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
void TemplateTable::ineg() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
  __ neg(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
void TemplateTable::lneg() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
  transition(ltos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
  __ sub(G0, Otos_l, Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
  __ lneg(Otos_l1, Otos_l2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
void TemplateTable::fneg() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
  transition(ftos, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
  __ fneg(FloatRegisterImpl::S, Ftos_f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1342
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
void TemplateTable::dneg() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
  transition(dtos, dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
  // v8 has fnegd if source and dest are the same
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
  __ fneg(FloatRegisterImpl::D, Ftos_f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
void TemplateTable::iinc() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
  locals_index(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
  __ ldsb(Lbcp, 2, O2);  // load constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
  __ access_local_int(G3_scratch, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
  __ add(Otos_i, O2, Otos_i);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1357
  __ st(Otos_i, G3_scratch, 0);    // access_local_int puts E.A. in G3_scratch
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
void TemplateTable::wide_iinc() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
  locals_index_wide(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
  __ get_2_byte_integer_at_bcp( 4,  O2, O3, InterpreterMacroAssembler::Signed);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
  __ access_local_int(G3_scratch, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
  __ add(Otos_i, O3, Otos_i);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1367
  __ st(Otos_i, G3_scratch, 0);    // access_local_int puts E.A. in G3_scratch
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1369
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
void TemplateTable::convert() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
// %%%%% Factor this first part accross platforms
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
  #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
    TosState tos_in  = ilgl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
    TosState tos_out = ilgl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
    switch (bytecode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
      case Bytecodes::_i2l: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
      case Bytecodes::_i2f: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
      case Bytecodes::_i2d: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1380
      case Bytecodes::_i2b: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
      case Bytecodes::_i2c: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
      case Bytecodes::_i2s: tos_in = itos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1383
      case Bytecodes::_l2i: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1384
      case Bytecodes::_l2f: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1385
      case Bytecodes::_l2d: tos_in = ltos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
      case Bytecodes::_f2i: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
      case Bytecodes::_f2l: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
      case Bytecodes::_f2d: tos_in = ftos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
      case Bytecodes::_d2i: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1390
      case Bytecodes::_d2l: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1391
      case Bytecodes::_d2f: tos_in = dtos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
      default             : ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1393
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
    switch (bytecode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
      case Bytecodes::_l2i: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
      case Bytecodes::_f2i: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
      case Bytecodes::_d2i: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
      case Bytecodes::_i2b: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
      case Bytecodes::_i2c: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
      case Bytecodes::_i2s: tos_out = itos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
      case Bytecodes::_i2l: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
      case Bytecodes::_f2l: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
      case Bytecodes::_d2l: tos_out = ltos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
      case Bytecodes::_i2f: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
      case Bytecodes::_l2f: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
      case Bytecodes::_d2f: tos_out = ftos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
      case Bytecodes::_i2d: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
      case Bytecodes::_l2d: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
      case Bytecodes::_f2d: tos_out = dtos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
      default             : ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
    transition(tos_in, tos_out);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
  #endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
  // Conversion
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
  Label done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
  switch (bytecode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
   case Bytecodes::_i2l:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
    // Sign extend the 32 bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
    __ sra ( Otos_i, 0, Otos_l );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
    __ addcc(Otos_i, 0, Otos_l2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
    __ br(Assembler::greaterEqual, true, Assembler::pt, done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
    __ delayed()->clr(Otos_l1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
    __ set(~0, Otos_l1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1428
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1429
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1430
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
   case Bytecodes::_i2f:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1432
    __ st(Otos_i, __ d_tmp );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
    __ ldf(FloatRegisterImpl::S,  __ d_tmp, F0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
    __ fitof(FloatRegisterImpl::S, F0, Ftos_f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1435
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1436
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
   case Bytecodes::_i2d:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
    __ st(Otos_i, __ d_tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
    __ ldf(FloatRegisterImpl::S,  __ d_tmp, F0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
    __ fitof(FloatRegisterImpl::D, F0, Ftos_f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
   case Bytecodes::_i2b:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
    __ sll(Otos_i, 24, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1445
    __ sra(Otos_i, 24, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1446
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1447
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
   case Bytecodes::_i2c:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
    __ sll(Otos_i, 16, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
    __ srl(Otos_i, 16, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
   case Bytecodes::_i2s:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
    __ sll(Otos_i, 16, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
    __ sra(Otos_i, 16, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
   case Bytecodes::_l2i:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
#ifndef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
    __ mov(Otos_l2, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
    // Sign-extend into the high 32 bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
    __ sra(Otos_l, 0, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
   case Bytecodes::_l2f:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
   case Bytecodes::_l2d:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
    __ st_long(Otos_l, __ d_tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
    __ ldf(FloatRegisterImpl::D, __ d_tmp, Ftos_d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
    if (VM_Version::v9_instructions_work()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
      if (bytecode() == Bytecodes::_l2f) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
        __ fxtof(FloatRegisterImpl::S, Ftos_d, Ftos_f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
        __ fxtof(FloatRegisterImpl::D, Ftos_d, Ftos_d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
      __ call_VM_leaf(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
        Lscratch,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
        bytecode() == Bytecodes::_l2f
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
          ? CAST_FROM_FN_PTR(address, SharedRuntime::l2f)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
          : CAST_FROM_FN_PTR(address, SharedRuntime::l2d)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
      );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
  case Bytecodes::_f2i:  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
      Label isNaN;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
      // result must be 0 if value is NaN; test by comparing value to itself
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
      __ fcmp(FloatRegisterImpl::S, Assembler::fcc0, Ftos_f, Ftos_f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
      // According to the v8 manual, you have to have a non-fp instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
      // between fcmp and fb.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
      if (!VM_Version::v9_instructions_work()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
        __ nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1497
      __ fb(Assembler::f_unordered, true, Assembler::pn, isNaN);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
      __ delayed()->clr(Otos_i);                                     // NaN
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
      __ ftoi(FloatRegisterImpl::S, Ftos_f, F30);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1500
      __ stf(FloatRegisterImpl::S, F30, __ d_tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1501
      __ ld(__ d_tmp, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1502
      __ bind(isNaN);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1504
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1505
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
   case Bytecodes::_f2l:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
    // must uncache tos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
    __ push_f();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
    __ pop_f(F1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1511
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1512
    __ pop_i(O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1513
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1514
    __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::f2l));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1516
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
   case Bytecodes::_f2d:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1518
    __ ftof( FloatRegisterImpl::S, FloatRegisterImpl::D, Ftos_f, Ftos_f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
   case Bytecodes::_d2i:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1522
   case Bytecodes::_d2l:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1523
    // must uncache tos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
    __ push_d();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1525
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1526
    // LP64 calling conventions pass first double arg in D0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1527
    __ pop_d( Ftos_d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1529
    __ pop_i( O0 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
    __ pop_i( O1 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1532
    __ call_VM_leaf(Lscratch,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1533
        bytecode() == Bytecodes::_d2i
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1534
          ? CAST_FROM_FN_PTR(address, SharedRuntime::d2i)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1535
          : CAST_FROM_FN_PTR(address, SharedRuntime::d2l));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1536
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1537
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1538
    case Bytecodes::_d2f:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1539
    if (VM_Version::v9_instructions_work()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1540
      __ ftof( FloatRegisterImpl::D, FloatRegisterImpl::S, Ftos_d, Ftos_f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1541
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1542
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1543
      // must uncache tos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1544
      __ push_d();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1545
      __ pop_i(O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1546
      __ pop_i(O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1547
      __ call_VM_leaf(Lscratch, CAST_FROM_FN_PTR(address, SharedRuntime::d2f));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1548
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1549
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1550
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1551
    default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1552
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1553
  __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1554
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1555
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1556
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1557
void TemplateTable::lcmp() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1558
  transition(ltos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1559
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1560
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1561
  __ pop_l(O1); // pop off value 1, value 2 is in O0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1562
  __ lcmp( O1, Otos_l, Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
  __ pop_l(O2); // cmp O2,3 to O0,1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
  __ lcmp( O2, O3, Otos_l1, Otos_l2, Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1566
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1567
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1568
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1569
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1570
void TemplateTable::float_cmp(bool is_float, int unordered_result) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1571
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
  if (is_float) __ pop_f(F2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1573
  else          __ pop_d(F2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1575
  assert(Ftos_f == F0  &&  Ftos_d == F0,  "alias checking:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1576
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1577
  __ float_cmp( is_float, unordered_result, F2, F0, Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1578
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1579
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1580
void TemplateTable::branch(bool is_jsr, bool is_wide) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1581
  // Note: on SPARC, we use InterpreterMacroAssembler::if_cmp also.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1582
  __ verify_oop(Lmethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1583
  __ verify_thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1584
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1585
  const Register O2_bumped_count = O2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1586
  __ profile_taken_branch(G3_scratch, O2_bumped_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1587
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1588
  // get (wide) offset to O1_disp
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1589
  const Register O1_disp = O1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1590
  if (is_wide)  __ get_4_byte_integer_at_bcp( 1,  G4_scratch, O1_disp,                                    InterpreterMacroAssembler::set_CC);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1591
  else          __ get_2_byte_integer_at_bcp( 1,  G4_scratch, O1_disp, InterpreterMacroAssembler::Signed, InterpreterMacroAssembler::set_CC);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1592
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1593
  // Handle all the JSR stuff here, then exit.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1594
  // It's much shorter and cleaner than intermingling with the
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 1603
diff changeset
  1595
  // non-JSR normal-branch stuff occurring below.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1596
  if( is_jsr ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1597
    // compute return address as bci in Otos_i
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  1598
    __ ld_ptr(Lmethod, methodOopDesc::const_offset(), G3_scratch);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1599
    __ sub(Lbcp, G3_scratch, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1600
    __ sub(G3_scratch, in_bytes(constMethodOopDesc::codes_offset()) - (is_wide ? 5 : 3), Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1601
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1602
    // Bump Lbcp to target of JSR
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1603
    __ add(Lbcp, O1_disp, Lbcp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1604
    // Push returnAddress for "ret" on stack
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  1605
    __ push_ptr(Otos_i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1606
    // And away we go!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1607
    __ dispatch_next(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1608
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1609
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1610
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1611
  // Normal (non-jsr) branch handling
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1612
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1613
  // Save the current Lbcp
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1614
  const Register O0_cur_bcp = O0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1615
  __ mov( Lbcp, O0_cur_bcp );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1616
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1617
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1618
  bool increment_invocation_counter_for_backward_branches = UseCompiler && UseLoopCounter;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1619
  if ( increment_invocation_counter_for_backward_branches ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1620
    Label Lforward;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1621
    // check branch direction
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1622
    __ br( Assembler::positive, false,  Assembler::pn, Lforward );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1623
    // Bump bytecode pointer by displacement (take the branch)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1624
    __ delayed()->add( O1_disp, Lbcp, Lbcp );     // add to bc addr
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1625
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1626
    if (TieredCompilation) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1627
      Label Lno_mdo, Loverflow;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1628
      int increment = InvocationCounter::count_increment;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1629
      int mask = ((1 << Tier0BackedgeNotifyFreqLog) - 1) << InvocationCounter::count_shift;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1630
      if (ProfileInterpreter) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1631
        // If no method data exists, go to profile_continue.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1632
        __ ld_ptr(Lmethod, methodOopDesc::method_data_offset(), G4_scratch);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1633
        __ br_null(G4_scratch, false, Assembler::pn, Lno_mdo);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1634
        __ delayed()->nop();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1635
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1636
        // Increment backedge counter in the MDO
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1637
        Address mdo_backedge_counter(G4_scratch, in_bytes(methodDataOopDesc::backedge_counter_offset()) +
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1638
                                                 in_bytes(InvocationCounter::counter_offset()));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1639
        __ increment_mask_and_jump(mdo_backedge_counter, increment, mask, G3_scratch, Lscratch,
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1640
                                   Assembler::notZero, &Lforward);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1641
        __ ba(false, Loverflow);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1642
        __ delayed()->nop();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1643
      }
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1644
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1645
      // If there's no MDO, increment counter in methodOop
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1646
      __ bind(Lno_mdo);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1647
      Address backedge_counter(Lmethod, in_bytes(methodOopDesc::backedge_counter_offset()) +
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1648
                                        in_bytes(InvocationCounter::counter_offset()));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1649
      __ increment_mask_and_jump(backedge_counter, increment, mask, G3_scratch, Lscratch,
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1650
                                 Assembler::notZero, &Lforward);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1651
      __ bind(Loverflow);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1652
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1653
      // notify point for loop, pass branch bytecode
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1654
      __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), O0_cur_bcp);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1655
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1656
      // Was an OSR adapter generated?
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1657
      // O0 = osr nmethod
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1658
      __ br_null(O0, false, Assembler::pn, Lforward);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1659
      __ delayed()->nop();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1660
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1661
      // Has the nmethod been invalidated already?
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1662
      __ ld(O0, nmethod::entry_bci_offset(), O2);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1663
      __ cmp(O2, InvalidOSREntryBci);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1664
      __ br(Assembler::equal, false, Assembler::pn, Lforward);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1665
      __ delayed()->nop();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1666
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1667
      // migrate the interpreter frame off of the stack
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1668
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1669
      __ mov(G2_thread, L7);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1670
      // save nmethod
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1671
      __ mov(O0, L6);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1672
      __ set_last_Java_frame(SP, noreg);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1673
      __ call_VM_leaf(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin), L7);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1674
      __ reset_last_Java_frame();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1675
      __ mov(L7, G2_thread);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1676
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1677
      // move OSR nmethod to I1
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1678
      __ mov(L6, I1);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1679
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1680
      // OSR buffer to I0
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1681
      __ mov(O0, I0);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1682
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1683
      // remove the interpreter frame
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1684
      __ restore(I5_savedSP, 0, SP);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1685
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1686
      // Jump to the osr code.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1687
      __ ld_ptr(O1, nmethod::osr_entry_point_offset(), O2);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1688
      __ jmp(O2, G0);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1689
      __ delayed()->nop();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1690
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1691
    } else {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1692
      // Update Backedge branch separately from invocations
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1693
      const Register G4_invoke_ctr = G4;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1694
      __ increment_backedge_counter(G4_invoke_ctr, G1_scratch);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1695
      if (ProfileInterpreter) {
7889
02144432d0e1 4930919: race condition in MDO creation at back branch locations
iveresov
parents: 7397
diff changeset
  1696
        __ test_invocation_counter_for_mdp(G4_invoke_ctr, G3_scratch, Lforward);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1697
        if (UseOnStackReplacement) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1698
          __ test_backedge_count_for_osr(O2_bumped_count, O0_cur_bcp, G3_scratch);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1699
        }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1700
      } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1701
        if (UseOnStackReplacement) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1702
          __ test_backedge_count_for_osr(G4_invoke_ctr, O0_cur_bcp, G3_scratch);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1703
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1704
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1705
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
    __ bind(Lforward);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1708
  } else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
    // Bump bytecode pointer by displacement (take the branch)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
    __ add( O1_disp, Lbcp, Lbcp );// add to bc addr
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1712
  // continue with bytecode @ target
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1713
  // %%%%% Like Intel, could speed things up by moving bytecode fetch to code above,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1714
  // %%%%% and changing dispatch_next to dispatch_only
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1715
  __ dispatch_next(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1716
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1717
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1718
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1719
// Note Condition in argument is TemplateTable::Condition
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1720
// arg scope is within class scope
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1721
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1722
void TemplateTable::if_0cmp(Condition cc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1723
  // no pointers, integer only!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1724
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1725
  // assume branch is more often taken than not (loops use backward branches)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1726
  __ cmp( Otos_i, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1727
  __ if_cmp(ccNot(cc), false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1728
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1729
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1730
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1731
void TemplateTable::if_icmp(Condition cc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1732
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1733
  __ pop_i(O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1734
  __ cmp(O1, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1735
  __ if_cmp(ccNot(cc), false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1736
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1737
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1738
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1739
void TemplateTable::if_nullcmp(Condition cc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1740
  transition(atos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1741
  __ tst(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1742
  __ if_cmp(ccNot(cc), true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1743
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1744
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1745
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1746
void TemplateTable::if_acmp(Condition cc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1747
  transition(atos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1748
  __ pop_ptr(O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1749
  __ verify_oop(O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1750
  __ verify_oop(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1751
  __ cmp(O1, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1752
  __ if_cmp(ccNot(cc), true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1753
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1754
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1755
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1756
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1757
void TemplateTable::ret() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1758
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1759
  locals_index(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1760
  __ access_local_returnAddress(G3_scratch, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1761
  // Otos_i contains the bci, compute the bcp from that
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1762
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1763
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1764
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1765
  // jsr result was labeled as an 'itos' not an 'atos' because we cannot GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1766
  // the result.  The return address (really a BCI) was stored with an
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1767
  // 'astore' because JVM specs claim it's a pointer-sized thing.  Hence in
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1768
  // the 64-bit build the 32-bit BCI is actually in the low bits of a 64-bit
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1769
  // loaded value.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1770
  { Label zzz ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1771
     __ set (65536, G3_scratch) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1772
     __ cmp (Otos_i, G3_scratch) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1773
     __ bp( Assembler::lessEqualUnsigned, false, Assembler::xcc, Assembler::pn, zzz);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1774
     __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1775
     __ stop("BCI is in the wrong register half?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1776
     __ bind (zzz) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1777
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1778
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1779
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1780
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1781
  __ profile_ret(vtos, Otos_i, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1782
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  1783
  __ ld_ptr(Lmethod, methodOopDesc::const_offset(), G3_scratch);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1784
  __ add(G3_scratch, Otos_i, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1785
  __ add(G3_scratch, in_bytes(constMethodOopDesc::codes_offset()), Lbcp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1786
  __ dispatch_next(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1787
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1790
void TemplateTable::wide_ret() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1791
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1792
  locals_index_wide(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1793
  __ access_local_returnAddress(G3_scratch, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1794
  // Otos_i contains the bci, compute the bcp from that
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1795
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1796
  __ profile_ret(vtos, Otos_i, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1797
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  1798
  __ ld_ptr(Lmethod, methodOopDesc::const_offset(), G3_scratch);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1799
  __ add(G3_scratch, Otos_i, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1800
  __ add(G3_scratch, in_bytes(constMethodOopDesc::codes_offset()), Lbcp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
  __ dispatch_next(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1802
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1803
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1804
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1805
void TemplateTable::tableswitch() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1806
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1807
  Label default_case, continue_execution;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1808
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1809
  // align bcp
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1810
  __ add(Lbcp, BytesPerInt, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1811
  __ and3(O1, -BytesPerInt, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1812
  // load lo, hi
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1813
  __ ld(O1, 1 * BytesPerInt, O2);       // Low Byte
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1814
  __ ld(O1, 2 * BytesPerInt, O3);       // High Byte
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1815
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1816
  // Sign extend the 32 bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1817
  __ sra ( Otos_i, 0, Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1818
#endif /* _LP64 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1819
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1820
  // check against lo & hi
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1821
  __ cmp( Otos_i, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1822
  __ br( Assembler::less, false, Assembler::pn, default_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1823
  __ delayed()->cmp( Otos_i, O3 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1824
  __ br( Assembler::greater, false, Assembler::pn, default_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1825
  // lookup dispatch offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1826
  __ delayed()->sub(Otos_i, O2, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1827
  __ profile_switch_case(O2, O3, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1828
  __ sll(O2, LogBytesPerInt, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1829
  __ add(O2, 3 * BytesPerInt, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1830
  __ ba(false, continue_execution);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1831
  __ delayed()->ld(O1, O2, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1832
  // handle default
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1833
  __ bind(default_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1834
  __ profile_switch_default(O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1835
  __ ld(O1, 0, O2); // get default offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1836
  // continue execution
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1837
  __ bind(continue_execution);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1838
  __ add(Lbcp, O2, Lbcp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1839
  __ dispatch_next(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1840
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1841
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1842
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1843
void TemplateTable::lookupswitch() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1844
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1845
  __ stop("lookupswitch bytecode should have been rewritten");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1846
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1847
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1848
void TemplateTable::fast_linearswitch() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1849
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1850
    Label loop_entry, loop, found, continue_execution;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1851
  // align bcp
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1852
  __ add(Lbcp, BytesPerInt, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1853
  __ and3(O1, -BytesPerInt, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1854
 // set counter
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1855
  __ ld(O1, BytesPerInt, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1856
  __ sll(O2, LogBytesPerInt + 1, O2); // in word-pairs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1857
  __ add(O1, 2 * BytesPerInt, O3); // set first pair addr
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1858
  __ ba(false, loop_entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1859
  __ delayed()->add(O3, O2, O2); // counter now points past last pair
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1860
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1861
  // table search
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1862
  __ bind(loop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1863
  __ cmp(O4, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1864
  __ br(Assembler::equal, true, Assembler::pn, found);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1865
  __ delayed()->ld(O3, BytesPerInt, O4); // offset -> O4
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1866
  __ inc(O3, 2 * BytesPerInt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1867
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1868
  __ bind(loop_entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1869
  __ cmp(O2, O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1870
  __ brx(Assembler::greaterUnsigned, true, Assembler::pt, loop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1871
  __ delayed()->ld(O3, 0, O4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1872
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1873
  // default case
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1874
  __ ld(O1, 0, O4); // get default offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1875
  if (ProfileInterpreter) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1876
    __ profile_switch_default(O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1877
    __ ba(false, continue_execution);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1878
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1879
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1880
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1881
  // entry found -> get offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1882
  __ bind(found);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1883
  if (ProfileInterpreter) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1884
    __ sub(O3, O1, O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1885
    __ sub(O3, 2*BytesPerInt, O3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1886
    __ srl(O3, LogBytesPerInt + 1, O3); // in word-pairs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1887
    __ profile_switch_case(O3, O1, O2, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1888
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1889
    __ bind(continue_execution);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1890
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1891
  __ add(Lbcp, O4, Lbcp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1892
  __ dispatch_next(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1893
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1894
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1895
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1896
void TemplateTable::fast_binaryswitch() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1897
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1898
  // Implementation using the following core algorithm: (copied from Intel)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1899
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1900
  // int binary_search(int key, LookupswitchPair* array, int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1901
  //   // Binary search according to "Methodik des Programmierens" by
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1902
  //   // Edsger W. Dijkstra and W.H.J. Feijen, Addison Wesley Germany 1985.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1903
  //   int i = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1904
  //   int j = n;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1905
  //   while (i+1 < j) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1906
  //     // invariant P: 0 <= i < j <= n and (a[i] <= key < a[j] or Q)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1907
  //     // with      Q: for all i: 0 <= i < n: key < a[i]
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1908
  //     // where a stands for the array and assuming that the (inexisting)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1909
  //     // element a[n] is infinitely big.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1910
  //     int h = (i + j) >> 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1911
  //     // i < h < j
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1912
  //     if (key < array[h].fast_match()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1913
  //       j = h;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1914
  //     } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1915
  //       i = h;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1916
  //     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1917
  //   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1918
  //   // R: a[i] <= key < a[i+1] or Q
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1919
  //   // (i.e., if key is within array, i is the correct index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1920
  //   return i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1921
  // }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1922
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1923
  // register allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1924
  assert(Otos_i == O0, "alias checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1925
  const Register Rkey     = Otos_i;                    // already set (tosca)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1926
  const Register Rarray   = O1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1927
  const Register Ri       = O2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1928
  const Register Rj       = O3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1929
  const Register Rh       = O4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1930
  const Register Rscratch = O5;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1931
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1932
  const int log_entry_size = 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1933
  const int entry_size = 1 << log_entry_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1934
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1935
  Label found;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1936
  // Find Array start
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1937
  __ add(Lbcp, 3 * BytesPerInt, Rarray);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1938
  __ and3(Rarray, -BytesPerInt, Rarray);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1939
  // initialize i & j (in delay slot)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1940
  __ clr( Ri );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1941
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1942
  // and start
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1943
  Label entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1944
  __ ba(false, entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1945
  __ delayed()->ld( Rarray, -BytesPerInt, Rj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1946
  // (Rj is already in the native byte-ordering.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1947
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1948
  // binary search loop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1949
  { Label loop;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1950
    __ bind( loop );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1951
    // int h = (i + j) >> 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1952
    __ sra( Rh, 1, Rh );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1953
    // if (key < array[h].fast_match()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1954
    //   j = h;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1955
    // } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1956
    //   i = h;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1957
    // }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1958
    __ sll( Rh, log_entry_size, Rscratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1959
    __ ld( Rarray, Rscratch, Rscratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1960
    // (Rscratch is already in the native byte-ordering.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1961
    __ cmp( Rkey, Rscratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1962
    if ( VM_Version::v9_instructions_work() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1963
      __ movcc( Assembler::less,         false, Assembler::icc, Rh, Rj );  // j = h if (key <  array[h].fast_match())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1964
      __ movcc( Assembler::greaterEqual, false, Assembler::icc, Rh, Ri );  // i = h if (key >= array[h].fast_match())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1965
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1966
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1967
      Label end_of_if;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1968
      __ br( Assembler::less, true, Assembler::pt, end_of_if );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1969
      __ delayed()->mov( Rh, Rj ); // if (<) Rj = Rh
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1970
      __ mov( Rh, Ri );            // else i = h
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1971
      __ bind(end_of_if);          // }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1972
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1973
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1974
    // while (i+1 < j)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1975
    __ bind( entry );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1976
    __ add( Ri, 1, Rscratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1977
    __ cmp(Rscratch, Rj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1978
    __ br( Assembler::less, true, Assembler::pt, loop );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1979
    __ delayed()->add( Ri, Rj, Rh ); // start h = i + j  >> 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1980
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1981
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1982
  // end of binary search, result index is i (must check again!)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1983
  Label default_case;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1984
  Label continue_execution;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1985
  if (ProfileInterpreter) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1986
    __ mov( Ri, Rh );              // Save index in i for profiling
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1987
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1988
  __ sll( Ri, log_entry_size, Ri );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1989
  __ ld( Rarray, Ri, Rscratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1990
  // (Rscratch is already in the native byte-ordering.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1991
  __ cmp( Rkey, Rscratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1992
  __ br( Assembler::notEqual, true, Assembler::pn, default_case );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1993
  __ delayed()->ld( Rarray, -2 * BytesPerInt, Rj ); // load default offset -> j
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1994
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1995
  // entry found -> j = offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1996
  __ inc( Ri, BytesPerInt );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
  __ profile_switch_case(Rh, Rj, Rscratch, Rkey);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1998
  __ ld( Rarray, Ri, Rj );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1999
  // (Rj is already in the native byte-ordering.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2000
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2001
  if (ProfileInterpreter) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2002
    __ ba(false, continue_execution);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2003
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2004
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2005
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2006
  __ bind(default_case); // fall through (if not profiling)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2007
  __ profile_switch_default(Ri);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2008
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2009
  __ bind(continue_execution);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2010
  __ add( Lbcp, Rj, Lbcp );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2011
  __ dispatch_next( vtos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2012
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2013
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2014
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2015
void TemplateTable::_return(TosState state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2016
  transition(state, state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2017
  assert(_desc->calls_vm(), "inconsistent calls_vm information");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2018
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2019
  if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2020
    assert(state == vtos, "only valid state");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2021
    __ mov(G0, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2022
    __ access_local_ptr(G3_scratch, Otos_i);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  2023
    __ load_klass(Otos_i, O2);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2024
    __ set(JVM_ACC_HAS_FINALIZER, G3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2025
    __ ld(O2, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc), O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2026
    __ andcc(G3, O2, G0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2027
    Label skip_register_finalizer;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2028
    __ br(Assembler::zero, false, Assembler::pn, skip_register_finalizer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2029
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2030
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2031
    // Call out to do finalizer registration
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2032
    __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2033
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
    __ bind(skip_register_finalizer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2037
  __ remove_activation(state, /* throw_monitor_exception */ true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2038
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2039
  // The caller's SP was adjusted upon method entry to accomodate
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2040
  // the callee's non-argument locals. Undo that adjustment.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
  __ ret();                             // return to caller
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2042
  __ delayed()->restore(I5_savedSP, G0, SP);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2044
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
// ----------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2047
// Volatile variables demand their effects be made known to all CPU's in
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
// order.  Store buffers on most chips allow reads & writes to reorder; the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
// JMM's ReadAfterWrite.java test fails in -Xint mode without some kind of
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2050
// memory barrier (i.e., it's not sufficient that the interpreter does not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
// reorder volatile references, the hardware also must not reorder them).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2052
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2053
// According to the new Java Memory Model (JMM):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2054
// (1) All volatiles are serialized wrt to each other.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2055
// ALSO reads & writes act as aquire & release, so:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2056
// (2) A read cannot let unrelated NON-volatile memory refs that happen after
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2057
// the read float up to before the read.  It's OK for non-volatile memory refs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2058
// that happen before the volatile read to float down below it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2059
// (3) Similar a volatile write cannot let unrelated NON-volatile memory refs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2060
// that happen BEFORE the write float down to after the write.  It's OK for
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2061
// non-volatile memory refs that happen after the volatile write to float up
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2062
// before it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2063
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2064
// We only put in barriers around volatile refs (they are expensive), not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2065
// _between_ memory refs (that would require us to track the flavor of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2066
// previous memory refs).  Requirements (2) and (3) require some barriers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2067
// before volatile stores and after volatile loads.  These nearly cover
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2068
// requirement (1) but miss the volatile-store-volatile-load case.  This final
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2069
// case is placed after volatile-stores although it could just as well go
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2070
// before volatile-loads.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2071
void TemplateTable::volatile_barrier(Assembler::Membar_mask_bits order_constraint) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2072
  // Helper function to insert a is-volatile test and memory barrier
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2073
  // All current sparc implementations run in TSO, needing only StoreLoad
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2074
  if ((order_constraint & Assembler::StoreLoad) == 0) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2075
  __ membar( order_constraint );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2076
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2077
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2078
// ----------------------------------------------------------------------------
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2079
void TemplateTable::resolve_cache_and_index(int byte_no,
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2080
                                            Register result,
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2081
                                            Register Rcache,
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2082
                                            Register index,
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2083
                                            size_t index_size) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2084
  // Depends on cpCacheOop layout!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2085
  Label resolved;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2086
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2087
  __ get_cache_and_index_at_bcp(Rcache, index, 1, index_size);
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2088
  if (byte_no == f1_oop) {
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2089
    // We are resolved if the f1 field contains a non-null object (CallSite, etc.)
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2090
    // This kind of CP cache entry does not need to match the flags byte, because
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2091
    // there is a 1-1 relation between bytecode type and CP entry type.
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2092
    assert_different_registers(result, Rcache);
5416
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  2093
    __ ld_ptr(Rcache, constantPoolCacheOopDesc::base_offset() +
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2094
              ConstantPoolCacheEntry::f1_offset(), result);
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2095
    __ tst(result);
5416
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  2096
    __ br(Assembler::notEqual, false, Assembler::pt, resolved);
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  2097
    __ delayed()->set((int)bytecode(), O1);
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  2098
  } else {
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2099
    assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range");
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2100
    assert(result == noreg, "");  //else change code for setting result
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2101
    const int shift_count = (1 + byte_no)*BitsPerByte;
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2102
5416
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  2103
    __ ld_ptr(Rcache, constantPoolCacheOopDesc::base_offset() +
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  2104
              ConstantPoolCacheEntry::indices_offset(), Lbyte_code);
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  2105
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  2106
    __ srl(  Lbyte_code, shift_count, Lbyte_code );
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  2107
    __ and3( Lbyte_code,        0xFF, Lbyte_code );
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  2108
    __ cmp(  Lbyte_code, (int)bytecode());
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  2109
    __ br(   Assembler::equal, false, Assembler::pt, resolved);
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  2110
    __ delayed()->set((int)bytecode(), O1);
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  2111
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2112
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2113
  address entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2114
  switch (bytecode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2115
    case Bytecodes::_getstatic      : // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2116
    case Bytecodes::_putstatic      : // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2117
    case Bytecodes::_getfield       : // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2118
    case Bytecodes::_putfield       : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_get_put); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2119
    case Bytecodes::_invokevirtual  : // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2120
    case Bytecodes::_invokespecial  : // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2121
    case Bytecodes::_invokestatic   : // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2122
    case Bytecodes::_invokeinterface: entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invoke);  break;
5416
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  2123
    case Bytecodes::_invokedynamic  : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invokedynamic);  break;
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
  2124
    case Bytecodes::_fast_aldc      : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_ldc);     break;
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
  2125
    case Bytecodes::_fast_aldc_w    : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_ldc);     break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2126
    default                         : ShouldNotReachHere();                                 break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2127
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2128
  // first time invocation - must resolve first
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2129
  __ call_VM(noreg, entry, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2130
  // Update registers with resolved info
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2131
  __ get_cache_and_index_at_bcp(Rcache, index, 1, index_size);
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2132
  if (result != noreg)
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2133
    __ ld_ptr(Rcache, constantPoolCacheOopDesc::base_offset() +
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2134
              ConstantPoolCacheEntry::f1_offset(), result);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2135
  __ bind(resolved);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2136
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2137
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2138
void TemplateTable::load_invoke_cp_cache_entry(int byte_no,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2139
                                               Register Rmethod,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2140
                                               Register Ritable_index,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2141
                                               Register Rflags,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2142
                                               bool is_invokevirtual,
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2143
                                               bool is_invokevfinal,
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2144
                                               bool is_invokedynamic) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2145
  // Uses both G3_scratch and G4_scratch
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2146
  Register Rcache = G3_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2147
  Register Rscratch = G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2148
  assert_different_registers(Rcache, Rmethod, Ritable_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2149
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2150
  ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2151
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2152
  // determine constant pool cache field offsets
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2153
  const int method_offset = in_bytes(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2154
    cp_base_offset +
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2155
      (is_invokevirtual
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2156
       ? ConstantPoolCacheEntry::f2_offset()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2157
       : ConstantPoolCacheEntry::f1_offset()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2158
      )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2159
    );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2160
  const int flags_offset = in_bytes(cp_base_offset +
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2161
                                    ConstantPoolCacheEntry::flags_offset());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2162
  // access constant pool cache fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2163
  const int index_offset = in_bytes(cp_base_offset +
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2164
                                    ConstantPoolCacheEntry::f2_offset());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2165
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2166
  if (is_invokevfinal) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2167
    __ get_cache_and_index_at_bcp(Rcache, Rscratch, 1);
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2168
    __ ld_ptr(Rcache, method_offset, Rmethod);
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2169
  } else if (byte_no == f1_oop) {
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2170
    // Resolved f1_oop goes directly into 'method' register.
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2171
    resolve_cache_and_index(byte_no, Rmethod, Rcache, Rscratch, sizeof(u4));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2172
  } else {
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2173
    resolve_cache_and_index(byte_no, noreg, Rcache, Rscratch, sizeof(u2));
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2174
    __ ld_ptr(Rcache, method_offset, Rmethod);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2175
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2176
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2177
  if (Ritable_index != noreg) {
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2178
    __ ld_ptr(Rcache, index_offset, Ritable_index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2179
  }
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2180
  __ ld_ptr(Rcache, flags_offset, Rflags);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2181
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2182
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2183
// The Rcache register must be set before call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2184
void TemplateTable::load_field_cp_cache_entry(Register Robj,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2185
                                              Register Rcache,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2186
                                              Register index,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2187
                                              Register Roffset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2188
                                              Register Rflags,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2189
                                              bool is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2190
  assert_different_registers(Rcache, Rflags, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2191
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2192
  ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2193
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2194
  __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::flags_offset(), Rflags);
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2195
  __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Roffset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2196
  if (is_static) {
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2197
    __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f1_offset(), Robj);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2198
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2199
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2200
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2201
// The registers Rcache and index expected to be set before call.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2202
// Correct values of the Rcache and index registers are preserved.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2203
void TemplateTable::jvmti_post_field_access(Register Rcache,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2204
                                            Register index,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2205
                                            bool is_static,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2206
                                            bool has_tos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2207
  ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2208
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2209
  if (JvmtiExport::can_post_field_access()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2210
    // Check to see if a field access watch has been set before we take
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2211
    // the time to call into the VM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2212
    Label Label1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2213
    assert_different_registers(Rcache, index, G1_scratch);
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2214
    AddressLiteral get_field_access_count_addr(JvmtiExport::get_field_access_count_addr());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2215
    __ load_contents(get_field_access_count_addr, G1_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2216
    __ tst(G1_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2217
    __ br(Assembler::zero, false, Assembler::pt, Label1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2218
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2219
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2220
    __ add(Rcache, in_bytes(cp_base_offset), Rcache);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2221
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2222
    if (is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2223
      __ clr(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2224
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2225
      if (has_tos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2226
      // save object pointer before call_VM() clobbers it
1603
720c1119ad5e 6474243: suspicious jvmti code that uses oop unsafely across GC point
coleenp
parents: 1388
diff changeset
  2227
        __ push_ptr(Otos_i);  // put object on tos where GC wants it.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2228
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2229
        // Load top of stack (do not pop the value off the stack);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2230
        __ ld_ptr(Lesp, Interpreter::expr_offset_in_bytes(0), Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2231
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2232
      __ verify_oop(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2233
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2234
    // Otos_i: object pointer or NULL if static
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2235
    // Rcache: cache entry pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2236
    __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2237
               Otos_i, Rcache);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2238
    if (!is_static && has_tos) {
1603
720c1119ad5e 6474243: suspicious jvmti code that uses oop unsafely across GC point
coleenp
parents: 1388
diff changeset
  2239
      __ pop_ptr(Otos_i);  // restore object pointer
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2240
      __ verify_oop(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2241
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2242
    __ get_cache_and_index_at_bcp(Rcache, index, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2243
    __ bind(Label1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2244
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2245
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2246
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2247
void TemplateTable::getfield_or_static(int byte_no, bool is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2248
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2249
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2250
  Register Rcache = G3_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2251
  Register index  = G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2252
  Register Rclass = Rcache;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2253
  Register Roffset= G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2254
  Register Rflags = G1_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2255
  ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2256
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2257
  resolve_cache_and_index(byte_no, noreg, Rcache, index, sizeof(u2));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2258
  jvmti_post_field_access(Rcache, index, is_static, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2259
  load_field_cp_cache_entry(Rclass, Rcache, index, Roffset, Rflags, is_static);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2260
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2261
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2262
    pop_and_check_object(Rclass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2263
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2264
    __ verify_oop(Rclass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2265
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2266
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2267
  Label exit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2268
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2269
  Assembler::Membar_mask_bits membar_bits =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2270
    Assembler::Membar_mask_bits(Assembler::LoadLoad | Assembler::LoadStore);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2271
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2272
  if (__ membar_has_effect(membar_bits)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2273
    // Get volatile flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2274
    __ set((1 << ConstantPoolCacheEntry::volatileField), Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2275
    __ and3(Rflags, Lscratch, Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2276
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2277
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2278
  Label checkVolatile;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2279
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2280
  // compute field type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2281
  Label notByte, notInt, notShort, notChar, notLong, notFloat, notObj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2282
  __ srl(Rflags, ConstantPoolCacheEntry::tosBits, Rflags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2283
  // Make sure we don't need to mask Rflags for tosBits after the above shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
  ConstantPoolCacheEntry::verify_tosBits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2285
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2286
  // Check atos before itos for getstatic, more likely (in Queens at least)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2287
  __ cmp(Rflags, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2288
  __ br(Assembler::notEqual, false, Assembler::pt, notObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2289
  __ delayed() ->cmp(Rflags, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2290
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2291
  // atos
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  2292
  __ load_heap_oop(Rclass, Roffset, Otos_i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2293
  __ verify_oop(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2294
  __ push(atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2295
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2296
    patch_bytecode(Bytecodes::_fast_agetfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2297
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2298
  __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2299
  __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2300
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2301
  __ bind(notObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2302
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2303
  // cmp(Rflags, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2304
  __ br(Assembler::notEqual, false, Assembler::pt, notInt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2305
  __ delayed() ->cmp(Rflags, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2306
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2307
  // itos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2308
  __ ld(Rclass, Roffset, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2309
  __ push(itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2310
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2311
    patch_bytecode(Bytecodes::_fast_igetfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2312
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2313
  __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2314
  __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2315
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2316
  __ bind(notInt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2317
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2318
  // cmp(Rflags, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2319
  __ br(Assembler::notEqual, false, Assembler::pt, notLong);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2320
  __ delayed() ->cmp(Rflags, btos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2321
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2322
  // ltos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2323
  // load must be atomic
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2324
  __ ld_long(Rclass, Roffset, Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2325
  __ push(ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2326
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2327
    patch_bytecode(Bytecodes::_fast_lgetfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2328
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2329
  __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2330
  __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2331
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2332
  __ bind(notLong);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2333
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2334
  // cmp(Rflags, btos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2335
  __ br(Assembler::notEqual, false, Assembler::pt, notByte);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2336
  __ delayed() ->cmp(Rflags, ctos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2337
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2338
  // btos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2339
  __ ldsb(Rclass, Roffset, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2340
  __ push(itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2341
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2342
    patch_bytecode(Bytecodes::_fast_bgetfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2343
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2344
  __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2345
  __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2346
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2347
  __ bind(notByte);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2348
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2349
  // cmp(Rflags, ctos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2350
  __ br(Assembler::notEqual, false, Assembler::pt, notChar);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2351
  __ delayed() ->cmp(Rflags, stos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2352
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2353
  // ctos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2354
  __ lduh(Rclass, Roffset, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2355
  __ push(itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2356
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2357
    patch_bytecode(Bytecodes::_fast_cgetfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2358
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2359
  __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2360
  __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2361
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2362
  __ bind(notChar);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2363
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2364
  // cmp(Rflags, stos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2365
  __ br(Assembler::notEqual, false, Assembler::pt, notShort);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2366
  __ delayed() ->cmp(Rflags, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2367
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2368
  // stos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2369
  __ ldsh(Rclass, Roffset, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2370
  __ push(itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2371
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2372
    patch_bytecode(Bytecodes::_fast_sgetfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2373
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2374
  __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2375
  __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2376
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2377
  __ bind(notShort);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2378
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2379
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2380
  // cmp(Rflags, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2381
  __ br(Assembler::notEqual, false, Assembler::pt, notFloat);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2382
  __ delayed() ->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2383
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2384
  // ftos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2385
  __ ldf(FloatRegisterImpl::S, Rclass, Roffset, Ftos_f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2386
  __ push(ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2387
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2388
    patch_bytecode(Bytecodes::_fast_fgetfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2389
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2390
  __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2391
  __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2392
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2393
  __ bind(notFloat);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2394
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2395
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2396
  // dtos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2397
  __ ldf(FloatRegisterImpl::D, Rclass, Roffset, Ftos_d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2398
  __ push(dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2399
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2400
    patch_bytecode(Bytecodes::_fast_dgetfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2401
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2402
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2403
  __ bind(checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2404
  if (__ membar_has_effect(membar_bits)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2405
    // __ tst(Lscratch); executed in delay slot
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2406
    __ br(Assembler::zero, false, Assembler::pt, exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2407
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2408
    volatile_barrier(membar_bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2409
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2410
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2411
  __ bind(exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2412
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2413
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2414
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2415
void TemplateTable::getfield(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2416
  getfield_or_static(byte_no, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2417
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2418
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2419
void TemplateTable::getstatic(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2420
  getfield_or_static(byte_no, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2421
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2422
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2423
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2424
void TemplateTable::fast_accessfield(TosState state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2425
  transition(atos, state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2426
  Register Rcache  = G3_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2427
  Register index   = G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2428
  Register Roffset = G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2429
  Register Rflags  = Rcache;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2430
  ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2431
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2432
  __ get_cache_and_index_at_bcp(Rcache, index, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2433
  jvmti_post_field_access(Rcache, index, /*is_static*/false, /*has_tos*/true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2434
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2435
  __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Roffset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2436
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2437
  __ null_check(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2438
  __ verify_oop(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2439
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2440
  Label exit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2441
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2442
  Assembler::Membar_mask_bits membar_bits =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2443
    Assembler::Membar_mask_bits(Assembler::LoadLoad | Assembler::LoadStore);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2444
  if (__ membar_has_effect(membar_bits)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2445
    // Get volatile flag
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2446
    __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Rflags);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2447
    __ set((1 << ConstantPoolCacheEntry::volatileField), Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2448
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2449
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2450
  switch (bytecode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2451
    case Bytecodes::_fast_bgetfield:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2452
      __ ldsb(Otos_i, Roffset, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2453
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2454
    case Bytecodes::_fast_cgetfield:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2455
      __ lduh(Otos_i, Roffset, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2456
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2457
    case Bytecodes::_fast_sgetfield:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2458
      __ ldsh(Otos_i, Roffset, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2459
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2460
    case Bytecodes::_fast_igetfield:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2461
      __ ld(Otos_i, Roffset, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2462
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2463
    case Bytecodes::_fast_lgetfield:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2464
      __ ld_long(Otos_i, Roffset, Otos_l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2465
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2466
    case Bytecodes::_fast_fgetfield:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2467
      __ ldf(FloatRegisterImpl::S, Otos_i, Roffset, Ftos_f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2468
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2469
    case Bytecodes::_fast_dgetfield:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2470
      __ ldf(FloatRegisterImpl::D, Otos_i, Roffset, Ftos_d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2471
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2472
    case Bytecodes::_fast_agetfield:
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  2473
      __ load_heap_oop(Otos_i, Roffset, Otos_i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2474
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2475
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2476
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2477
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2478
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2479
  if (__ membar_has_effect(membar_bits)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2480
    __ btst(Lscratch, Rflags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2481
    __ br(Assembler::zero, false, Assembler::pt, exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2482
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2483
    volatile_barrier(membar_bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2484
    __ bind(exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2485
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2486
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2487
  if (state == atos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2488
    __ verify_oop(Otos_i);    // does not blow flags!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2489
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2490
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2491
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2492
void TemplateTable::jvmti_post_fast_field_mod() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2493
  if (JvmtiExport::can_post_field_modification()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2494
    // Check to see if a field modification watch has been set before we take
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2495
    // the time to call into the VM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2496
    Label done;
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2497
    AddressLiteral get_field_modification_count_addr(JvmtiExport::get_field_modification_count_addr());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2498
    __ load_contents(get_field_modification_count_addr, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2499
    __ tst(G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2500
    __ br(Assembler::zero, false, Assembler::pt, done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2501
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2502
    __ pop_ptr(G4_scratch);     // copy the object pointer from tos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2503
    __ verify_oop(G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2504
    __ push_ptr(G4_scratch);    // put the object pointer back on tos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2505
    __ get_cache_entry_pointer_at_bcp(G1_scratch, G3_scratch, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2506
    // Save tos values before call_VM() clobbers them. Since we have
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2507
    // to do it for every data type, we use the saved values as the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2508
    // jvalue object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2509
    switch (bytecode()) {  // save tos values before call_VM() clobbers them
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2510
    case Bytecodes::_fast_aputfield: __ push_ptr(Otos_i); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2511
    case Bytecodes::_fast_bputfield: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2512
    case Bytecodes::_fast_sputfield: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2513
    case Bytecodes::_fast_cputfield: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2514
    case Bytecodes::_fast_iputfield: __ push_i(Otos_i); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2515
    case Bytecodes::_fast_dputfield: __ push_d(Ftos_d); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2516
    case Bytecodes::_fast_fputfield: __ push_f(Ftos_f); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2517
    // get words in right order for use as jvalue object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2518
    case Bytecodes::_fast_lputfield: __ push_l(Otos_l); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2519
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2520
    // setup pointer to jvalue object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2521
    __ mov(Lesp, G3_scratch);  __ inc(G3_scratch, wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2522
    // G4_scratch:  object pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2523
    // G1_scratch: cache entry pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2524
    // G3_scratch: jvalue object on the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2525
    __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification), G4_scratch, G1_scratch, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2526
    switch (bytecode()) {             // restore tos values
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2527
    case Bytecodes::_fast_aputfield: __ pop_ptr(Otos_i); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2528
    case Bytecodes::_fast_bputfield: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2529
    case Bytecodes::_fast_sputfield: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2530
    case Bytecodes::_fast_cputfield: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2531
    case Bytecodes::_fast_iputfield: __ pop_i(Otos_i); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2532
    case Bytecodes::_fast_dputfield: __ pop_d(Ftos_d); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2533
    case Bytecodes::_fast_fputfield: __ pop_f(Ftos_f); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2534
    case Bytecodes::_fast_lputfield: __ pop_l(Otos_l); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2535
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2536
    __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2537
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2538
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2539
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2540
// The registers Rcache and index expected to be set before call.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2541
// The function may destroy various registers, just not the Rcache and index registers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2542
void TemplateTable::jvmti_post_field_mod(Register Rcache, Register index, bool is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2543
  ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2544
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2545
  if (JvmtiExport::can_post_field_modification()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2546
    // Check to see if a field modification watch has been set before we take
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2547
    // the time to call into the VM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2548
    Label Label1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2549
    assert_different_registers(Rcache, index, G1_scratch);
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2550
    AddressLiteral get_field_modification_count_addr(JvmtiExport::get_field_modification_count_addr());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2551
    __ load_contents(get_field_modification_count_addr, G1_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2552
    __ tst(G1_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2553
    __ br(Assembler::zero, false, Assembler::pt, Label1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2554
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2555
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2556
    // The Rcache and index registers have been already set.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2557
    // This allows to eliminate this call but the Rcache and index
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2558
    // registers must be correspondingly used after this line.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2559
    __ get_cache_and_index_at_bcp(G1_scratch, G4_scratch, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2560
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2561
    __ add(G1_scratch, in_bytes(cp_base_offset), G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2562
    if (is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2563
      // Life is simple.  Null out the object pointer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2564
      __ clr(G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2565
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2566
      Register Rflags = G1_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2567
      // Life is harder. The stack holds the value on top, followed by the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2568
      // object.  We don't know the size of the value, though; it could be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2569
      // one or two words depending on its type. As a result, we must find
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2570
      // the type to determine where the object is.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2571
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2572
      Label two_word, valsizeknown;
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2573
      __ ld_ptr(G1_scratch, cp_base_offset + ConstantPoolCacheEntry::flags_offset(), Rflags);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2574
      __ mov(Lesp, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2575
      __ srl(Rflags, ConstantPoolCacheEntry::tosBits, Rflags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2576
      // Make sure we don't need to mask Rflags for tosBits after the above shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2577
      ConstantPoolCacheEntry::verify_tosBits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2578
      __ cmp(Rflags, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2579
      __ br(Assembler::equal, false, Assembler::pt, two_word);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2580
      __ delayed()->cmp(Rflags, dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2581
      __ br(Assembler::equal, false, Assembler::pt, two_word);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2582
      __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2583
      __ inc(G4_scratch, Interpreter::expr_offset_in_bytes(1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2584
      __ br(Assembler::always, false, Assembler::pt, valsizeknown);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2585
      __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2586
      __ bind(two_word);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2587
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2588
      __ inc(G4_scratch, Interpreter::expr_offset_in_bytes(2));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2589
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2590
      __ bind(valsizeknown);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2591
      // setup object pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2592
      __ ld_ptr(G4_scratch, 0, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2593
      __ verify_oop(G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2594
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2595
    // setup pointer to jvalue object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2596
    __ mov(Lesp, G1_scratch);  __ inc(G1_scratch, wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2597
    // G4_scratch:  object pointer or NULL if static
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2598
    // G3_scratch: cache entry pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2599
    // G1_scratch: jvalue object on the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2600
    __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2601
               G4_scratch, G3_scratch, G1_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2602
    __ get_cache_and_index_at_bcp(Rcache, index, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2603
    __ bind(Label1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2604
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2605
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2606
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2607
void TemplateTable::pop_and_check_object(Register r) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2608
  __ pop_ptr(r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2609
  __ null_check(r);  // for field access must check obj.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2610
  __ verify_oop(r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2611
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2612
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2613
void TemplateTable::putfield_or_static(int byte_no, bool is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2614
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2615
  Register Rcache = G3_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2616
  Register index  = G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2617
  Register Rclass = Rcache;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2618
  Register Roffset= G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2619
  Register Rflags = G1_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2620
  ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2621
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2622
  resolve_cache_and_index(byte_no, noreg, Rcache, index, sizeof(u2));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2623
  jvmti_post_field_mod(Rcache, index, is_static);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2624
  load_field_cp_cache_entry(Rclass, Rcache, index, Roffset, Rflags, is_static);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2625
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2626
  Assembler::Membar_mask_bits read_bits =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2627
    Assembler::Membar_mask_bits(Assembler::LoadStore | Assembler::StoreStore);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2628
  Assembler::Membar_mask_bits write_bits = Assembler::StoreLoad;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2629
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2630
  Label notVolatile, checkVolatile, exit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2631
  if (__ membar_has_effect(read_bits) || __ membar_has_effect(write_bits)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2632
    __ set((1 << ConstantPoolCacheEntry::volatileField), Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2633
    __ and3(Rflags, Lscratch, Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2634
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2635
    if (__ membar_has_effect(read_bits)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2636
      __ tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2637
      __ br(Assembler::zero, false, Assembler::pt, notVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2638
      __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2639
      volatile_barrier(read_bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2640
      __ bind(notVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2641
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2642
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2643
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2644
  __ srl(Rflags, ConstantPoolCacheEntry::tosBits, Rflags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2645
  // Make sure we don't need to mask Rflags for tosBits after the above shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2646
  ConstantPoolCacheEntry::verify_tosBits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2647
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2648
  // compute field type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2649
  Label notInt, notShort, notChar, notObj, notByte, notLong, notFloat;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2650
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2651
  if (is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2652
    // putstatic with object type most likely, check that first
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2653
    __ cmp(Rflags, atos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2654
    __ br(Assembler::notEqual, false, Assembler::pt, notObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2655
    __ delayed() ->cmp(Rflags, itos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2656
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2657
    // atos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2658
    __ pop_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2659
    __ verify_oop(Otos_i);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2660
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2661
    do_oop_store(_masm, Rclass, Roffset, 0, Otos_i, G1_scratch, _bs->kind(), false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2662
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2663
    __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2664
    __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2665
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2666
    __ bind(notObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2667
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2668
    // cmp(Rflags, itos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2669
    __ br(Assembler::notEqual, false, Assembler::pt, notInt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2670
    __ delayed() ->cmp(Rflags, btos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2671
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2672
    // itos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2673
    __ pop_i();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2674
    __ st(Otos_i, Rclass, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2675
    __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2676
    __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2677
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2678
    __ bind(notInt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2679
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2680
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2681
    // putfield with int type most likely, check that first
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2682
    __ cmp(Rflags, itos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2683
    __ br(Assembler::notEqual, false, Assembler::pt, notInt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2684
    __ delayed() ->cmp(Rflags, atos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2685
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2686
    // itos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2687
    __ pop_i();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2688
    pop_and_check_object(Rclass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2689
    __ st(Otos_i, Rclass, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2690
    patch_bytecode(Bytecodes::_fast_iputfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2691
    __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2692
    __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2693
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2694
    __ bind(notInt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2695
    // cmp(Rflags, atos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2696
    __ br(Assembler::notEqual, false, Assembler::pt, notObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2697
    __ delayed() ->cmp(Rflags, btos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2698
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2699
    // atos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2700
    __ pop_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2701
    pop_and_check_object(Rclass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2702
    __ verify_oop(Otos_i);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2703
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2704
    do_oop_store(_masm, Rclass, Roffset, 0, Otos_i, G1_scratch, _bs->kind(), false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2705
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2706
    patch_bytecode(Bytecodes::_fast_aputfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2707
    __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2708
    __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2709
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2710
    __ bind(notObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2711
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2712
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2713
  // cmp(Rflags, btos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2714
  __ br(Assembler::notEqual, false, Assembler::pt, notByte);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2715
  __ delayed() ->cmp(Rflags, ltos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2716
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2717
  // btos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2718
  __ pop_i();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2719
  if (!is_static) pop_and_check_object(Rclass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2720
  __ stb(Otos_i, Rclass, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2721
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2722
    patch_bytecode(Bytecodes::_fast_bputfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2723
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2724
  __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2725
  __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2726
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2727
  __ bind(notByte);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2728
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2729
  // cmp(Rflags, ltos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2730
  __ br(Assembler::notEqual, false, Assembler::pt, notLong);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2731
  __ delayed() ->cmp(Rflags, ctos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2732
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2733
  // ltos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2734
  __ pop_l();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2735
  if (!is_static) pop_and_check_object(Rclass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2736
  __ st_long(Otos_l, Rclass, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2737
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2738
    patch_bytecode(Bytecodes::_fast_lputfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2739
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2740
  __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2741
  __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2742
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2743
  __ bind(notLong);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2744
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2745
  // cmp(Rflags, ctos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2746
  __ br(Assembler::notEqual, false, Assembler::pt, notChar);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2747
  __ delayed() ->cmp(Rflags, stos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2748
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2749
  // ctos (char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2750
  __ pop_i();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2751
  if (!is_static) pop_and_check_object(Rclass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2752
  __ sth(Otos_i, Rclass, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2753
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2754
    patch_bytecode(Bytecodes::_fast_cputfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2755
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2756
  __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2757
  __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2758
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2759
  __ bind(notChar);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2760
  // cmp(Rflags, stos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2761
  __ br(Assembler::notEqual, false, Assembler::pt, notShort);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2762
  __ delayed() ->cmp(Rflags, ftos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2763
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2764
  // stos (char)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2765
  __ pop_i();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2766
  if (!is_static) pop_and_check_object(Rclass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2767
  __ sth(Otos_i, Rclass, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2768
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2769
    patch_bytecode(Bytecodes::_fast_sputfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2770
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2771
  __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2772
  __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2773
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2774
  __ bind(notShort);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2775
  // cmp(Rflags, ftos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2776
  __ br(Assembler::notZero, false, Assembler::pt, notFloat);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2777
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2778
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2779
  // ftos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2780
  __ pop_f();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2781
  if (!is_static) pop_and_check_object(Rclass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2782
  __ stf(FloatRegisterImpl::S, Ftos_f, Rclass, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2783
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2784
    patch_bytecode(Bytecodes::_fast_fputfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2785
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2786
  __ ba(false, checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2787
  __ delayed()->tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2788
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2789
  __ bind(notFloat);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2790
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2791
  // dtos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2792
  __ pop_d();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2793
  if (!is_static) pop_and_check_object(Rclass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2794
  __ stf(FloatRegisterImpl::D, Ftos_d, Rclass, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2795
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2796
    patch_bytecode(Bytecodes::_fast_dputfield, G3_scratch, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2797
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2798
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2799
  __ bind(checkVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2800
  __ tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2801
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2802
  if (__ membar_has_effect(write_bits)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2803
    // __ tst(Lscratch); in delay slot
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2804
    __ br(Assembler::zero, false, Assembler::pt, exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2805
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2806
    volatile_barrier(Assembler::StoreLoad);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2807
    __ bind(exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2808
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2809
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2810
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2811
void TemplateTable::fast_storefield(TosState state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2812
  transition(state, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2813
  Register Rcache = G3_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2814
  Register Rclass = Rcache;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2815
  Register Roffset= G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2816
  Register Rflags = G1_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2817
  ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2818
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2819
  jvmti_post_fast_field_mod();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2820
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2821
  __ get_cache_and_index_at_bcp(Rcache, G4_scratch, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2822
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2823
  Assembler::Membar_mask_bits read_bits =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2824
    Assembler::Membar_mask_bits(Assembler::LoadStore | Assembler::StoreStore);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2825
  Assembler::Membar_mask_bits write_bits = Assembler::StoreLoad;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2826
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2827
  Label notVolatile, checkVolatile, exit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2828
  if (__ membar_has_effect(read_bits) || __ membar_has_effect(write_bits)) {
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2829
    __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::flags_offset(), Rflags);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2830
    __ set((1 << ConstantPoolCacheEntry::volatileField), Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2831
    __ and3(Rflags, Lscratch, Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2832
    if (__ membar_has_effect(read_bits)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2833
      __ tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2834
      __ br(Assembler::zero, false, Assembler::pt, notVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2835
      __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2836
      volatile_barrier(read_bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2837
      __ bind(notVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2838
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2839
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2840
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2841
  __ ld_ptr(Rcache, cp_base_offset + ConstantPoolCacheEntry::f2_offset(), Roffset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2842
  pop_and_check_object(Rclass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2843
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2844
  switch (bytecode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2845
    case Bytecodes::_fast_bputfield: __ stb(Otos_i, Rclass, Roffset); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2846
    case Bytecodes::_fast_cputfield: /* fall through */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2847
    case Bytecodes::_fast_sputfield: __ sth(Otos_i, Rclass, Roffset); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2848
    case Bytecodes::_fast_iputfield: __ st(Otos_i, Rclass, Roffset);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2849
    case Bytecodes::_fast_lputfield: __ st_long(Otos_l, Rclass, Roffset); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2850
    case Bytecodes::_fast_fputfield:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2851
      __ stf(FloatRegisterImpl::S, Ftos_f, Rclass, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2852
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2853
    case Bytecodes::_fast_dputfield:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2854
      __ stf(FloatRegisterImpl::D, Ftos_d, Rclass, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2855
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2856
    case Bytecodes::_fast_aputfield:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2857
      do_oop_store(_masm, Rclass, Roffset, 0, Otos_i, G1_scratch, _bs->kind(), false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2858
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2859
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2860
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2861
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2862
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2863
  if (__ membar_has_effect(write_bits)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2864
    __ tst(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2865
    __ br(Assembler::zero, false, Assembler::pt, exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2866
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2867
    volatile_barrier(Assembler::StoreLoad);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2868
    __ bind(exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2869
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2870
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2871
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2872
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2873
void TemplateTable::putfield(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2874
  putfield_or_static(byte_no, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2875
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2876
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2877
void TemplateTable::putstatic(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2878
  putfield_or_static(byte_no, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2879
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2880
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2881
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2882
void TemplateTable::fast_xaccess(TosState state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2883
  transition(vtos, state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2884
  Register Rcache = G3_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2885
  Register Roffset = G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2886
  Register Rflags  = G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2887
  Register Rreceiver = Lscratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2888
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  2889
  __ ld_ptr(Llocals, 0, Rreceiver);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2890
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2891
  // access constant pool cache  (is resolved)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2892
  __ get_cache_and_index_at_bcp(Rcache, G4_scratch, 2);
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2893
  __ ld_ptr(Rcache, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f2_offset(), Roffset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2894
  __ add(Lbcp, 1, Lbcp);       // needed to report exception at the correct bcp
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2895
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2896
  __ verify_oop(Rreceiver);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2897
  __ null_check(Rreceiver);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2898
  if (state == atos) {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  2899
    __ load_heap_oop(Rreceiver, Roffset, Otos_i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2900
  } else if (state == itos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2901
    __ ld (Rreceiver, Roffset, Otos_i) ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2902
  } else if (state == ftos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2903
    __ ldf(FloatRegisterImpl::S, Rreceiver, Roffset, Ftos_f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2904
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2905
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2906
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2907
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2908
  Assembler::Membar_mask_bits membar_bits =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2909
    Assembler::Membar_mask_bits(Assembler::LoadLoad | Assembler::LoadStore);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2910
  if (__ membar_has_effect(membar_bits)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2911
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2912
    // Get is_volatile value in Rflags and check if membar is needed
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2913
    __ ld_ptr(Rcache, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::flags_offset(), Rflags);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2914
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2915
    // Test volatile
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2916
    Label notVolatile;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2917
    __ set((1 << ConstantPoolCacheEntry::volatileField), Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2918
    __ btst(Rflags, Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2919
    __ br(Assembler::zero, false, Assembler::pt, notVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2920
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2921
    volatile_barrier(membar_bits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2922
    __ bind(notVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2923
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2924
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2925
  __ interp_verify_oop(Otos_i, state, __FILE__, __LINE__);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2926
  __ sub(Lbcp, 1, Lbcp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2927
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2928
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2929
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2930
// Calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2931
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2932
void TemplateTable::count_calls(Register method, Register temp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2933
  // implemented elsewhere
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2934
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2935
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2936
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2937
void TemplateTable::generate_vtable_call(Register Rrecv, Register Rindex, Register Rret) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2938
  Register Rtemp = G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2939
  Register Rcall = Rindex;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2940
  assert_different_registers(Rcall, G5_method, Gargs, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2941
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2942
  // get target methodOop & entry point
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2943
  const int base = instanceKlass::vtable_start_offset() * wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2944
  if (vtableEntry::size() % 3 == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2945
    // scale the vtable index by 12:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2946
    int one_third = vtableEntry::size() / 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2947
    __ sll(Rindex, exact_log2(one_third * 1 * wordSize), Rtemp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2948
    __ sll(Rindex, exact_log2(one_third * 2 * wordSize), Rindex);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2949
    __ add(Rindex, Rtemp, Rindex);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2950
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2951
    // scale the vtable index by 8:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2952
    __ sll(Rindex, exact_log2(vtableEntry::size() * wordSize), Rindex);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2953
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2954
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2955
  __ add(Rrecv, Rindex, Rrecv);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2956
  __ ld_ptr(Rrecv, base + vtableEntry::method_offset_in_bytes(), G5_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2957
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2958
  __ call_from_interpreter(Rcall, Gargs, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2959
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2960
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2961
void TemplateTable::invokevirtual(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2962
  transition(vtos, vtos);
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2963
  assert(byte_no == f2_byte, "use this argument");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2964
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2965
  Register Rscratch = G3_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2966
  Register Rtemp = G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2967
  Register Rret = Lscratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2968
  Register Rrecv = G5_method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2969
  Label notFinal;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2970
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2971
  load_invoke_cp_cache_entry(byte_no, G5_method, noreg, Rret, true, false, false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2972
  __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2973
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2974
  // Check for vfinal
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2975
  __ set((1 << ConstantPoolCacheEntry::vfinalMethod), G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2976
  __ btst(Rret, G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2977
  __ br(Assembler::zero, false, Assembler::pt, notFinal);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2978
  __ delayed()->and3(Rret, 0xFF, G4_scratch);      // gets number of parameters
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2979
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2980
  patch_bytecode(Bytecodes::_fast_invokevfinal, Rscratch, Rtemp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2981
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2982
  invokevfinal_helper(Rscratch, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2983
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2984
  __ bind(notFinal);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2985
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2986
  __ mov(G5_method, Rscratch);  // better scratch register
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2987
  __ load_receiver(G4_scratch, O0);  // gets receiverOop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2988
  // receiver is in O0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2989
  __ verify_oop(O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2990
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2991
  // get return address
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2992
  AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  2993
  __ set(table, Rtemp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2994
  __ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret);          // get return type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2995
  // Make sure we don't need to mask Rret for tosBits after the above shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2996
  ConstantPoolCacheEntry::verify_tosBits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2997
  __ sll(Rret,  LogBytesPerWord, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2998
  __ ld_ptr(Rtemp, Rret, Rret);         // get return address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2999
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3000
  // get receiver klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3001
  __ null_check(O0, oopDesc::klass_offset_in_bytes());
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  3002
  __ load_klass(O0, Rrecv);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3003
  __ verify_oop(Rrecv);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3004
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3005
  __ profile_virtual_call(Rrecv, O4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3006
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3007
  generate_vtable_call(Rrecv, Rscratch, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3008
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3009
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3010
void TemplateTable::fast_invokevfinal(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3011
  transition(vtos, vtos);
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  3012
  assert(byte_no == f2_byte, "use this argument");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3013
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3014
  load_invoke_cp_cache_entry(byte_no, G5_method, noreg, Lscratch, true,
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  3015
                             /*is_invokevfinal*/true, false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3016
  __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3017
  invokevfinal_helper(G3_scratch, Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3018
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3019
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3020
void TemplateTable::invokevfinal_helper(Register Rscratch, Register Rret) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3021
  Register Rtemp = G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3022
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3023
  __ verify_oop(G5_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3024
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3025
  // Load receiver from stack slot
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  3026
  __ lduh(G5_method, in_bytes(methodOopDesc::size_of_parameters_offset()), G4_scratch);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3027
  __ load_receiver(G4_scratch, O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3028
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3029
  // receiver NULL check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3030
  __ null_check(O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3031
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3032
  __ profile_final_call(O4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3033
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3034
  // get return address
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  3035
  AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  3036
  __ set(table, Rtemp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3037
  __ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret);          // get return type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3038
  // Make sure we don't need to mask Rret for tosBits after the above shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3039
  ConstantPoolCacheEntry::verify_tosBits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3040
  __ sll(Rret,  LogBytesPerWord, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3041
  __ ld_ptr(Rtemp, Rret, Rret);         // get return address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3042
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3043
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3044
  // do the call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3045
  __ call_from_interpreter(Rscratch, Gargs, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3046
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3047
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3048
void TemplateTable::invokespecial(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3049
  transition(vtos, vtos);
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  3050
  assert(byte_no == f1_byte, "use this argument");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3051
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3052
  Register Rscratch = G3_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3053
  Register Rtemp = G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3054
  Register Rret = Lscratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3055
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  3056
  load_invoke_cp_cache_entry(byte_no, G5_method, noreg, Rret, /*virtual*/ false, false, false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3057
  __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3058
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3059
  __ verify_oop(G5_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3060
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  3061
  __ lduh(G5_method, in_bytes(methodOopDesc::size_of_parameters_offset()), G4_scratch);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3062
  __ load_receiver(G4_scratch, O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3063
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3064
  // receiver NULL check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3065
  __ null_check(O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3066
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3067
  __ profile_call(O4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3068
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3069
  // get return address
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  3070
  AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  3071
  __ set(table, Rtemp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3072
  __ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret);          // get return type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3073
  // Make sure we don't need to mask Rret for tosBits after the above shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3074
  ConstantPoolCacheEntry::verify_tosBits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3075
  __ sll(Rret,  LogBytesPerWord, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3076
  __ ld_ptr(Rtemp, Rret, Rret);         // get return address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3077
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3078
  // do the call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3079
  __ call_from_interpreter(Rscratch, Gargs, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3080
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3081
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3082
void TemplateTable::invokestatic(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3083
  transition(vtos, vtos);
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  3084
  assert(byte_no == f1_byte, "use this argument");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3085
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3086
  Register Rscratch = G3_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3087
  Register Rtemp = G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3088
  Register Rret = Lscratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3089
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  3090
  load_invoke_cp_cache_entry(byte_no, G5_method, noreg, Rret, /*virtual*/ false, false, false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3091
  __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3092
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3093
  __ verify_oop(G5_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3094
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3095
  __ profile_call(O4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3096
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3097
  // get return address
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  3098
  AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  3099
  __ set(table, Rtemp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3100
  __ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret);          // get return type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3101
  // Make sure we don't need to mask Rret for tosBits after the above shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3102
  ConstantPoolCacheEntry::verify_tosBits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3103
  __ sll(Rret,  LogBytesPerWord, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3104
  __ ld_ptr(Rtemp, Rret, Rret);         // get return address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3106
  // do the call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3107
  __ call_from_interpreter(Rscratch, Gargs, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3108
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3109
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3110
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3111
void TemplateTable::invokeinterface_object_method(Register RklassOop,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3112
                                                  Register Rcall,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3113
                                                  Register Rret,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3114
                                                  Register Rflags) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3115
  Register Rscratch = G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3116
  Register Rindex = Lscratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3117
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3118
  assert_different_registers(Rscratch, Rindex, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3119
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3120
  Label notFinal;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3121
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3122
  // Check for vfinal
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3123
  __ set((1 << ConstantPoolCacheEntry::vfinalMethod), Rscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3124
  __ btst(Rflags, Rscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3125
  __ br(Assembler::zero, false, Assembler::pt, notFinal);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3126
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3127
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3128
  __ profile_final_call(O4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3129
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3130
  // do the call - the index (f2) contains the methodOop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3131
  assert_different_registers(G5_method, Gargs, Rcall);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3132
  __ mov(Rindex, G5_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3133
  __ call_from_interpreter(Rcall, Gargs, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3134
  __ bind(notFinal);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3135
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3136
  __ profile_virtual_call(RklassOop, O4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3137
  generate_vtable_call(RklassOop, Rindex, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3138
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3139
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3140
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3141
void TemplateTable::invokeinterface(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3142
  transition(vtos, vtos);
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  3143
  assert(byte_no == f1_byte, "use this argument");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3144
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3145
  Register Rscratch = G4_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3146
  Register Rret = G3_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3147
  Register Rindex = Lscratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3148
  Register Rinterface = G1_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3149
  Register RklassOop = G5_method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3150
  Register Rflags = O1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3151
  assert_different_registers(Rscratch, G5_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3152
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  3153
  load_invoke_cp_cache_entry(byte_no, Rinterface, Rindex, Rflags, /*virtual*/ false, false, false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3154
  __ mov(SP, O5_savedSP); // record SP that we wanted the callee to restore
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3155
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3156
  // get receiver
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3157
  __ and3(Rflags, 0xFF, Rscratch);       // gets number of parameters
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3158
  __ load_receiver(Rscratch, O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3159
  __ verify_oop(O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3160
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3161
  __ mov(Rflags, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3162
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3163
  // get return address
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  3164
  AddressLiteral table(Interpreter::return_5_addrs_by_index_table());
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  3165
  __ set(table, Rscratch);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3166
  __ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret);          // get return type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3167
  // Make sure we don't need to mask Rret for tosBits after the above shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3168
  ConstantPoolCacheEntry::verify_tosBits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3169
  __ sll(Rret,  LogBytesPerWord, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3170
  __ ld_ptr(Rscratch, Rret, Rret);      // get return address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3171
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3172
  // get receiver klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3173
  __ null_check(O0, oopDesc::klass_offset_in_bytes());
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  3174
  __ load_klass(O0, RklassOop);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3175
  __ verify_oop(RklassOop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3176
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3177
  // Special case of invokeinterface called for virtual method of
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3178
  // java.lang.Object.  See cpCacheOop.cpp for details.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3179
  // This code isn't produced by javac, but could be produced by
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3180
  // another compliant java compiler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3181
  Label notMethod;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3182
  __ set((1 << ConstantPoolCacheEntry::methodInterface), Rscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3183
  __ btst(Rflags, Rscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3184
  __ br(Assembler::zero, false, Assembler::pt, notMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3185
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3186
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3187
  invokeinterface_object_method(RklassOop, Rinterface, Rret, Rflags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3188
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3189
  __ bind(notMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3190
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3191
  __ profile_virtual_call(RklassOop, O4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3192
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3193
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3194
  // find entry point to call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3195
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3196
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3197
  // compute start of first itableOffsetEntry (which is at end of vtable)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3198
  const int base = instanceKlass::vtable_start_offset() * wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3199
  Label search;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3200
  Register Rtemp = Rflags;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3201
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  3202
  __ ld(RklassOop, instanceKlass::vtable_length_offset() * wordSize, Rtemp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3203
  if (align_object_offset(1) > 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3204
    __ round_to(Rtemp, align_object_offset(1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3205
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3206
  __ sll(Rtemp, LogBytesPerWord, Rtemp);   // Rscratch *= 4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3207
  if (Assembler::is_simm13(base)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3208
    __ add(Rtemp, base, Rtemp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3209
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3210
    __ set(base, Rscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3211
    __ add(Rscratch, Rtemp, Rtemp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3212
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3213
  __ add(RklassOop, Rtemp, Rscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3214
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3215
  __ bind(search);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3216
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3217
  __ ld_ptr(Rscratch, itableOffsetEntry::interface_offset_in_bytes(), Rtemp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3218
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3219
    Label ok;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3220
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3221
    // Check that entry is non-null.  Null entries are probably a bytecode
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 1603
diff changeset
  3222
    // problem.  If the interface isn't implemented by the receiver class,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3223
    // the VM should throw IncompatibleClassChangeError.  linkResolver checks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3224
    // this too but that's only if the entry isn't already resolved, so we
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3225
    // need to check again.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3226
    __ br_notnull( Rtemp, false, Assembler::pt, ok);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3227
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3228
    call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeError));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3229
    __ should_not_reach_here();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3230
    __ bind(ok);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3231
    __ verify_oop(Rtemp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3232
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3233
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3234
  __ verify_oop(Rinterface);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3235
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3236
  __ cmp(Rinterface, Rtemp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3237
  __ brx(Assembler::notEqual, true, Assembler::pn, search);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3238
  __ delayed()->add(Rscratch, itableOffsetEntry::size() * wordSize, Rscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3239
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3240
  // entry found and Rscratch points to it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3241
  __ ld(Rscratch, itableOffsetEntry::offset_offset_in_bytes(), Rscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3242
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3243
  assert(itableMethodEntry::method_offset_in_bytes() == 0, "adjust instruction below");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3244
  __ sll(Rindex, exact_log2(itableMethodEntry::size() * wordSize), Rindex);       // Rindex *= 8;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3245
  __ add(Rscratch, Rindex, Rscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3246
  __ ld_ptr(RklassOop, Rscratch, G5_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3247
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3248
  // Check for abstract method error.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3249
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3250
    Label ok;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3251
    __ tst(G5_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3252
    __ brx(Assembler::notZero, false, Assembler::pt, ok);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3253
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3254
    call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3255
    __ should_not_reach_here();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3256
    __ bind(ok);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3257
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3258
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3259
  Register Rcall = Rinterface;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3260
  assert_different_registers(Rcall, G5_method, Gargs, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3261
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3262
  __ verify_oop(G5_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3263
  __ call_from_interpreter(Rcall, Gargs, Rret);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3264
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3265
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3266
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3267
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3268
void TemplateTable::invokedynamic(int byte_no) {
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3269
  transition(vtos, vtos);
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  3270
  assert(byte_no == f1_oop, "use this argument");
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3271
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3272
  if (!EnableInvokeDynamic) {
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3273
    // We should not encounter this bytecode if !EnableInvokeDynamic.
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3274
    // The verifier will stop it.  However, if we get past the verifier,
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3275
    // this will stop the thread in a reasonable way, without crashing the JVM.
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3276
    __ call_VM(noreg, CAST_FROM_FN_PTR(address,
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3277
                     InterpreterRuntime::throw_IncompatibleClassChangeError));
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3278
    // the call_VM checks for exception, so we should never return here.
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3279
    __ should_not_reach_here();
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3280
    return;
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3281
  }
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3282
5416
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3283
  // G5: CallSite object (f1)
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3284
  // XX: unused (f2)
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3285
  // XX: flags (unused)
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3286
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3287
  Register G5_callsite = G5_method;
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3288
  Register Rscratch    = G3_scratch;
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3289
  Register Rtemp       = G1_scratch;
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3290
  Register Rret        = Lscratch;
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3291
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  3292
  load_invoke_cp_cache_entry(byte_no, G5_callsite, noreg, Rret,
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  3293
                             /*virtual*/ false, /*vfinal*/ false, /*indy*/ true);
5416
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3294
  __ mov(SP, O5_savedSP);  // record SP that we wanted the callee to restore
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3295
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3296
  __ verify_oop(G5_callsite);
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3297
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3298
  // profile this call
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3299
  __ profile_call(O4);
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3300
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3301
  // get return address
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3302
  AddressLiteral table(Interpreter::return_5_addrs_by_index_table());
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3303
  __ set(table, Rtemp);
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3304
  __ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret);  // get return type
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3305
  // Make sure we don't need to mask Rret for tosBits after the above shift
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3306
  ConstantPoolCacheEntry::verify_tosBits();
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3307
  __ sll(Rret, LogBytesPerWord, Rret);
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3308
  __ ld_ptr(Rtemp, Rret, Rret);  // get return address
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3309
8676
9098d4e927e1 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 7902
diff changeset
  3310
  __ load_heap_oop(G5_callsite, __ delayed_value(java_lang_invoke_CallSite::target_offset_in_bytes, Rscratch), G3_method_handle);
5416
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3311
  __ null_check(G3_method_handle);
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3312
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3313
  // Adjust Rret first so Llast_SP can be same as Rret
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3314
  __ add(Rret, -frame::pc_return_offset, O7);
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3315
  __ add(Lesp, BytesPerWord, Gargs);  // setup parameter pointer
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3316
  __ jump_to_method_handle_entry(G3_method_handle, Rtemp, /* emit_delayed_nop */ false);
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3317
  // Record SP so we can remove any stack space allocated by adapter transition
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 2572
diff changeset
  3318
  __ delayed()->mov(SP, Llast_SP);
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3319
}
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3320
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2131
diff changeset
  3321
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3322
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3323
// Allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3324
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3325
void TemplateTable::_new() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3326
  transition(vtos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3327
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3328
  Label slow_case;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3329
  Label done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3330
  Label initialize_header;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3331
  Label initialize_object;  // including clearing the fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3332
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3333
  Register RallocatedObject = Otos_i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3334
  Register RinstanceKlass = O1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3335
  Register Roffset = O3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3336
  Register Rscratch = O4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3337
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3338
  __ get_2_byte_integer_at_bcp(1, Rscratch, Roffset, InterpreterMacroAssembler::Unsigned);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3339
  __ get_cpool_and_tags(Rscratch, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3340
  // make sure the class we're about to instantiate has been resolved
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5882
diff changeset
  3341
  // This is done before loading instanceKlass to be consistent with the order
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5882
diff changeset
  3342
  // how Constant Pool is updated (see constantPoolOopDesc::klass_at_put)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3343
  __ add(G3_scratch, typeArrayOopDesc::header_size(T_BYTE) * wordSize, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3344
  __ ldub(G3_scratch, Roffset, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3345
  __ cmp(G3_scratch, JVM_CONSTANT_Class);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3346
  __ br(Assembler::notEqual, false, Assembler::pn, slow_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3347
  __ delayed()->sll(Roffset, LogBytesPerWord, Roffset);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5882
diff changeset
  3348
  // get instanceKlass
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3349
  //__ sll(Roffset, LogBytesPerWord, Roffset);        // executed in delay slot
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3350
  __ add(Roffset, sizeof(constantPoolOopDesc), Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3351
  __ ld_ptr(Rscratch, Roffset, RinstanceKlass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3352
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3353
  // make sure klass is fully initialized:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3354
  __ ld(RinstanceKlass, instanceKlass::init_state_offset_in_bytes() + sizeof(oopDesc), G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3355
  __ cmp(G3_scratch, instanceKlass::fully_initialized);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3356
  __ br(Assembler::notEqual, false, Assembler::pn, slow_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3357
  __ delayed()->ld(RinstanceKlass, Klass::layout_helper_offset_in_bytes() + sizeof(oopDesc), Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3358
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3359
  // get instance_size in instanceKlass (already aligned)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3360
  //__ ld(RinstanceKlass, Klass::layout_helper_offset_in_bytes() + sizeof(oopDesc), Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3361
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3362
  // make sure klass does not have has_finalizer, or is abstract, or interface or java/lang/Class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3363
  __ btst(Klass::_lh_instance_slow_path_bit, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3364
  __ br(Assembler::notZero, false, Assembler::pn, slow_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3365
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3366
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3367
  // allocate the instance
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3368
  // 1) Try to allocate in the TLAB
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3369
  // 2) if fail, and the TLAB is not full enough to discard, allocate in the shared Eden
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3370
  // 3) if the above fails (or is not applicable), go to a slow case
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3371
  // (creates a new TLAB, etc.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3372
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3373
  const bool allow_shared_alloc =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3374
    Universe::heap()->supports_inline_contig_alloc() && !CMSIncrementalMode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3375
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3376
  if(UseTLAB) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3377
    Register RoldTopValue = RallocatedObject;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3378
    Register RtopAddr = G3_scratch, RtlabWasteLimitValue = G3_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3379
    Register RnewTopValue = G1_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3380
    Register RendValue = Rscratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3381
    Register RfreeValue = RnewTopValue;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3382
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3383
    // check if we can allocate in the TLAB
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3384
    __ ld_ptr(G2_thread, in_bytes(JavaThread::tlab_top_offset()), RoldTopValue); // sets up RalocatedObject
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3385
    __ ld_ptr(G2_thread, in_bytes(JavaThread::tlab_end_offset()), RendValue);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3386
    __ add(RoldTopValue, Roffset, RnewTopValue);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3387
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3388
    // if there is enough space, we do not CAS and do not clear
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3389
    __ cmp(RnewTopValue, RendValue);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3390
    if(ZeroTLAB) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3391
      // the fields have already been cleared
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3392
      __ brx(Assembler::lessEqualUnsigned, true, Assembler::pt, initialize_header);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3393
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3394
      // initialize both the header and fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3395
      __ brx(Assembler::lessEqualUnsigned, true, Assembler::pt, initialize_object);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3396
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3397
    __ delayed()->st_ptr(RnewTopValue, G2_thread, in_bytes(JavaThread::tlab_top_offset()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3398
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3399
    if (allow_shared_alloc) {
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3400
      // Check if tlab should be discarded (refill_waste_limit >= free)
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3401
      __ ld_ptr(G2_thread, in_bytes(JavaThread::tlab_refill_waste_limit_offset()), RtlabWasteLimitValue);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3402
      __ sub(RendValue, RoldTopValue, RfreeValue);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3403
#ifdef _LP64
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3404
      __ srlx(RfreeValue, LogHeapWordSize, RfreeValue);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3405
#else
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3406
      __ srl(RfreeValue, LogHeapWordSize, RfreeValue);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3407
#endif
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3408
      __ cmp(RtlabWasteLimitValue, RfreeValue);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3409
      __ brx(Assembler::greaterEqualUnsigned, false, Assembler::pt, slow_case); // tlab waste is small
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3410
      __ delayed()->nop();
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3411
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3412
      // increment waste limit to prevent getting stuck on this slow path
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3413
      __ add(RtlabWasteLimitValue, ThreadLocalAllocBuffer::refill_waste_limit_increment(), RtlabWasteLimitValue);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3414
      __ st_ptr(RtlabWasteLimitValue, G2_thread, in_bytes(JavaThread::tlab_refill_waste_limit_offset()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3415
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3416
      // No allocation in the shared eden.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3417
      __ br(Assembler::always, false, Assembler::pt, slow_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3418
      __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3419
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3420
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3421
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3422
  // Allocation in the shared Eden
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3423
  if (allow_shared_alloc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3424
    Register RoldTopValue = G1_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3425
    Register RtopAddr = G3_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3426
    Register RnewTopValue = RallocatedObject;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3427
    Register RendValue = Rscratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3428
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3429
    __ set((intptr_t)Universe::heap()->top_addr(), RtopAddr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3430
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3431
    Label retry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3432
    __ bind(retry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3433
    __ set((intptr_t)Universe::heap()->end_addr(), RendValue);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3434
    __ ld_ptr(RendValue, 0, RendValue);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3435
    __ ld_ptr(RtopAddr, 0, RoldTopValue);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3436
    __ add(RoldTopValue, Roffset, RnewTopValue);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3437
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3438
    // RnewTopValue contains the top address after the new object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3439
    // has been allocated.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3440
    __ cmp(RnewTopValue, RendValue);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3441
    __ brx(Assembler::greaterUnsigned, false, Assembler::pn, slow_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3442
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3443
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3444
    __ casx_under_lock(RtopAddr, RoldTopValue, RnewTopValue,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3445
      VM_Version::v9_instructions_work() ? NULL :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3446
      (address)StubRoutines::Sparc::atomic_memory_operation_lock_addr());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3447
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3448
    // if someone beat us on the allocation, try again, otherwise continue
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3449
    __ cmp(RoldTopValue, RnewTopValue);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3450
    __ brx(Assembler::notEqual, false, Assembler::pn, retry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3451
    __ delayed()->nop();
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3452
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3453
    // bump total bytes allocated by this thread
7898
729a02451b8a 7011463: Sparc MacroAssembler::incr_allocated_bytes() needs a RegisterOrConstant argument
phh
parents: 7724
diff changeset
  3454
    // RoldTopValue and RtopAddr are dead, so can use G1 and G3
729a02451b8a 7011463: Sparc MacroAssembler::incr_allocated_bytes() needs a RegisterOrConstant argument
phh
parents: 7724
diff changeset
  3455
    __ incr_allocated_bytes(Roffset, G1_scratch, G3_scratch);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3456
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3457
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3458
  if (UseTLAB || Universe::heap()->supports_inline_contig_alloc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3459
    // clear object fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3460
    __ bind(initialize_object);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3461
    __ deccc(Roffset, sizeof(oopDesc));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3462
    __ br(Assembler::zero, false, Assembler::pt, initialize_header);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3463
    __ delayed()->add(RallocatedObject, sizeof(oopDesc), G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3464
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3465
    // initialize remaining object fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3466
    { Label loop;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3467
      __ subcc(Roffset, wordSize, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3468
      __ bind(loop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3469
      //__ subcc(Roffset, wordSize, Roffset);      // executed above loop or in delay slot
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3470
      __ st_ptr(G0, G3_scratch, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3471
      __ br(Assembler::notEqual, false, Assembler::pt, loop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3472
      __ delayed()->subcc(Roffset, wordSize, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3473
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3474
    __ br(Assembler::always, false, Assembler::pt, initialize_header);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3475
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3476
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3477
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3478
  // slow case
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3479
  __ bind(slow_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3480
  __ get_2_byte_integer_at_bcp(1, G3_scratch, O2, InterpreterMacroAssembler::Unsigned);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3481
  __ get_constant_pool(O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3482
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3483
  call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), O1, O2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3484
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3485
  __ ba(false, done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3486
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3487
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3488
  // Initialize the header: mark, klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3489
  __ bind(initialize_header);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3490
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3491
  if (UseBiasedLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3492
    __ ld_ptr(RinstanceKlass, Klass::prototype_header_offset_in_bytes() + sizeof(oopDesc), G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3493
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3494
    __ set((intptr_t)markOopDesc::prototype(), G4_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3495
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3496
  __ st_ptr(G4_scratch, RallocatedObject, oopDesc::mark_offset_in_bytes());       // mark
593
803947e176bd 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 360
diff changeset
  3497
  __ store_klass_gap(G0, RallocatedObject);         // klass gap if compressed
803947e176bd 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 360
diff changeset
  3498
  __ store_klass(RinstanceKlass, RallocatedObject); // klass (last for cms)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3499
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3500
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3501
    SkipIfEqual skip_if(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3502
      _masm, G4_scratch, &DTraceAllocProbes, Assembler::zero);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3503
    // Trigger dtrace event
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3504
    __ push(atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3505
    __ call_VM_leaf(noreg,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3506
       CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc), O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3507
    __ pop(atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3508
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3509
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3510
  // continue
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3511
  __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3512
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3513
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3514
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3515
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3516
void TemplateTable::newarray() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3517
  transition(itos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3518
  __ ldub(Lbcp, 1, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3519
     call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::newarray), O1, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3520
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3521
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3522
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3523
void TemplateTable::anewarray() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3524
  transition(itos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3525
  __ get_constant_pool(O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3526
  __ get_2_byte_integer_at_bcp(1, G4_scratch, O2, InterpreterMacroAssembler::Unsigned);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3527
     call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray), O1, O2, Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3528
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3529
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3530
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3531
void TemplateTable::arraylength() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3532
  transition(atos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3533
  Label ok;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3534
  __ verify_oop(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3535
  __ tst(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3536
  __ throw_if_not_1_x( Assembler::notZero, ok );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3537
  __ delayed()->ld(Otos_i, arrayOopDesc::length_offset_in_bytes(), Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3538
  __ throw_if_not_2( Interpreter::_throw_NullPointerException_entry, G3_scratch, ok);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3539
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3540
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3541
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3542
void TemplateTable::checkcast() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3543
  transition(atos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3544
  Label done, is_null, quicked, cast_ok, resolved;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3545
  Register Roffset = G1_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3546
  Register RobjKlass = O5;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3547
  Register RspecifiedKlass = O4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3548
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3549
  // Check for casting a NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3550
  __ br_null(Otos_i, false, Assembler::pn, is_null);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3551
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3552
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3553
  // Get value klass in RobjKlass
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  3554
  __ load_klass(Otos_i, RobjKlass); // get value klass
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3555
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3556
  // Get constant pool tag
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3557
  __ get_2_byte_integer_at_bcp(1, Lscratch, Roffset, InterpreterMacroAssembler::Unsigned);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3558
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3559
  // See if the checkcast has been quickened
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3560
  __ get_cpool_and_tags(Lscratch, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3561
  __ add(G3_scratch, typeArrayOopDesc::header_size(T_BYTE) * wordSize, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3562
  __ ldub(G3_scratch, Roffset, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3563
  __ cmp(G3_scratch, JVM_CONSTANT_Class);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3564
  __ br(Assembler::equal, true, Assembler::pt, quicked);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3565
  __ delayed()->sll(Roffset, LogBytesPerWord, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3566
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3567
  __ push_ptr(); // save receiver for result, and for GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3568
  call_VM(RspecifiedKlass, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc) );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3569
  __ pop_ptr(Otos_i, G3_scratch); // restore receiver
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3570
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3571
  __ br(Assembler::always, false, Assembler::pt, resolved);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  3572
  __ delayed()->nop();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3573
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3574
  // Extract target class from constant pool
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3575
  __ bind(quicked);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3576
  __ add(Roffset, sizeof(constantPoolOopDesc), Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3577
  __ ld_ptr(Lscratch, Roffset, RspecifiedKlass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3578
  __ bind(resolved);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  3579
  __ load_klass(Otos_i, RobjKlass); // get value klass
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3580
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3581
  // Generate a fast subtype check.  Branch to cast_ok if no
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3582
  // failure.  Throw exception if failure.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3583
  __ gen_subtype_check( RobjKlass, RspecifiedKlass, G3_scratch, G4_scratch, G1_scratch, cast_ok );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3584
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3585
  // Not a subtype; so must throw exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3586
  __ throw_if_not_x( Assembler::never, Interpreter::_throw_ClassCastException_entry, G3_scratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3587
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3588
  __ bind(cast_ok);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3589
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3590
  if (ProfileInterpreter) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3591
    __ ba(false, done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3592
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3593
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3594
  __ bind(is_null);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3595
  __ profile_null_seen(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3596
  __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3597
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3598
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3599
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3600
void TemplateTable::instanceof() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3601
  Label done, is_null, quicked, resolved;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3602
  transition(atos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3603
  Register Roffset = G1_scratch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3604
  Register RobjKlass = O5;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3605
  Register RspecifiedKlass = O4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3606
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3607
  // Check for casting a NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3608
  __ br_null(Otos_i, false, Assembler::pt, is_null);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3609
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3610
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3611
  // Get value klass in RobjKlass
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  3612
  __ load_klass(Otos_i, RobjKlass); // get value klass
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3613
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3614
  // Get constant pool tag
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3615
  __ get_2_byte_integer_at_bcp(1, Lscratch, Roffset, InterpreterMacroAssembler::Unsigned);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3616
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3617
  // See if the checkcast has been quickened
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3618
  __ get_cpool_and_tags(Lscratch, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3619
  __ add(G3_scratch, typeArrayOopDesc::header_size(T_BYTE) * wordSize, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3620
  __ ldub(G3_scratch, Roffset, G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3621
  __ cmp(G3_scratch, JVM_CONSTANT_Class);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3622
  __ br(Assembler::equal, true, Assembler::pt, quicked);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3623
  __ delayed()->sll(Roffset, LogBytesPerWord, Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3624
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3625
  __ push_ptr(); // save receiver for result, and for GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3626
  call_VM(RspecifiedKlass, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc) );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3627
  __ pop_ptr(Otos_i, G3_scratch); // restore receiver
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3628
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3629
  __ br(Assembler::always, false, Assembler::pt, resolved);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  3630
  __ delayed()->nop();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3631
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3632
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3633
  // Extract target class from constant pool
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3634
  __ bind(quicked);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3635
  __ add(Roffset, sizeof(constantPoolOopDesc), Roffset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3636
  __ get_constant_pool(Lscratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3637
  __ ld_ptr(Lscratch, Roffset, RspecifiedKlass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3638
  __ bind(resolved);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  3639
  __ load_klass(Otos_i, RobjKlass); // get value klass
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3640
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3641
  // Generate a fast subtype check.  Branch to cast_ok if no
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3642
  // failure.  Return 0 if failure.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3643
  __ or3(G0, 1, Otos_i);      // set result assuming quick tests succeed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3644
  __ gen_subtype_check( RobjKlass, RspecifiedKlass, G3_scratch, G4_scratch, G1_scratch, done );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3645
  // Not a subtype; return 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3646
  __ clr( Otos_i );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3647
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3648
  if (ProfileInterpreter) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3649
    __ ba(false, done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3650
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3651
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3652
  __ bind(is_null);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3653
  __ profile_null_seen(G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3654
  __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3655
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3656
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3657
void TemplateTable::_breakpoint() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3658
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3659
   // Note: We get here even if we are single stepping..
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3660
   // jbug inists on setting breakpoints at every bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3661
   // even if we are in single step mode.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3662
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3663
   transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3664
   // get the unpatched byte code
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3665
   __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::get_original_bytecode_at), Lmethod, Lbcp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3666
   __ mov(O0, Lbyte_code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3667
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3668
   // post the breakpoint event
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3669
   __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::_breakpoint), Lmethod, Lbcp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3670
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3671
   // complete the execution of original bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3672
   __ dispatch_normal(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3673
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3674
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3675
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3676
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3677
// Exceptions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3678
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3679
void TemplateTable::athrow() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3680
  transition(atos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3681
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3682
  // This works because exception is cached in Otos_i which is same as O0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3683
  // which is same as what throw_exception_entry_expects
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3684
  assert(Otos_i == Oexception, "see explanation above");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3685
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3686
  __ verify_oop(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3687
  __ null_check(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3688
  __ throw_if_not_x(Assembler::never, Interpreter::throw_exception_entry(), G3_scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3689
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3690
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3691
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3692
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3693
// Synchronization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3694
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3695
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3696
// See frame_sparc.hpp for monitor block layout.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3697
// Monitor elements are dynamically allocated by growing stack as needed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3698
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3699
void TemplateTable::monitorenter() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3700
  transition(atos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3701
  __ verify_oop(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3702
  // Try to acquire a lock on the object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3703
  // Repeat until succeeded (i.e., until
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3704
  // monitorenter returns true).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3705
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3706
  {   Label ok;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3707
    __ tst(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3708
    __ throw_if_not_1_x( Assembler::notZero,  ok);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3709
    __ delayed()->mov(Otos_i, Lscratch); // save obj
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3710
    __ throw_if_not_2( Interpreter::_throw_NullPointerException_entry, G3_scratch, ok);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3711
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3712
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3713
  assert(O0 == Otos_i, "Be sure where the object to lock is");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3714
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3715
  // find a free slot in the monitor block
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3716
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3717
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3718
  // initialize entry pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3719
  __ clr(O1); // points to free slot or NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3720
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3721
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3722
    Label entry, loop, exit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3723
    __ add( __ top_most_monitor(), O2 ); // last one to check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3724
    __ ba( false, entry );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3725
    __ delayed()->mov( Lmonitors, O3 ); // first one to check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3726
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3727
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3728
    __ bind( loop );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3729
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3730
    __ verify_oop(O4);          // verify each monitor's oop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3731
    __ tst(O4); // is this entry unused?
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3732
    if (VM_Version::v9_instructions_work())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3733
      __ movcc( Assembler::zero, false, Assembler::ptr_cc, O3, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3734
    else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3735
      Label L;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3736
      __ br( Assembler::zero, true, Assembler::pn, L );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3737
      __ delayed()->mov(O3, O1); // rememeber this one if match
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3738
      __ bind(L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3739
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3740
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3741
    __ cmp(O4, O0); // check if current entry is for same object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3742
    __ brx( Assembler::equal, false, Assembler::pn, exit );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3743
    __ delayed()->inc( O3, frame::interpreter_frame_monitor_size() * wordSize ); // check next one
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3744
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3745
    __ bind( entry );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3746
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3747
    __ cmp( O3, O2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3748
    __ brx( Assembler::lessEqualUnsigned, true, Assembler::pt, loop );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3749
    __ delayed()->ld_ptr(O3, BasicObjectLock::obj_offset_in_bytes(), O4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3750
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3751
    __ bind( exit );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3752
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3753
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3754
  { Label allocated;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3755
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3756
    // found free slot?
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3757
    __ br_notnull(O1, false, Assembler::pn, allocated);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3758
    __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3759
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3760
    __ add_monitor_to_stack( false, O2, O3 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3761
    __ mov(Lmonitors, O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3762
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3763
    __ bind(allocated);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3764
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3765
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3766
  // Increment bcp to point to the next bytecode, so exception handling for async. exceptions work correctly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3767
  // The object has already been poped from the stack, so the expression stack looks correct.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3768
  __ inc(Lbcp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3769
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3770
  __ st_ptr(O0, O1, BasicObjectLock::obj_offset_in_bytes()); // store object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3771
  __ lock_object(O1, O0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3772
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3773
  // check if there's enough space on the stack for the monitors after locking
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3774
  __ generate_stack_overflow_check(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3775
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3776
  // The bcp has already been incremented. Just need to dispatch to next instruction.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3777
  __ dispatch_next(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3778
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3779
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3780
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3781
void TemplateTable::monitorexit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3782
  transition(atos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3783
  __ verify_oop(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3784
  __ tst(Otos_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3785
  __ throw_if_not_x( Assembler::notZero, Interpreter::_throw_NullPointerException_entry, G3_scratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3786
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3787
  assert(O0 == Otos_i, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3788
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3789
  { Label entry, loop, found;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3790
    __ add( __ top_most_monitor(), O2 ); // last one to check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3791
    __ ba(false, entry );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3792
    // use Lscratch to hold monitor elem to check, start with most recent monitor,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3793
    // By using a local it survives the call to the C routine.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3794
    __ delayed()->mov( Lmonitors, Lscratch );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3795
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3796
    __ bind( loop );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3797
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3798
    __ verify_oop(O4);          // verify each monitor's oop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3799
    __ cmp(O4, O0); // check if current entry is for desired object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3800
    __ brx( Assembler::equal, true, Assembler::pt, found );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3801
    __ delayed()->mov(Lscratch, O1); // pass found entry as argument to monitorexit
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3802
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3803
    __ inc( Lscratch, frame::interpreter_frame_monitor_size() * wordSize ); // advance to next
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3804
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3805
    __ bind( entry );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3806
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3807
    __ cmp( Lscratch, O2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3808
    __ brx( Assembler::lessEqualUnsigned, true, Assembler::pt, loop );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3809
    __ delayed()->ld_ptr(Lscratch, BasicObjectLock::obj_offset_in_bytes(), O4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3810
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3811
    call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_illegal_monitor_state_exception));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3812
    __ should_not_reach_here();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3813
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3814
    __ bind(found);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3815
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3816
  __ unlock_object(O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3817
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3818
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3819
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3820
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3821
// Wide instructions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3822
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3823
void TemplateTable::wide() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3824
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3825
  __ ldub(Lbcp, 1, G3_scratch);// get next bc
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3826
  __ sll(G3_scratch, LogBytesPerWord, G3_scratch);
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  3827
  AddressLiteral ep(Interpreter::_wentry_point);
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  3828
  __ set(ep, G4_scratch);
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2131
diff changeset
  3829
  __ ld_ptr(G4_scratch, G3_scratch, G3_scratch);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3830
  __ jmp(G3_scratch, G0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3831
  __ delayed()->nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3832
  // Note: the Lbcp increment step is part of the individual wide bytecode implementations
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3833
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3834
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3835
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3836
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3837
// Multi arrays
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3838
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3839
void TemplateTable::multianewarray() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3840
  transition(vtos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3841
     // put ndims * wordSize into Lscratch
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3842
  __ ldub( Lbcp,     3,               Lscratch);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5416
diff changeset
  3843
  __ sll(  Lscratch, Interpreter::logStackElementSize, Lscratch);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3844
     // Lesp points past last_dim, so set to O1 to first_dim address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3845
  __ add(  Lesp,     Lscratch,        O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3846
     call_VM(Otos_i, CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray), O1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3847
  __ add(  Lesp,     Lscratch,        Lesp); // pop all dimensions off the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3848
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3849
#endif /* !CC_INTERP */