hotspot/src/cpu/x86/vm/templateTable_x86_32.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
/*
7889
02144432d0e1 4930919: race condition in MDO creation at back branch locations
iveresov
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
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
// Platform-dependent initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
void TemplateTable::pd_initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  // No i486 specific initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
// Address computation
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
// local variables
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
static inline Address iaddress(int n)            {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  return Address(rdi, Interpreter::local_offset_in_bytes(n));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
static inline Address laddress(int n)            { return iaddress(n + 1); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
static inline Address haddress(int n)            { return iaddress(n + 0); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
static inline Address faddress(int n)            { return iaddress(n); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
static inline Address daddress(int n)            { return laddress(n); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
static inline Address aaddress(int n)            { return iaddress(n); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
static inline Address iaddress(Register r)       {
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
    63
  return Address(rdi, r, Interpreter::stackElementScale());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
static inline Address laddress(Register r)       {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  return Address(rdi, r, Interpreter::stackElementScale(), Interpreter::local_offset_in_bytes(1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
static inline Address haddress(Register r)       {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  return Address(rdi, r, Interpreter::stackElementScale(), Interpreter::local_offset_in_bytes(0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
    72
static inline Address faddress(Register r)       { return iaddress(r); }
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
    73
static inline Address daddress(Register r)       { return laddress(r); }
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
    74
static inline Address aaddress(Register r)       { return iaddress(r); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
// expression stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
// (Note: Must not use symmetric equivalents at_rsp_m1/2 since they store
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
// data beyond the rsp which is potentially unsafe in an MT environment;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
// an interrupt may overwrite that data.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
static inline Address at_rsp   () {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  return Address(rsp, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
// At top of Java expression stack which may be different than rsp().  It
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
// isn't for category 1 objects.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
static inline Address at_tos   () {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  Address tos = Address(rsp,  Interpreter::expr_offset_in_bytes(0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  return tos;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
static inline Address at_tos_p1() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  return Address(rsp,  Interpreter::expr_offset_in_bytes(1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
static inline Address at_tos_p2() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  return Address(rsp,  Interpreter::expr_offset_in_bytes(2));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
// Condition conversion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
static Assembler::Condition j_not(TemplateTable::Condition cc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  switch (cc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
    case TemplateTable::equal        : return Assembler::notEqual;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
    case TemplateTable::not_equal    : return Assembler::equal;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
    case TemplateTable::less         : return Assembler::greaterEqual;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
    case TemplateTable::less_equal   : return Assembler::greater;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
    case TemplateTable::greater      : return Assembler::lessEqual;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
    case TemplateTable::greater_equal: return Assembler::less;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  return Assembler::zero;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
// Miscelaneous helper routines
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   117
// Store an oop (or NULL) at the address described by obj.
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   118
// If val == noreg this means store a NULL
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   119
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   120
static void do_oop_store(InterpreterMacroAssembler* _masm,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   121
                         Address obj,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   122
                         Register val,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   123
                         BarrierSet::Name barrier,
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   124
                         bool precise) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   125
  assert(val == noreg || val == rax, "parameter is just for looks");
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   126
  switch (barrier) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   127
#ifndef SERIALGC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   128
    case BarrierSet::G1SATBCT:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   129
    case BarrierSet::G1SATBCTLogging:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   130
      {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   131
        // flatten object address if needed
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   132
        // We do it regardless of precise because we need the registers
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   133
        if (obj.index() == noreg && obj.disp() == 0) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   134
          if (obj.base() != rdx) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   135
            __ movl(rdx, obj.base());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   136
          }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   137
        } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   138
          __ leal(rdx, obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   139
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   140
        __ get_thread(rcx);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   141
        __ save_bcp();
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
   142
        __ g1_write_barrier_pre(rdx /* obj */,
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
   143
                                rbx /* pre_val */,
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
   144
                                rcx /* thread */,
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
   145
                                rsi /* tmp */,
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
   146
                                val != noreg /* tosca_live */,
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
   147
                                false /* expand_call */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   148
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   149
        // Do the actual store
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   150
        // noreg means NULL
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   151
        if (val == noreg) {
1909
952b42dad1fc 6795913: A few remaining wrong casts need to be fixed for building hotspot successfully on Mac OS.
xlu
parents: 1888
diff changeset
   152
          __ movptr(Address(rdx, 0), NULL_WORD);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   153
          // No post barrier for NULL
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   154
        } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   155
          __ movl(Address(rdx, 0), val);
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
   156
          __ g1_write_barrier_post(rdx /* store_adr */,
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
   157
                                   val /* new_val */,
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
   158
                                   rcx /* thread */,
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
   159
                                   rbx /* tmp */,
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8676
diff changeset
   160
                                   rsi /* tmp2 */);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   161
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   162
        __ restore_bcp();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   163
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   164
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   165
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   166
#endif // SERIALGC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   167
    case BarrierSet::CardTableModRef:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   168
    case BarrierSet::CardTableExtension:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   169
      {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   170
        if (val == noreg) {
1909
952b42dad1fc 6795913: A few remaining wrong casts need to be fixed for building hotspot successfully on Mac OS.
xlu
parents: 1888
diff changeset
   171
          __ movptr(obj, NULL_WORD);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   172
        } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   173
          __ movl(obj, val);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   174
          // flatten object address if needed
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   175
          if (!precise || (obj.index() == noreg && obj.disp() == 0)) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   176
            __ store_check(obj.base());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   177
          } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   178
            __ leal(rdx, obj);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   179
            __ store_check(rdx);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   180
          }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   181
        }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   182
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   183
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   184
    case BarrierSet::ModRef:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   185
    case BarrierSet::Other:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   186
      if (val == noreg) {
1909
952b42dad1fc 6795913: A few remaining wrong casts need to be fixed for building hotspot successfully on Mac OS.
xlu
parents: 1888
diff changeset
   187
        __ movptr(obj, NULL_WORD);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   188
      } else {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   189
        __ movl(obj, val);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   190
      }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   191
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   192
    default      :
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   193
      ShouldNotReachHere();
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   194
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   195
  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   196
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   197
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
Address TemplateTable::at_bcp(int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  return Address(rsi, offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
void TemplateTable::patch_bytecode(Bytecodes::Code bytecode, Register bc,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
                                   Register scratch,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
                                   bool load_bc_into_scratch/*=true*/) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  if (!RewriteBytecodes) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
  // the pair bytecodes have already done the load.
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   210
  if (load_bc_into_scratch) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   211
    __ movl(bc, bytecode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   212
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  Label patch_done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  if (JvmtiExport::can_post_breakpoint()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
    Label fast_patch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
    // if a breakpoint is present we can't rewrite the stream directly
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   217
    __ movzbl(scratch, at_bcp(0));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
    __ cmpl(scratch, Bytecodes::_breakpoint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
    __ jcc(Assembler::notEqual, fast_patch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
    __ get_method(scratch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    // Let breakpoint table handling rewrite to quicker bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
    __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::set_original_bytecode_at), scratch, rsi, bc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
#ifndef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
    __ jmpb(patch_done);
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
   225
#else
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
   226
    __ jmp(patch_done);
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
   227
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
    __ bind(fast_patch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  }
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
   230
#ifdef ASSERT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  Label okay;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  __ load_unsigned_byte(scratch, at_bcp(0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  __ cmpl(scratch, (int)Bytecodes::java_code(bytecode));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  __ jccb(Assembler::equal, okay);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  __ cmpl(scratch, bc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  __ jcc(Assembler::equal, okay);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  __ stop("patching the wrong bytecode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  __ bind(okay);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  // patch bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  __ movb(at_bcp(0), bc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  __ bind(patch_done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
// Individual instructions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
void TemplateTable::nop() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  // nothing to do
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
void TemplateTable::shouldnotreachhere() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  __ stop("shouldnotreachhere bytecode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
void TemplateTable::aconst_null() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  transition(vtos, atos);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   262
  __ xorptr(rax, rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
void TemplateTable::iconst(int value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  if (value == 0) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   269
    __ xorptr(rax, rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
  } else {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   271
    __ movptr(rax, value);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
void TemplateTable::lconst(int value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  transition(vtos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  if (value == 0) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   279
    __ xorptr(rax, rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  } else {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   281
    __ movptr(rax, value);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  assert(value >= 0, "check this code");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   284
  __ xorptr(rdx, rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
void TemplateTable::fconst(int value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  transition(vtos, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
         if (value == 0) { __ fldz();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  } else if (value == 1) { __ fld1();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  } else if (value == 2) { __ fld1(); __ fld1(); __ faddp(); // should do a better solution here
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  } else                 { ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
void TemplateTable::dconst(int value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  transition(vtos, dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
         if (value == 0) { __ fldz();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  } else if (value == 1) { __ fld1();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  } else                 { ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
void TemplateTable::bipush() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  __ load_signed_byte(rax, at_bcp(1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
void TemplateTable::sipush() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  transition(vtos, itos);
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   315
  __ load_unsigned_short(rax, at_bcp(1));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   316
  __ bswapl(rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  __ sarl(rax, 16);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
void TemplateTable::ldc(bool wide) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  Label call_ldc, notFloat, notClass, Done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  if (wide) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    __ get_unsigned_2_byte_index_at_bcp(rbx, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    __ load_unsigned_byte(rbx, at_bcp(1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  __ get_cpool_and_tags(rcx, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  const int base_offset = constantPoolOopDesc::header_size() * wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  // get type
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   334
  __ xorptr(rdx, rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  __ movb(rdx, Address(rax, rbx, Address::times_1, tags_offset));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  // unresolved string - get the resolved string
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  __ cmpl(rdx, JVM_CONSTANT_UnresolvedString);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  __ jccb(Assembler::equal, call_ldc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  // unresolved class - get the resolved class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  __ cmpl(rdx, JVM_CONSTANT_UnresolvedClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  __ jccb(Assembler::equal, call_ldc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  // unresolved class in error (resolution failed) - call into runtime
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  // so that the same error from first resolution attempt is thrown.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  __ cmpl(rdx, JVM_CONSTANT_UnresolvedClassInError);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  __ jccb(Assembler::equal, call_ldc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  // resolved class - need to call vm to get java mirror of the class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  __ cmpl(rdx, JVM_CONSTANT_Class);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  __ jcc(Assembler::notEqual, notClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  __ bind(call_ldc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  __ movl(rcx, wide);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::ldc), rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
  __ push(atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  __ bind(notClass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  __ cmpl(rdx, JVM_CONSTANT_Float);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  __ jccb(Assembler::notEqual, notFloat);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  // ftos
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   364
  __ fld_s(    Address(rcx, rbx, Address::times_ptr, base_offset));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  __ push(ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  __ bind(notFloat);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  { Label L;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
    __ cmpl(rdx, JVM_CONSTANT_Integer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
    __ jcc(Assembler::equal, L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
    __ cmpl(rdx, JVM_CONSTANT_String);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
    __ jcc(Assembler::equal, L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
    __ stop("unexpected tag type in ldc");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
    __ bind(L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  Label isOop;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  // atos and itos
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  // String is only oop type we will see here
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  __ cmpl(rdx, JVM_CONSTANT_String);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  __ jccb(Assembler::equal, isOop);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   384
  __ movl(rax, Address(rcx, rbx, Address::times_ptr, base_offset));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  __ push(itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  __ bind(isOop);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   388
  __ movptr(rax, Address(rcx, rbx, Address::times_ptr, base_offset));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  __ push(atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  if (VerifyOops) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
    __ verify_oop(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  __ bind(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   397
// Fast path for caching oop constants.
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   398
// %%% We should use this to handle Class and String constants also.
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   399
// %%% It will simplify the ldc/primitive path considerably.
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   400
void TemplateTable::fast_aldc(bool wide) {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   401
  transition(vtos, atos);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   402
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   403
  if (!EnableMethodHandles) {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   404
    // We should not encounter this bytecode if !EnableMethodHandles.
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   405
    // 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
   406
    // 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
   407
    __ call_VM(noreg, CAST_FROM_FN_PTR(address,
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   408
                     InterpreterRuntime::throw_IncompatibleClassChangeError));
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   409
    // 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
   410
    __ should_not_reach_here();
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   411
    return;
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   412
  }
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   413
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   414
  const Register cache = rcx;
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   415
  const Register index = rdx;
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   416
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   417
  resolve_cache_and_index(f1_oop, rax, cache, index, wide ? sizeof(u2) : sizeof(u1));
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   418
  if (VerifyOops) {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   419
    __ verify_oop(rax);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   420
  }
7114
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   421
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   422
  Label L_done, L_throw_exception;
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   423
  const Register con_klass_temp = rcx;  // same as Rcache
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   424
  __ movptr(con_klass_temp, Address(rax, oopDesc::klass_offset_in_bytes()));
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   425
  __ cmpptr(con_klass_temp, ExternalAddress((address)Universe::systemObjArrayKlassObj_addr()));
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   426
  __ jcc(Assembler::notEqual, L_done);
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   427
  __ cmpl(Address(rax, arrayOopDesc::length_offset_in_bytes()), 0);
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   428
  __ jcc(Assembler::notEqual, L_throw_exception);
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   429
  __ xorptr(rax, rax);
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   430
  __ jmp(L_done);
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   431
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   432
  // Load the exception from the system-array which wraps it:
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   433
  __ bind(L_throw_exception);
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   434
  __ movptr(rax, Address(rax, arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   435
  __ jump(ExternalAddress(Interpreter::throw_exception_entry()));
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   436
65d21c4c6337 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 6772
diff changeset
   437
  __ bind(L_done);
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   438
}
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   439
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
void TemplateTable::ldc2_w() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  Label Long, Done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  __ get_unsigned_2_byte_index_at_bcp(rbx, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  __ get_cpool_and_tags(rcx, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  const int base_offset = constantPoolOopDesc::header_size() * wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  // get type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  __ cmpb(Address(rax, rbx, Address::times_1, tags_offset), JVM_CONSTANT_Double);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  __ jccb(Assembler::notEqual, Long);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  // dtos
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   453
  __ fld_d(    Address(rcx, rbx, Address::times_ptr, base_offset));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  __ push(dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  __ jmpb(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  __ bind(Long);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  // ltos
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   459
  __ movptr(rax, Address(rcx, rbx, Address::times_ptr, base_offset + 0 * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   460
  NOT_LP64(__ movptr(rdx, Address(rcx, rbx, Address::times_ptr, base_offset + 1 * wordSize)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  __ push(ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  __ bind(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
void TemplateTable::locals_index(Register reg, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  __ load_unsigned_byte(reg, at_bcp(offset));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   470
  __ negptr(reg);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
void TemplateTable::iload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  if (RewriteFrequentPairs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
    Label rewrite, done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
    // get next byte
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
    __ load_unsigned_byte(rbx, at_bcp(Bytecodes::length_for(Bytecodes::_iload)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
    // if _iload, wait to rewrite to iload2.  We only want to rewrite the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
    // last two iloads in a pair.  Comparing against fast_iload means that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
    // the next bytecode is neither an iload or a caload, and therefore
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
    // an iload pair.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
    __ cmpl(rbx, Bytecodes::_iload);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
    __ jcc(Assembler::equal, done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
    __ cmpl(rbx, Bytecodes::_fast_iload);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
    __ movl(rcx, Bytecodes::_fast_iload2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
    __ jccb(Assembler::equal, rewrite);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
    // if _caload, rewrite to fast_icaload
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
    __ cmpl(rbx, Bytecodes::_caload);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
    __ movl(rcx, Bytecodes::_fast_icaload);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
    __ jccb(Assembler::equal, rewrite);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
    // rewrite so iload doesn't check again.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
    __ movl(rcx, Bytecodes::_fast_iload);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
    // rewrite
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
    // rcx: fast bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
    __ bind(rewrite);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
    patch_bytecode(Bytecodes::_iload, rcx, rbx, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
    __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  // Get the local value into tos
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  locals_index(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  __ movl(rax, iaddress(rbx));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
void TemplateTable::fast_iload2() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  locals_index(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
  __ movl(rax, iaddress(rbx));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  __ push(itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
  locals_index(rbx, 3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  __ movl(rax, iaddress(rbx));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
void TemplateTable::fast_iload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  locals_index(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  __ movl(rax, iaddress(rbx));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
void TemplateTable::lload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  transition(vtos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  locals_index(rbx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   532
  __ movptr(rax, laddress(rbx));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   533
  NOT_LP64(__ movl(rdx, haddress(rbx)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
void TemplateTable::fload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  transition(vtos, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  locals_index(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  __ fld_s(faddress(rbx));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
void TemplateTable::dload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  transition(vtos, dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  locals_index(rbx);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
   547
  __ fld_d(daddress(rbx));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
void TemplateTable::aload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  transition(vtos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  locals_index(rbx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   554
  __ movptr(rax, aaddress(rbx));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
void TemplateTable::locals_index_wide(Register reg) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  __ movl(reg, at_bcp(2));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   560
  __ bswapl(reg);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  __ shrl(reg, 16);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   562
  __ negptr(reg);
1
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::wide_iload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  locals_index_wide(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  __ movl(rax, iaddress(rbx));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
void TemplateTable::wide_lload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  transition(vtos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  locals_index_wide(rbx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   576
  __ movptr(rax, laddress(rbx));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   577
  NOT_LP64(__ movl(rdx, haddress(rbx)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
void TemplateTable::wide_fload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  transition(vtos, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  locals_index_wide(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
  __ fld_s(faddress(rbx));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
void TemplateTable::wide_dload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  transition(vtos, dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  locals_index_wide(rbx);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
   591
  __ fld_d(daddress(rbx));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
void TemplateTable::wide_aload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  transition(vtos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  locals_index_wide(rbx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   598
  __ movptr(rax, aaddress(rbx));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
void TemplateTable::index_check(Register array, Register index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  // Pop ptr into array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
  __ pop_ptr(array);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  index_check_without_pop(array, index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
void TemplateTable::index_check_without_pop(Register array, Register index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  // destroys rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
  // check array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
  __ null_check(array, arrayOopDesc::length_offset_in_bytes());
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   611
  LP64_ONLY(__ movslq(index, index));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
  // check index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
  __ cmpl(index, Address(array, arrayOopDesc::length_offset_in_bytes()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
  if (index != rbx) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
    // ??? convention: move aberrant index into rbx, for exception message
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
    assert(rbx != array, "different registers");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   617
    __ mov(rbx, index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
  __ jump_cc(Assembler::aboveEqual,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
             ExternalAddress(Interpreter::_throw_ArrayIndexOutOfBoundsException_entry));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
void TemplateTable::iaload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  // rdx: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  index_check(rdx, rax);  // kills rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
  // rax,: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
  __ movl(rax, Address(rdx, rax, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_INT)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
void TemplateTable::laload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
  transition(itos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
  // rax,: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
  // rdx: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
  index_check(rdx, rax);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   638
  __ mov(rbx, rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  // rbx,: index
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   640
  __ movptr(rax, Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   641
  NOT_LP64(__ movl(rdx, Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 1 * wordSize)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
void TemplateTable::faload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  transition(itos, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
  // rdx: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  index_check(rdx, rax);  // kills rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  // rax,: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  __ fld_s(Address(rdx, rax, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_FLOAT)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
void TemplateTable::daload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
  transition(itos, dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
  // rdx: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  index_check(rdx, rax);  // kills rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
  // rax,: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
  __ fld_d(Address(rdx, rax, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_DOUBLE)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
void TemplateTable::aaload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
  transition(itos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
  // rdx: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
  index_check(rdx, rax);  // kills rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  // rax,: index
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   668
  __ movptr(rax, Address(rdx, rax, Address::times_ptr, arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
void TemplateTable::baload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
  // rdx: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
  index_check(rdx, rax);  // kills rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
  // rax,: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  // can do better code for P5 - fix this at some point
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  __ load_signed_byte(rbx, Address(rdx, rax, Address::times_1, arrayOopDesc::base_offset_in_bytes(T_BYTE)));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   679
  __ mov(rax, rbx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
void TemplateTable::caload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  // rdx: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
  index_check(rdx, rax);  // kills rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
  // rax,: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
  // can do better code for P5 - may want to improve this at some point
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   689
  __ load_unsigned_short(rbx, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   690
  __ mov(rax, rbx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
// iload followed by caload frequent pair
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
void TemplateTable::fast_icaload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  // load index out of locals
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
  locals_index(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  __ movl(rax, iaddress(rbx));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
  // rdx: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
  index_check(rdx, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
  // rax,: index
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   703
  __ load_unsigned_short(rbx, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   704
  __ mov(rax, rbx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
void TemplateTable::saload() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
  // rdx: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
  index_check(rdx, rax);  // kills rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  // rax,: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
  // can do better code for P5 - may want to improve this at some point
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   713
  __ load_signed_short(rbx, Address(rdx, rax, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_SHORT)));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   714
  __ mov(rax, rbx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
void TemplateTable::iload(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
  transition(vtos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
  __ movl(rax, iaddress(n));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
void TemplateTable::lload(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
  transition(vtos, ltos);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   726
  __ movptr(rax, laddress(n));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   727
  NOT_LP64(__ movptr(rdx, haddress(n)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
void TemplateTable::fload(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
  transition(vtos, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
  __ fld_s(faddress(n));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
void TemplateTable::dload(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
  transition(vtos, dtos);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
   739
  __ fld_d(daddress(n));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
void TemplateTable::aload(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
  transition(vtos, atos);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   745
  __ movptr(rax, aaddress(n));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
void TemplateTable::aload_0() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
  transition(vtos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
  // According to bytecode histograms, the pairs:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
  // _aload_0, _fast_igetfield
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
  // _aload_0, _fast_agetfield
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
  // _aload_0, _fast_fgetfield
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
  // occur frequently. If RewriteFrequentPairs is set, the (slow) _aload_0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
  // bytecode checks if the next bytecode is either _fast_igetfield,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
  // _fast_agetfield or _fast_fgetfield and then rewrites the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
  // current bytecode into a pair bytecode; otherwise it rewrites the current
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
  // bytecode into _fast_aload_0 that doesn't do the pair check anymore.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
  // Note: If the next bytecode is _getfield, the rewrite must be delayed,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
  //       otherwise we may miss an opportunity for a pair.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
  // Also rewrite frequent pairs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
  //   aload_0, aload_1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  //   aload_0, iload_1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
  // These bytecodes with a small amount of code are most profitable to rewrite
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
  if (RewriteFrequentPairs) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
    Label rewrite, done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
    // get next byte
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
    __ load_unsigned_byte(rbx, at_bcp(Bytecodes::length_for(Bytecodes::_aload_0)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
    // do actual aload_0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
    aload(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
    // if _getfield then wait with rewrite
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
    __ cmpl(rbx, Bytecodes::_getfield);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
    __ jcc(Assembler::equal, done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
    // if _igetfield then reqrite to _fast_iaccess_0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
    assert(Bytecodes::java_code(Bytecodes::_fast_iaccess_0) == Bytecodes::_aload_0, "fix bytecode definition");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
    __ cmpl(rbx, Bytecodes::_fast_igetfield);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
    __ movl(rcx, Bytecodes::_fast_iaccess_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
    __ jccb(Assembler::equal, rewrite);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
    // if _agetfield then reqrite to _fast_aaccess_0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
    assert(Bytecodes::java_code(Bytecodes::_fast_aaccess_0) == Bytecodes::_aload_0, "fix bytecode definition");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
    __ cmpl(rbx, Bytecodes::_fast_agetfield);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
    __ movl(rcx, Bytecodes::_fast_aaccess_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
    __ jccb(Assembler::equal, rewrite);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
    // if _fgetfield then reqrite to _fast_faccess_0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
    assert(Bytecodes::java_code(Bytecodes::_fast_faccess_0) == Bytecodes::_aload_0, "fix bytecode definition");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
    __ cmpl(rbx, Bytecodes::_fast_fgetfield);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
    __ movl(rcx, Bytecodes::_fast_faccess_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
    __ jccb(Assembler::equal, rewrite);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
    // else rewrite to _fast_aload0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
    assert(Bytecodes::java_code(Bytecodes::_fast_aload_0) == Bytecodes::_aload_0, "fix bytecode definition");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
    __ movl(rcx, Bytecodes::_fast_aload_0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
    // rewrite
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
    // rcx: fast bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
    __ bind(rewrite);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
    patch_bytecode(Bytecodes::_aload_0, rcx, rbx, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
    __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
    aload(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
void TemplateTable::istore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  locals_index(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  __ movl(iaddress(rbx), rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
void TemplateTable::lstore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
  transition(ltos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
  locals_index(rbx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   825
  __ movptr(laddress(rbx), rax);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   826
  NOT_LP64(__ movptr(haddress(rbx), rdx));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
void TemplateTable::fstore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
  transition(ftos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
  locals_index(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
  __ fstp_s(faddress(rbx));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
void TemplateTable::dstore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  transition(dtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  locals_index(rbx);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
   840
  __ fstp_d(daddress(rbx));
1
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::astore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
  transition(vtos, vtos);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
   846
  __ pop_ptr(rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  locals_index(rbx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   848
  __ movptr(aaddress(rbx), rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
void TemplateTable::wide_istore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
  __ pop_i(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
  locals_index_wide(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
  __ movl(iaddress(rbx), rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
void TemplateTable::wide_lstore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
  __ pop_l(rax, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
  locals_index_wide(rbx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   864
  __ movptr(laddress(rbx), rax);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   865
  NOT_LP64(__ movl(haddress(rbx), rdx));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
void TemplateTable::wide_fstore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
  wide_istore();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
void TemplateTable::wide_dstore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
  wide_lstore();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
void TemplateTable::wide_astore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
  transition(vtos, vtos);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
   881
  __ pop_ptr(rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
  locals_index_wide(rbx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   883
  __ movptr(aaddress(rbx), rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
void TemplateTable::iastore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
  __ pop_i(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
  // rax,: value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
  // rdx: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  index_check(rdx, rbx);  // prefer index in rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
  // rbx,: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  __ movl(Address(rdx, rbx, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_INT)), rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
void TemplateTable::lastore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
  transition(ltos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
  __ pop_i(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
  // rax,: low(value)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
  // rcx: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  // rdx: high(value)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
  index_check(rcx, rbx);  // prefer index in rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
  // rbx,: index
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   906
  __ movptr(Address(rcx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 0 * wordSize), rax);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   907
  NOT_LP64(__ movl(Address(rcx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_LONG) + 1 * wordSize), rdx));
1
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::fastore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
  transition(ftos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
  __ pop_i(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
  // rdx: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
  // st0: value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
  index_check(rdx, rbx);  // prefer index in rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
  // rbx,: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
  __ fstp_s(Address(rdx, rbx, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_FLOAT)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
void TemplateTable::dastore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
  transition(dtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  __ pop_i(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
  // rdx: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
  // st0: value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
  index_check(rdx, rbx);  // prefer index in rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
  // rbx,: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
  __ fstp_d(Address(rdx, rbx, Address::times_8, arrayOopDesc::base_offset_in_bytes(T_DOUBLE)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
void TemplateTable::aastore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
  Label is_null, ok_is_subtype, done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  // stack: ..., array, index, value
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   937
  __ movptr(rax, at_tos());     // Value
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  __ movl(rcx, at_tos_p1());  // Index
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   939
  __ movptr(rdx, at_tos_p2());  // Array
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   940
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   941
  Address element_address(rdx, rcx, Address::times_4, arrayOopDesc::base_offset_in_bytes(T_OBJECT));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
  index_check_without_pop(rdx, rcx);      // kills rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
  // do array store check - check for NULL value first
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   944
  __ testptr(rax, rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
  __ jcc(Assembler::zero, is_null);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
  // Move subklass into EBX
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   948
  __ movptr(rbx, Address(rax, oopDesc::klass_offset_in_bytes()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
  // Move superklass into EAX
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   950
  __ movptr(rax, Address(rdx, oopDesc::klass_offset_in_bytes()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   951
  __ movptr(rax, Address(rax, sizeof(oopDesc) + objArrayKlass::element_klass_offset_in_bytes()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   952
  // Compress array+index*wordSize+12 into a single register.  Frees ECX.
1394
apetrusenko
parents: 1066 1388
diff changeset
   953
  __ lea(rdx, element_address);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
  // Generate subtype check.  Blows ECX.  Resets EDI to locals.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
  // Superklass in EAX.  Subklass in EBX.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
  __ gen_subtype_check( rbx, ok_is_subtype );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
  // Come here on failure
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
  // object is at TOS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
  __ jump(ExternalAddress(Interpreter::_throw_ArrayStoreException_entry));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
  // Come here on success
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
  __ bind(ok_is_subtype);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   965
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   966
  // Get the value to store
1394
apetrusenko
parents: 1066 1388
diff changeset
   967
  __ movptr(rax, at_rsp());
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   968
  // and store it with appropriate barrier
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   969
  do_oop_store(_masm, Address(rdx, 0), rax, _bs->kind(), true);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   970
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   971
  __ jmp(done);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
  // Have a NULL in EAX, EDX=array, ECX=index.  Store NULL at ary[idx]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
  __ bind(is_null);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
  __ profile_null_seen(rbx);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   976
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   977
  // Store NULL, (noreg means NULL to do_oop_store)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
   978
  do_oop_store(_masm, element_address, noreg, _bs->kind(), true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
  // Pop stack arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
  __ bind(done);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
   982
  __ addptr(rsp, 3 * 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::bastore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
  __ pop_i(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
  // rax,: value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
  // rdx: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
  index_check(rdx, rbx);  // prefer index in rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
  // rbx,: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
  __ movb(Address(rdx, rbx, Address::times_1, arrayOopDesc::base_offset_in_bytes(T_BYTE)), rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
void TemplateTable::castore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
  __ pop_i(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  // rax,: value
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
  // rdx: array
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
  index_check(rdx, rbx);  // prefer index in rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
  // rbx,: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
  __ movw(Address(rdx, rbx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)), rax);
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::sastore() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
  castore();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
void TemplateTable::istore(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
  __ movl(iaddress(n), rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
void TemplateTable::lstore(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
  transition(ltos, vtos);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1021
  __ movptr(laddress(n), rax);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1022
  NOT_LP64(__ movptr(haddress(n), rdx));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
void TemplateTable::fstore(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  transition(ftos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
  __ fstp_s(faddress(n));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
void TemplateTable::dstore(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
  transition(dtos, vtos);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1034
  __ fstp_d(daddress(n));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
void TemplateTable::astore(int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
  transition(vtos, vtos);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1040
  __ pop_ptr(rax);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1041
  __ movptr(aaddress(n), rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
void TemplateTable::pop() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  transition(vtos, vtos);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1047
  __ addptr(rsp, Interpreter::stackElementSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
void TemplateTable::pop2() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
  transition(vtos, vtos);
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1053
  __ addptr(rsp, 2*Interpreter::stackElementSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
void TemplateTable::dup() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
  // stack: ..., a
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1060
  __ load_ptr(0, rax);
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1061
  __ push_ptr(rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
  // stack: ..., a, a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
void TemplateTable::dup_x1() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
  // stack: ..., a, b
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1069
  __ load_ptr( 0, rax);  // load b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1070
  __ load_ptr( 1, rcx);  // load a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1071
  __ store_ptr(1, rax);  // store b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1072
  __ store_ptr(0, rcx);  // store a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1073
  __ push_ptr(rax);      // push b
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
  // stack: ..., b, a, b
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
void TemplateTable::dup_x2() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
  // stack: ..., a, b, c
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1081
  __ load_ptr( 0, rax);  // load c
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1082
  __ load_ptr( 2, rcx);  // load a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1083
  __ store_ptr(2, rax);  // store c in a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1084
  __ push_ptr(rax);      // push c
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
  // stack: ..., c, b, c, c
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1086
  __ load_ptr( 2, rax);  // load b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1087
  __ store_ptr(2, rcx);  // store a in b
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
  // stack: ..., c, a, c, c
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1089
  __ store_ptr(1, rax);  // store b in c
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
  // stack: ..., c, a, b, c
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
void TemplateTable::dup2() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
  // stack: ..., a, b
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1097
  __ load_ptr(1, rax);  // load a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1098
  __ push_ptr(rax);     // push a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1099
  __ load_ptr(1, rax);  // load b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1100
  __ push_ptr(rax);     // push b
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
  // stack: ..., a, b, a, b
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
void TemplateTable::dup2_x1() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
  // stack: ..., a, b, c
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1108
  __ load_ptr( 0, rcx);  // load c
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1109
  __ load_ptr( 1, rax);  // load b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1110
  __ push_ptr(rax);      // push b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1111
  __ push_ptr(rcx);      // push c
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
  // stack: ..., a, b, c, b, c
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1113
  __ store_ptr(3, rcx);  // store c in b
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
  // stack: ..., a, c, c, b, c
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1115
  __ load_ptr( 4, rcx);  // load a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1116
  __ store_ptr(2, rcx);  // store a in 2nd c
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
  // stack: ..., a, c, a, b, c
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1118
  __ store_ptr(4, rax);  // store b in a
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
  // stack: ..., b, c, a, b, c
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
  // stack: ..., b, c, a, b, c
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
void TemplateTable::dup2_x2() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
  // stack: ..., a, b, c, d
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1127
  __ load_ptr( 0, rcx);  // load d
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1128
  __ load_ptr( 1, rax);  // load c
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1129
  __ push_ptr(rax);      // push c
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1130
  __ push_ptr(rcx);      // push d
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
  // stack: ..., a, b, c, d, c, d
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1132
  __ load_ptr( 4, rax);  // load b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1133
  __ store_ptr(2, rax);  // store b in d
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1134
  __ store_ptr(4, rcx);  // store d in b
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
  // stack: ..., a, d, c, b, c, d
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1136
  __ load_ptr( 5, rcx);  // load a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1137
  __ load_ptr( 3, rax);  // load c
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1138
  __ store_ptr(3, rcx);  // store a in c
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1139
  __ store_ptr(5, rax);  // store c in a
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
  // stack: ..., c, d, a, b, c, d
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
  // stack: ..., c, d, a, b, c, d
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
void TemplateTable::swap() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
  // stack: ..., a, b
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1148
  __ load_ptr( 1, rcx);  // load a
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1149
  __ load_ptr( 0, rax);  // load b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1150
  __ store_ptr(0, rcx);  // store a in b
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1151
  __ store_ptr(1, rax);  // store b in a
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
  // stack: ..., b, a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
void TemplateTable::iop2(Operation op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
  switch (op) {
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1159
    case add  :                   __ pop_i(rdx); __ addl (rax, rdx); break;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1160
    case sub  : __ mov(rdx, rax); __ pop_i(rax); __ subl (rax, rdx); break;
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1161
    case mul  :                   __ pop_i(rdx); __ imull(rax, rdx); break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1162
    case _and :                   __ pop_i(rdx); __ andl (rax, rdx); break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1163
    case _or  :                   __ pop_i(rdx); __ orl  (rax, rdx); break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1164
    case _xor :                   __ pop_i(rdx); __ xorl (rax, rdx); break;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1165
    case shl  : __ mov(rcx, rax); __ pop_i(rax); __ shll (rax);      break; // implicit masking of lower 5 bits by Intel shift instr.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1166
    case shr  : __ mov(rcx, rax); __ pop_i(rax); __ sarl (rax);      break; // implicit masking of lower 5 bits by Intel shift instr.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1167
    case ushr : __ mov(rcx, rax); __ pop_i(rax); __ shrl (rax);      break; // implicit masking of lower 5 bits by Intel shift instr.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
    default   : ShouldNotReachHere();
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
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
void TemplateTable::lop2(Operation op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
  transition(ltos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
  __ pop_l(rbx, rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
  switch (op) {
5419
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1177
    case add  : __ addl(rax, rbx); __ adcl(rdx, rcx); break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1178
    case sub  : __ subl(rbx, rax); __ sbbl(rcx, rdx);
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1179
                __ mov (rax, rbx); __ mov (rdx, rcx); break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1180
    case _and : __ andl(rax, rbx); __ andl(rdx, rcx); break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1181
    case _or  : __ orl (rax, rbx); __ orl (rdx, rcx); break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1182
    case _xor : __ xorl(rax, rbx); __ xorl(rdx, rcx); break;
f2e8cc8c12ea 6943304: remove tagged stack interpreter
twisti
parents: 5055
diff changeset
  1183
    default   : ShouldNotReachHere();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
void TemplateTable::idiv() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
  transition(itos, itos);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1190
  __ mov(rcx, rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
  __ pop_i(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
  // Note: could xor rax, and rcx and compare with (-1 ^ min_int). If
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
  //       they are not equal, one could do a normal division (no correction
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
  //       needed), which may speed up this implementation for the common case.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
  //       (see also JVM spec., p.243 & p.271)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
  __ corrected_idivl(rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
void TemplateTable::irem() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
  transition(itos, itos);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1202
  __ mov(rcx, rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
  __ pop_i(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
  // Note: could xor rax, and rcx and compare with (-1 ^ min_int). If
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
  //       they are not equal, one could do a normal division (no correction
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
  //       needed), which may speed up this implementation for the common case.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
  //       (see also JVM spec., p.243 & p.271)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
  __ corrected_idivl(rcx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1209
  __ mov(rax, rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
void TemplateTable::lmul() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
  transition(ltos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
  __ pop_l(rbx, rcx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1216
  __ push(rcx); __ push(rbx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1217
  __ push(rdx); __ push(rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
  __ lmul(2 * wordSize, 0);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1219
  __ addptr(rsp, 4 * wordSize);  // take off temporaries
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
void TemplateTable::ldiv() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
  transition(ltos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
  __ pop_l(rbx, rcx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1226
  __ push(rcx); __ push(rbx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1227
  __ push(rdx); __ push(rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
  // check if y = 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
  __ orl(rax, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
  __ jump_cc(Assembler::zero,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
             ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
  __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::ldiv));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1233
  __ addptr(rsp, 4 * wordSize);  // take off temporaries
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
void TemplateTable::lrem() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
  transition(ltos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
  __ pop_l(rbx, rcx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1240
  __ push(rcx); __ push(rbx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1241
  __ push(rdx); __ push(rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
  // check if y = 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
  __ orl(rax, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
  __ jump_cc(Assembler::zero,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
             ExternalAddress(Interpreter::_throw_ArithmeticException_entry));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
  __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::lrem));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1247
  __ addptr(rsp, 4 * wordSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
void TemplateTable::lshl() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
  transition(itos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
  __ movl(rcx, rax);                             // get shift count
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
  __ pop_l(rax, rdx);                            // get shift value
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
  __ lshl(rdx, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
void TemplateTable::lshr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
  transition(itos, ltos);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1261
  __ mov(rcx, rax);                              // get shift count
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
  __ pop_l(rax, rdx);                            // get shift value
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
  __ lshr(rdx, rax, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1266
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
void TemplateTable::lushr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
  transition(itos, ltos);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1269
  __ mov(rcx, rax);                              // get shift count
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
  __ pop_l(rax, rdx);                            // get shift value
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
  __ lshr(rdx, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
void TemplateTable::fop2(Operation op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
  transition(ftos, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
  switch (op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
    case add: __ fadd_s (at_rsp());                break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
    case sub: __ fsubr_s(at_rsp());                break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
    case mul: __ fmul_s (at_rsp());                break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
    case div: __ fdivr_s(at_rsp());                break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
    case rem: __ fld_s  (at_rsp()); __ fremr(rax); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
    default : ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
  __ f2ieee();
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1286
  __ pop(rax);  // pop float thing off
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
void TemplateTable::dop2(Operation op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1291
  transition(dtos, dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
  switch (op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
    case add: __ fadd_d (at_rsp());                break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
    case sub: __ fsubr_d(at_rsp());                break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
    case mul: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
      Label L_strict;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
      Label L_join;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
      const Address access_flags      (rcx, methodOopDesc::access_flags_offset());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
      __ get_method(rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
      __ movl(rcx, access_flags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
      __ testl(rcx, JVM_ACC_STRICT);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
      __ jccb(Assembler::notZero, L_strict);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
      __ fmul_d (at_rsp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
      __ jmpb(L_join);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
      __ bind(L_strict);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
      __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias1()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1308
      __ fmulp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
      __ fmul_d (at_rsp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
      __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias2()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
      __ fmulp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
      __ bind(L_join);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
    case div: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
      Label L_strict;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1317
      Label L_join;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
      const Address access_flags      (rcx, methodOopDesc::access_flags_offset());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
      __ get_method(rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
      __ movl(rcx, access_flags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
      __ testl(rcx, JVM_ACC_STRICT);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
      __ jccb(Assembler::notZero, L_strict);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
      __ fdivr_d(at_rsp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
      __ jmp(L_join);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
      __ bind(L_strict);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
      __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias1()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
      __ fmul_d (at_rsp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
      __ fdivrp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
      __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias2()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
      __ fmulp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
      __ bind(L_join);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
    case rem: __ fld_d  (at_rsp()); __ fremr(rax); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
    default : ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
  __ d2ieee();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
  // Pop double precision number from rsp.
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1339
  __ pop(rax);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1340
  __ pop(rdx);
1
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::ineg() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
  __ negl(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
void TemplateTable::lneg() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
  transition(ltos, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
  __ lneg(rdx, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
void TemplateTable::fneg() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
  transition(ftos, ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
  __ fchs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
void TemplateTable::dneg() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
  transition(dtos, dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
  __ fchs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
void TemplateTable::iinc() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1369
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
  __ load_signed_byte(rdx, at_bcp(2));           // get constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
  locals_index(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
  __ addl(iaddress(rbx), rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
void TemplateTable::wide_iinc() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
  __ movl(rdx, at_bcp(4));                       // get constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
  locals_index_wide(rbx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1380
  __ bswapl(rdx);                                 // swap bytes & sign-extend constant
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
  __ sarl(rdx, 16);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
  __ addl(iaddress(rbx), rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1383
  // Note: should probably use only one movl to get both
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1384
  //       the index and the constant -> fix this
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1385
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
void TemplateTable::convert() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
  // Checking
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1390
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1391
  { TosState tos_in  = ilgl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
    TosState tos_out = ilgl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1393
    switch (bytecode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
      case Bytecodes::_i2l: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
      case Bytecodes::_i2f: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
      case Bytecodes::_i2d: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
      case Bytecodes::_i2b: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
      case Bytecodes::_i2c: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
      case Bytecodes::_i2s: tos_in = itos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
      case Bytecodes::_l2i: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
      case Bytecodes::_l2f: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
      case Bytecodes::_l2d: tos_in = ltos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
      case Bytecodes::_f2i: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
      case Bytecodes::_f2l: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
      case Bytecodes::_f2d: tos_in = ftos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
      case Bytecodes::_d2i: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
      case Bytecodes::_d2l: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
      case Bytecodes::_d2f: tos_in = dtos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
      default             : ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
    switch (bytecode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
      case Bytecodes::_l2i: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
      case Bytecodes::_f2i: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
      case Bytecodes::_d2i: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
      case Bytecodes::_i2b: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
      case Bytecodes::_i2c: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
      case Bytecodes::_i2s: tos_out = itos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
      case Bytecodes::_i2l: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
      case Bytecodes::_f2l: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
      case Bytecodes::_d2l: tos_out = ltos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
      case Bytecodes::_i2f: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
      case Bytecodes::_l2f: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
      case Bytecodes::_d2f: tos_out = ftos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
      case Bytecodes::_i2d: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
      case Bytecodes::_l2d: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
      case Bytecodes::_f2d: tos_out = dtos; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
      default             : ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1428
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1429
    transition(tos_in, tos_out);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1430
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
#endif // ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1432
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
  // Conversion
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1434
  // (Note: use push(rcx)/pop(rcx) for 1/2-word stack-ptr manipulation)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1435
  switch (bytecode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1436
    case Bytecodes::_i2l:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
      __ extend_sign(rdx, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
    case Bytecodes::_i2f:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1440
      __ push(rax);          // store int on tos
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
      __ fild_s(at_rsp());   // load int to ST0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
      __ f2ieee();           // truncate to float size
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1443
      __ pop(rcx);           // adjust rsp
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1445
    case Bytecodes::_i2d:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1446
      __ push(rax);          // add one slot for d2ieee()
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1447
      __ push(rax);          // store int on tos
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
      __ fild_s(at_rsp());   // load int to ST0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
      __ d2ieee();           // truncate to double size
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1450
      __ pop(rcx);           // adjust rsp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1451
      __ pop(rcx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
    case Bytecodes::_i2b:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
      __ shll(rax, 24);      // truncate upper 24 bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
      __ sarl(rax, 24);      // and sign-extend byte
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1456
      LP64_ONLY(__ movsbl(rax, rax));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
    case Bytecodes::_i2c:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
      __ andl(rax, 0xFFFF);  // truncate upper 16 bits
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1460
      LP64_ONLY(__ movzwl(rax, rax));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
    case Bytecodes::_i2s:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
      __ shll(rax, 16);      // truncate upper 16 bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
      __ sarl(rax, 16);      // and sign-extend short
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1465
      LP64_ONLY(__ movswl(rax, rax));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
    case Bytecodes::_l2i:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
      /* nothing to do */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
    case Bytecodes::_l2f:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1471
      __ push(rdx);          // store long on tos
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1472
      __ push(rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
      __ fild_d(at_rsp());   // load long to ST0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
      __ f2ieee();           // truncate to float size
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1475
      __ pop(rcx);           // adjust rsp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1476
      __ pop(rcx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
    case Bytecodes::_l2d:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1479
      __ push(rdx);          // store long on tos
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1480
      __ push(rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
      __ fild_d(at_rsp());   // load long to ST0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
      __ d2ieee();           // truncate to double size
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1483
      __ pop(rcx);           // adjust rsp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1484
      __ pop(rcx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
    case Bytecodes::_f2i:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1487
      __ push(rcx);          // reserve space for argument
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
      __ fstp_s(at_rsp());   // pass float argument on stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
      __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::f2i), 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
    case Bytecodes::_f2l:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1492
      __ push(rcx);          // reserve space for argument
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
      __ fstp_s(at_rsp());   // pass float argument on stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
      __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::f2l), 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
    case Bytecodes::_f2d:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1497
      /* nothing to do */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
    case Bytecodes::_d2i:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1500
      __ push(rcx);          // reserve space for argument
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1501
      __ push(rcx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1502
      __ fstp_d(at_rsp());   // pass double argument on stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
      __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::d2i), 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1504
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1505
    case Bytecodes::_d2l:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1506
      __ push(rcx);          // reserve space for argument
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1507
      __ push(rcx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
      __ fstp_d(at_rsp());   // pass double argument on stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
      __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::d2l), 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1511
    case Bytecodes::_d2f:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1512
      __ push(rcx);          // reserve space for f2ieee()
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1513
      __ f2ieee();           // truncate to float size
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1514
      __ pop(rcx);           // adjust rsp
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1516
    default             :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1518
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1522
void TemplateTable::lcmp() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1523
  transition(ltos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
  // y = rdx:rax
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1525
  __ pop_l(rbx, rcx);             // get x = rcx:rbx
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1526
  __ lcmp2int(rcx, rbx, rdx, rax);// rcx := cmp(x, y)
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1527
  __ mov(rax, rcx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1529
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
void TemplateTable::float_cmp(bool is_float, int unordered_result) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1532
  if (is_float) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1533
    __ fld_s(at_rsp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1534
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1535
    __ fld_d(at_rsp());
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1536
    __ pop(rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1537
  }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1538
  __ pop(rcx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1539
  __ fcmp2int(rax, unordered_result < 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1540
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1541
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1542
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1543
void TemplateTable::branch(bool is_jsr, bool is_wide) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1544
  __ get_method(rcx);           // ECX holds method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1545
  __ profile_taken_branch(rax,rbx); // EAX holds updated MDP, EBX holds bumped taken count
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1546
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1547
  const ByteSize be_offset = methodOopDesc::backedge_counter_offset() + InvocationCounter::counter_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1548
  const ByteSize inv_offset = methodOopDesc::invocation_counter_offset() + InvocationCounter::counter_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1549
  const int method_offset = frame::interpreter_frame_method_offset * wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1550
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1551
  // Load up EDX with the branch displacement
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1552
  __ movl(rdx, at_bcp(1));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1553
  __ bswapl(rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1554
  if (!is_wide) __ sarl(rdx, 16);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1555
  LP64_ONLY(__ movslq(rdx, rdx));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1556
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1557
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1558
  // Handle all the JSR stuff here, then exit.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1559
  // It's much shorter and cleaner than intermingling with the
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 1909
diff changeset
  1560
  // non-JSR normal-branch stuff occurring below.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1561
  if (is_jsr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1562
    // Pre-load the next target bytecode into EBX
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
    __ load_unsigned_byte(rbx, Address(rsi, rdx, Address::times_1, 0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
    // compute return address as bci in rax,
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1566
    __ lea(rax, at_bcp((is_wide ? 5 : 3) - in_bytes(constMethodOopDesc::codes_offset())));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1567
    __ subptr(rax, Address(rcx, methodOopDesc::const_offset()));
1394
apetrusenko
parents: 1066 1388
diff changeset
  1568
    // Adjust the bcp in RSI by the displacement in EDX
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1569
    __ addptr(rsi, rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1570
    // Push return address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1571
    __ push_i(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
    // jsr returns vtos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1573
    __ dispatch_only_noverify(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1575
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1576
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1577
  // Normal (non-jsr) branch handling
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1578
1394
apetrusenko
parents: 1066 1388
diff changeset
  1579
  // Adjust the bcp in RSI by the displacement in EDX
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1580
  __ addptr(rsi, rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1581
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1582
  assert(UseLoopCounter || !UseOnStackReplacement, "on-stack-replacement requires loop counters");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1583
  Label backedge_counter_overflow;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1584
  Label profile_method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1585
  Label dispatch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1586
  if (UseLoopCounter) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1587
    // increment backedge counter for backward branches
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1588
    // rax,: MDO
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1589
    // rbx,: MDO bumped taken-count
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1590
    // rcx: method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1591
    // rdx: target offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1592
    // rsi: target bcp
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1593
    // rdi: locals pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1594
    __ testl(rdx, rdx);             // check if forward or backward branch
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1595
    __ jcc(Assembler::positive, dispatch); // count only if backward branch
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1596
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1597
    if (TieredCompilation) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1598
      Label no_mdo;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1599
      int increment = InvocationCounter::count_increment;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1600
      int mask = ((1 << Tier0BackedgeNotifyFreqLog) - 1) << InvocationCounter::count_shift;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1601
      if (ProfileInterpreter) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1602
        // Are we profiling?
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1603
        __ movptr(rbx, Address(rcx, in_bytes(methodOopDesc::method_data_offset())));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1604
        __ testptr(rbx, rbx);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1605
        __ jccb(Assembler::zero, no_mdo);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1606
        // Increment the MDO backedge counter
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1607
        const Address mdo_backedge_counter(rbx, in_bytes(methodDataOopDesc::backedge_counter_offset()) +
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1608
                                                in_bytes(InvocationCounter::counter_offset()));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1609
        __ increment_mask_and_jump(mdo_backedge_counter, increment, mask,
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1610
                                   rax, false, Assembler::zero, &backedge_counter_overflow);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1611
        __ jmp(dispatch);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1612
      }
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1613
      __ bind(no_mdo);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1614
      // Increment backedge counter in methodOop
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1615
      __ increment_mask_and_jump(Address(rcx, be_offset), increment, mask,
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1616
                                 rax, false, Assembler::zero, &backedge_counter_overflow);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1617
    } else {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1618
      // increment counter
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1619
      __ movl(rax, Address(rcx, be_offset));        // load backedge counter
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1620
      __ incrementl(rax, InvocationCounter::count_increment); // increment counter
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1621
      __ movl(Address(rcx, be_offset), rax);        // store counter
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1622
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1623
      __ movl(rax, Address(rcx, inv_offset));    // load invocation counter
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1624
      __ andl(rax, InvocationCounter::count_mask_value);     // and the status bits
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1625
      __ addl(rax, Address(rcx, be_offset));        // add both counters
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1626
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1627
      if (ProfileInterpreter) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1628
        // Test to see if we should create a method data oop
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1629
        __ cmp32(rax,
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1630
                 ExternalAddress((address) &InvocationCounter::InterpreterProfileLimit));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1631
        __ jcc(Assembler::less, dispatch);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1632
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1633
        // if no method data exists, go to profile method
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1634
        __ test_method_data_pointer(rax, profile_method);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1635
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1636
        if (UseOnStackReplacement) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1637
          // check for overflow against rbx, which is the MDO taken count
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1638
          __ cmp32(rbx,
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1639
                   ExternalAddress((address) &InvocationCounter::InterpreterBackwardBranchLimit));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1640
          __ jcc(Assembler::below, dispatch);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1641
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1642
          // When ProfileInterpreter is on, the backedge_count comes from the
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1643
          // methodDataOop, which value does not get reset on the call to
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1644
          // frequency_counter_overflow().  To avoid excessive calls to the overflow
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1645
          // routine while the method is being compiled, add a second test to make
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1646
          // sure the overflow function is called only once every overflow_frequency.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1647
          const int overflow_frequency = 1024;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1648
          __ andptr(rbx, overflow_frequency-1);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1649
          __ jcc(Assembler::zero, backedge_counter_overflow);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1650
        }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1651
      } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1652
        if (UseOnStackReplacement) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1653
          // check for overflow against rax, which is the sum of the counters
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1654
          __ cmp32(rax,
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1655
                   ExternalAddress((address) &InvocationCounter::InterpreterBackwardBranchLimit));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1656
          __ jcc(Assembler::aboveEqual, backedge_counter_overflow);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1657
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6176
diff changeset
  1658
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1659
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1660
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1661
    __ bind(dispatch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1662
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1663
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1664
  // Pre-load the next target bytecode into EBX
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1665
  __ load_unsigned_byte(rbx, Address(rsi, 0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1666
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1667
  // continue with the bytecode @ target
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1668
  // rax,: return bci for jsr's, unused otherwise
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1669
  // rbx,: target bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1670
  // rsi: target bcp
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1671
  __ dispatch_only(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1672
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1673
  if (UseLoopCounter) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1674
    if (ProfileInterpreter) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1675
      // Out-of-line code to allocate method data oop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1676
      __ bind(profile_method);
7889
02144432d0e1 4930919: race condition in MDO creation at back branch locations
iveresov
parents: 7397
diff changeset
  1677
      __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1678
      __ load_unsigned_byte(rbx, Address(rsi, 0));  // restore target bytecode
7889
02144432d0e1 4930919: race condition in MDO creation at back branch locations
iveresov
parents: 7397
diff changeset
  1679
      __ set_method_data_pointer_for_bcp();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1680
      __ jmp(dispatch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1681
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1682
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1683
    if (UseOnStackReplacement) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1684
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1685
      // invocation counter overflow
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1686
      __ bind(backedge_counter_overflow);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1687
      __ negptr(rdx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1688
      __ addptr(rdx, rsi);        // branch bcp
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1689
      call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::frequency_counter_overflow), rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1690
      __ load_unsigned_byte(rbx, Address(rsi, 0));  // restore target bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1691
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1692
      // rax,: osr nmethod (osr ok) or NULL (osr not possible)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1693
      // rbx,: target bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1694
      // rdx: scratch
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1695
      // rdi: locals pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1696
      // rsi: bcp
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1697
      __ testptr(rax, rax);                      // test result
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1698
      __ jcc(Assembler::zero, dispatch);         // no osr if null
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1699
      // nmethod may have been invalidated (VM may block upon call_VM return)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1700
      __ movl(rcx, Address(rax, nmethod::entry_bci_offset()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1701
      __ cmpl(rcx, InvalidOSREntryBci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1702
      __ jcc(Assembler::equal, dispatch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1703
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1704
      // We have the address of an on stack replacement routine in rax,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1705
      // We need to prepare to execute the OSR method. First we must
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
      // migrate the locals and monitors off of the stack.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1708
      __ mov(rbx, rax);                             // save the nmethod
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
      const Register thread = rcx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
      __ get_thread(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1712
      call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1713
      // rax, is OSR buffer, move it to expected parameter location
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1714
      __ mov(rcx, rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1715
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1716
      // pop the interpreter frame
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1717
      __ movptr(rdx, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); // get sender sp
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1718
      __ leave();                                // remove frame anchor
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1719
      __ pop(rdi);                               // get return address
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1720
      __ mov(rsp, rdx);                          // set sp to sender sp
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1721
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1722
      // Align stack pointer for compiled code (note that caller is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1723
      // responsible for undoing this fixup by remembering the old SP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1724
      // in an rbp,-relative location)
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1725
      __ andptr(rsp, -(StackAlignmentInBytes));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1726
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1727
      // push the (possibly adjusted) return address
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1728
      __ push(rdi);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1729
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1730
      // and begin the OSR nmethod
354
3b42d6fdcb82 6603919: Stackwalking crash on x86 -server with Sun Studio's collect -j on
sgoldman
parents: 1
diff changeset
  1731
      __ jmp(Address(rbx, nmethod::osr_entry_point_offset()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1732
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1733
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1734
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1735
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1736
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1737
void TemplateTable::if_0cmp(Condition cc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1738
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1739
  // assume branch is more often taken than not (loops use backward branches)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1740
  Label not_taken;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1741
  __ testl(rax, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1742
  __ jcc(j_not(cc), not_taken);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1743
  branch(false, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1744
  __ bind(not_taken);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1745
  __ profile_not_taken_branch(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1746
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1747
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1748
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1749
void TemplateTable::if_icmp(Condition cc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1750
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1751
  // assume branch is more often taken than not (loops use backward branches)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1752
  Label not_taken;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1753
  __ pop_i(rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1754
  __ cmpl(rdx, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1755
  __ jcc(j_not(cc), not_taken);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1756
  branch(false, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1757
  __ bind(not_taken);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1758
  __ profile_not_taken_branch(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1759
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1760
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1761
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1762
void TemplateTable::if_nullcmp(Condition cc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1763
  transition(atos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1764
  // assume branch is more often taken than not (loops use backward branches)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1765
  Label not_taken;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1766
  __ testptr(rax, rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1767
  __ jcc(j_not(cc), not_taken);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1768
  branch(false, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1769
  __ bind(not_taken);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1770
  __ profile_not_taken_branch(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1771
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1772
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1773
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1774
void TemplateTable::if_acmp(Condition cc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1775
  transition(atos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1776
  // assume branch is more often taken than not (loops use backward branches)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1777
  Label not_taken;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1778
  __ pop_ptr(rdx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1779
  __ cmpptr(rdx, rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1780
  __ jcc(j_not(cc), not_taken);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1781
  branch(false, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1782
  __ bind(not_taken);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1783
  __ profile_not_taken_branch(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1784
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1785
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1786
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1787
void TemplateTable::ret() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
  locals_index(rbx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1790
  __ movptr(rbx, iaddress(rbx));                   // get return bci, compute return bcp
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1791
  __ profile_ret(rbx, rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1792
  __ get_method(rax);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1793
  __ movptr(rsi, Address(rax, methodOopDesc::const_offset()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1794
  __ lea(rsi, Address(rsi, rbx, Address::times_1,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1795
                      constMethodOopDesc::codes_offset()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1796
  __ dispatch_next(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1797
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1798
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1799
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1800
void TemplateTable::wide_ret() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1802
  locals_index_wide(rbx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1803
  __ movptr(rbx, iaddress(rbx));                   // get return bci, compute return bcp
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1804
  __ profile_ret(rbx, rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1805
  __ get_method(rax);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1806
  __ movptr(rsi, Address(rax, methodOopDesc::const_offset()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1807
  __ lea(rsi, Address(rsi, rbx, Address::times_1, constMethodOopDesc::codes_offset()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1808
  __ dispatch_next(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1809
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1810
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1811
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1812
void TemplateTable::tableswitch() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1813
  Label default_case, continue_execution;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1814
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1815
  // align rsi
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1816
  __ lea(rbx, at_bcp(wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1817
  __ andptr(rbx, -wordSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1818
  // load lo & hi
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1819
  __ movl(rcx, Address(rbx, 1 * wordSize));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1820
  __ movl(rdx, Address(rbx, 2 * wordSize));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1821
  __ bswapl(rcx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1822
  __ bswapl(rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1823
  // check against lo & hi
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1824
  __ cmpl(rax, rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1825
  __ jccb(Assembler::less, default_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1826
  __ cmpl(rax, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1827
  __ jccb(Assembler::greater, default_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1828
  // lookup dispatch offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1829
  __ subl(rax, rcx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1830
  __ movl(rdx, Address(rbx, rax, Address::times_4, 3 * BytesPerInt));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1831
  __ profile_switch_case(rax, rbx, rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1832
  // continue execution
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1833
  __ bind(continue_execution);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1834
  __ bswapl(rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1835
  __ load_unsigned_byte(rbx, Address(rsi, rdx, Address::times_1));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1836
  __ addptr(rsi, rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1837
  __ dispatch_only(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1838
  // handle default
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1839
  __ bind(default_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1840
  __ profile_switch_default(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1841
  __ movl(rdx, Address(rbx, 0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1842
  __ jmp(continue_execution);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1843
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1844
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1845
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1846
void TemplateTable::lookupswitch() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1847
  transition(itos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1848
  __ stop("lookupswitch bytecode should have been rewritten");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1849
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1850
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1851
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1852
void TemplateTable::fast_linearswitch() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1853
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1854
  Label loop_entry, loop, found, continue_execution;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1855
  // bswapl rax, so we can avoid bswapping the table entries
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1856
  __ bswapl(rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1857
  // align rsi
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1858
  __ lea(rbx, at_bcp(wordSize));                // btw: should be able to get rid of this instruction (change offsets below)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1859
  __ andptr(rbx, -wordSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1860
  // set counter
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1861
  __ movl(rcx, Address(rbx, wordSize));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1862
  __ bswapl(rcx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1863
  __ jmpb(loop_entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1864
  // table search
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1865
  __ bind(loop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1866
  __ cmpl(rax, Address(rbx, rcx, Address::times_8, 2 * wordSize));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1867
  __ jccb(Assembler::equal, found);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1868
  __ bind(loop_entry);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1869
  __ decrementl(rcx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1870
  __ jcc(Assembler::greaterEqual, loop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1871
  // default case
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1872
  __ profile_switch_default(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1873
  __ movl(rdx, Address(rbx, 0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1874
  __ jmpb(continue_execution);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1875
  // entry found -> get offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1876
  __ bind(found);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1877
  __ movl(rdx, Address(rbx, rcx, Address::times_8, 3 * wordSize));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1878
  __ profile_switch_case(rcx, rax, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1879
  // continue execution
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1880
  __ bind(continue_execution);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1881
  __ bswapl(rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1882
  __ load_unsigned_byte(rbx, Address(rsi, rdx, Address::times_1));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1883
  __ addptr(rsi, rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1884
  __ dispatch_only(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1885
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1886
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1887
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1888
void TemplateTable::fast_binaryswitch() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1889
  transition(itos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1890
  // Implementation using the following core algorithm:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1891
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1892
  // int binary_search(int key, LookupswitchPair* array, int n) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1893
  //   // Binary search according to "Methodik des Programmierens" by
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1894
  //   // Edsger W. Dijkstra and W.H.J. Feijen, Addison Wesley Germany 1985.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1895
  //   int i = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1896
  //   int j = n;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1897
  //   while (i+1 < j) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1898
  //     // invariant P: 0 <= i < j <= n and (a[i] <= key < a[j] or Q)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1899
  //     // with      Q: for all i: 0 <= i < n: key < a[i]
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1900
  //     // where a stands for the array and assuming that the (inexisting)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1901
  //     // element a[n] is infinitely big.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1902
  //     int h = (i + j) >> 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1903
  //     // i < h < j
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1904
  //     if (key < array[h].fast_match()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1905
  //       j = h;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1906
  //     } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1907
  //       i = h;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1908
  //     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1909
  //   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1910
  //   // R: a[i] <= key < a[i+1] or Q
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1911
  //   // (i.e., if key is within array, i is the correct index)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1912
  //   return i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1913
  // }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1914
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1915
  // register allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1916
  const Register key   = rax;                    // already set (tosca)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1917
  const Register array = rbx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1918
  const Register i     = rcx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1919
  const Register j     = rdx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1920
  const Register h     = rdi;                    // needs to be restored
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1921
  const Register temp  = rsi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1922
  // setup array
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1923
  __ save_bcp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1924
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1925
  __ lea(array, at_bcp(3*wordSize));             // btw: should be able to get rid of this instruction (change offsets below)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1926
  __ andptr(array, -wordSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1927
  // initialize i & j
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1928
  __ xorl(i, i);                                 // i = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1929
  __ movl(j, Address(array, -wordSize));         // j = length(array);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1930
  // Convert j into native byteordering
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1931
  __ bswapl(j);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1932
  // and start
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1933
  Label entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1934
  __ jmp(entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1935
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1936
  // binary search loop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1937
  { Label loop;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1938
    __ bind(loop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1939
    // int h = (i + j) >> 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1940
    __ leal(h, Address(i, j, Address::times_1)); // h = i + j;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1941
    __ sarl(h, 1);                               // h = (i + j) >> 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1942
    // if (key < array[h].fast_match()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1943
    //   j = h;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1944
    // } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1945
    //   i = h;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1946
    // }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1947
    // Convert array[h].match to native byte-ordering before compare
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1948
    __ movl(temp, Address(array, h, Address::times_8, 0*wordSize));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1949
    __ bswapl(temp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1950
    __ cmpl(key, temp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1951
    if (VM_Version::supports_cmov()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1952
      __ cmovl(Assembler::less        , j, h);   // j = h if (key <  array[h].fast_match())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1953
      __ cmovl(Assembler::greaterEqual, i, h);   // i = h if (key >= array[h].fast_match())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1954
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1955
      Label set_i, end_of_if;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1956
      __ jccb(Assembler::greaterEqual, set_i);     // {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1957
      __ mov(j, h);                                //   j = h;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1958
      __ jmp(end_of_if);                           // }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1959
      __ bind(set_i);                              // else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1960
      __ mov(i, h);                                //   i = h;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1961
      __ bind(end_of_if);                          // }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1962
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1963
    // while (i+1 < j)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1964
    __ bind(entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1965
    __ leal(h, Address(i, 1));                   // i+1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1966
    __ cmpl(h, j);                               // i+1 < j
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1967
    __ jcc(Assembler::less, loop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1968
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1969
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1970
  // end of binary search, result index is i (must check again!)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1971
  Label default_case;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1972
  // Convert array[i].match to native byte-ordering before compare
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1973
  __ movl(temp, Address(array, i, Address::times_8, 0*wordSize));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1974
  __ bswapl(temp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1975
  __ cmpl(key, temp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1976
  __ jcc(Assembler::notEqual, default_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1977
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1978
  // entry found -> j = offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1979
  __ movl(j , Address(array, i, Address::times_8, 1*wordSize));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1980
  __ profile_switch_case(i, key, array);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1981
  __ bswapl(j);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1982
  LP64_ONLY(__ movslq(j, j));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1983
  __ restore_bcp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1984
  __ restore_locals();                           // restore rdi
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1985
  __ load_unsigned_byte(rbx, Address(rsi, j, Address::times_1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1986
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1987
  __ addptr(rsi, j);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1988
  __ dispatch_only(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1989
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1990
  // default case -> j = default offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1991
  __ bind(default_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1992
  __ profile_switch_default(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1993
  __ movl(j, Address(array, -2*wordSize));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1994
  __ bswapl(j);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1995
  LP64_ONLY(__ movslq(j, j));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1996
  __ restore_bcp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
  __ restore_locals();                           // restore rdi
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1998
  __ load_unsigned_byte(rbx, Address(rsi, j, Address::times_1));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1999
  __ addptr(rsi, j);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2000
  __ dispatch_only(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2001
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2002
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2003
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2004
void TemplateTable::_return(TosState state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2005
  transition(state, state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2006
  assert(_desc->calls_vm(), "inconsistent calls_vm information"); // call in remove_activation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2007
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2008
  if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2009
    assert(state == vtos, "only valid state");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2010
    __ movptr(rax, aaddress(0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2011
    __ movptr(rdi, Address(rax, oopDesc::klass_offset_in_bytes()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2012
    __ movl(rdi, Address(rdi, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2013
    __ testl(rdi, JVM_ACC_HAS_FINALIZER);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2014
    Label skip_register_finalizer;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2015
    __ jcc(Assembler::zero, skip_register_finalizer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2016
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2017
    __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2018
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2019
    __ bind(skip_register_finalizer);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2020
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2021
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2022
  __ remove_activation(state, rsi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2023
  __ jmp(rsi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2024
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2025
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2026
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2027
// ----------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2028
// Volatile variables demand their effects be made known to all CPU's in
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2029
// order.  Store buffers on most chips allow reads & writes to reorder; the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2030
// JMM's ReadAfterWrite.java test fails in -Xint mode without some kind of
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2031
// memory barrier (i.e., it's not sufficient that the interpreter does not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2032
// reorder volatile references, the hardware also must not reorder them).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2033
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
// According to the new Java Memory Model (JMM):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
// (1) All volatiles are serialized wrt to each other.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
// ALSO reads & writes act as aquire & release, so:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2037
// (2) A read cannot let unrelated NON-volatile memory refs that happen after
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2038
// the read float up to before the read.  It's OK for non-volatile memory refs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2039
// that happen before the volatile read to float down below it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2040
// (3) Similar a volatile write cannot let unrelated NON-volatile memory refs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
// that happen BEFORE the write float down to after the write.  It's OK for
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2042
// non-volatile memory refs that happen after the volatile write to float up
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
// before it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2044
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
// We only put in barriers around volatile refs (they are expensive), not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
// _between_ memory refs (that would require us to track the flavor of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2047
// previous memory refs).  Requirements (2) and (3) require some barriers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
// before volatile stores and after volatile loads.  These nearly cover
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
// requirement (1) but miss the volatile-store-volatile-load case.  This final
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2050
// case is placed after volatile-stores although it could just as well go
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
// before volatile-loads.
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2052
void TemplateTable::volatile_barrier(Assembler::Membar_mask_bits order_constraint ) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2053
  // Helper function to insert a is-volatile test and memory barrier
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2054
  if( !os::is_MP() ) return;    // Not needed on single CPU
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2055
  __ membar(order_constraint);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2056
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2057
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2058
void TemplateTable::resolve_cache_and_index(int byte_no,
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2059
                                            Register result,
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2060
                                            Register Rcache,
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2061
                                            Register index,
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2062
                                            size_t index_size) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2063
  Register temp = rbx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2064
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2065
  assert_different_registers(result, Rcache, index, temp);
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2066
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2067
  Label resolved;
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2068
  __ get_cache_and_index_at_bcp(Rcache, index, 1, index_size);
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2069
  if (byte_no == f1_oop) {
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2070
    // 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
  2071
    // 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
  2072
    // 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
  2073
    assert(result != noreg, ""); //else do cmpptr(Address(...), (int32_t) NULL_WORD)
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2074
    __ movptr(result, Address(Rcache, index, Address::times_ptr, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f1_offset()));
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2075
    __ testptr(result, result);
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2076
    __ jcc(Assembler::notEqual, resolved);
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2077
  } else {
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2078
    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
  2079
    assert(result == noreg, "");  //else change code for setting result
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2080
    const int shift_count = (1 + byte_no)*BitsPerByte;
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2081
    __ movl(temp, Address(Rcache, index, Address::times_4, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::indices_offset()));
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2082
    __ shrl(temp, shift_count);
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2083
    // have we resolved this bytecode?
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2084
    __ andl(temp, 0xFF);
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2085
    __ cmpl(temp, (int)bytecode());
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2086
    __ jcc(Assembler::equal, resolved);
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2087
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2088
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2089
  // resolve first time through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2090
  address entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2091
  switch (bytecode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2092
    case Bytecodes::_getstatic      : // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2093
    case Bytecodes::_putstatic      : // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2094
    case Bytecodes::_getfield       : // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2095
    case Bytecodes::_putfield       : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_get_put); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2096
    case Bytecodes::_invokevirtual  : // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2097
    case Bytecodes::_invokespecial  : // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2098
    case Bytecodes::_invokestatic   : // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2099
    case Bytecodes::_invokeinterface: entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_invoke);  break;
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2100
    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
  2101
    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
  2102
    case Bytecodes::_fast_aldc_w    : entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_ldc);     break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2103
    default                         : ShouldNotReachHere();                                 break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2104
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2105
  __ movl(temp, (int)bytecode());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2106
  __ call_VM(noreg, entry, temp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2107
  // Update registers with resolved info
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2108
  __ get_cache_and_index_at_bcp(Rcache, index, 1, index_size);
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2109
  if (result != noreg)
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2110
    __ movptr(result, Address(Rcache, index, Address::times_ptr, constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f1_offset()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2111
  __ bind(resolved);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2112
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2113
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2114
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2115
// The cache and index registers must be set before call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2116
void TemplateTable::load_field_cp_cache_entry(Register obj,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2117
                                              Register cache,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2118
                                              Register index,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2119
                                              Register off,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2120
                                              Register flags,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2121
                                              bool is_static = false) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2122
  assert_different_registers(cache, index, flags, off);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2123
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2124
  ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2125
  // Field offset
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2126
  __ movptr(off, Address(cache, index, Address::times_ptr,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2127
                         in_bytes(cp_base_offset + ConstantPoolCacheEntry::f2_offset())));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2128
  // Flags
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2129
  __ movl(flags, Address(cache, index, Address::times_ptr,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2130
           in_bytes(cp_base_offset + ConstantPoolCacheEntry::flags_offset())));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2131
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2132
  // klass     overwrite register
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2133
  if (is_static) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2134
    __ movptr(obj, Address(cache, index, Address::times_ptr,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2135
                           in_bytes(cp_base_offset + ConstantPoolCacheEntry::f1_offset())));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2136
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2137
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2138
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2139
void TemplateTable::load_invoke_cp_cache_entry(int byte_no,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2140
                                               Register method,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2141
                                               Register itable_index,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2142
                                               Register flags,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2143
                                               bool is_invokevirtual,
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2144
                                               bool is_invokevfinal /*unused*/,
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2145
                                               bool is_invokedynamic) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2146
  // setup registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2147
  const Register cache = rcx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2148
  const Register index = rdx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2149
  assert_different_registers(method, flags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2150
  assert_different_registers(method, cache, index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2151
  assert_different_registers(itable_index, flags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2152
  assert_different_registers(itable_index, cache, index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2153
  // determine constant pool cache field offsets
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2154
  const int method_offset = in_bytes(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2155
    constantPoolCacheOopDesc::base_offset() +
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2156
      (is_invokevirtual
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2157
       ? ConstantPoolCacheEntry::f2_offset()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2158
       : ConstantPoolCacheEntry::f1_offset()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2159
      )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2160
    );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2161
  const int flags_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2162
                                    ConstantPoolCacheEntry::flags_offset());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2163
  // access constant pool cache fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2164
  const int index_offset = in_bytes(constantPoolCacheOopDesc::base_offset() +
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2165
                                    ConstantPoolCacheEntry::f2_offset());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2166
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2167
  if (byte_no == f1_oop) {
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2168
    // Resolved f1_oop goes directly into 'method' register.
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2169
    assert(is_invokedynamic, "");
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2170
    resolve_cache_and_index(byte_no, method, cache, index, sizeof(u4));
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2171
  } else {
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2172
    resolve_cache_and_index(byte_no, noreg, cache, index, sizeof(u2));
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2173
    __ movptr(method, Address(cache, index, Address::times_ptr, method_offset));
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2174
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2175
  if (itable_index != noreg) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2176
    __ movptr(itable_index, Address(cache, index, Address::times_ptr, index_offset));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2177
  }
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2178
  __ movl(flags, Address(cache, index, Address::times_ptr, flags_offset));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2179
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2180
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2181
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2182
// The registers cache and index expected to be set before call.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2183
// Correct values of the cache and index registers are preserved.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2184
void TemplateTable::jvmti_post_field_access(Register cache,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2185
                                            Register index,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2186
                                            bool is_static,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2187
                                            bool has_tos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2188
  if (JvmtiExport::can_post_field_access()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2189
    // Check to see if a field access watch has been set before we take
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2190
    // the time to call into the VM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2191
    Label L1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2192
    assert_different_registers(cache, index, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2193
    __ mov32(rax, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2194
    __ testl(rax,rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2195
    __ jcc(Assembler::zero, L1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2196
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2197
    // cache entry pointer
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2198
    __ addptr(cache, in_bytes(constantPoolCacheOopDesc::base_offset()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2199
    __ shll(index, LogBytesPerWord);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2200
    __ addptr(cache, index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2201
    if (is_static) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2202
      __ xorptr(rax, rax);      // NULL object reference
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2203
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2204
      __ pop(atos);         // Get the object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2205
      __ verify_oop(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2206
      __ push(atos);        // Restore stack state
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2207
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2208
    // rax,:   object pointer or NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2209
    // cache: cache entry pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2210
    __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2211
               rax, cache);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2212
    __ get_cache_and_index_at_bcp(cache, index, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2213
    __ bind(L1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2214
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2215
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2216
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2217
void TemplateTable::pop_and_check_object(Register r) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2218
  __ pop_ptr(r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2219
  __ null_check(r);  // for field access must check obj.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2220
  __ verify_oop(r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2221
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2222
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2223
void TemplateTable::getfield_or_static(int byte_no, bool is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2224
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2225
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2226
  const Register cache = rcx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2227
  const Register index = rdx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2228
  const Register obj   = rcx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2229
  const Register off   = rbx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2230
  const Register flags = rax;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2231
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2232
  resolve_cache_and_index(byte_no, noreg, cache, index, sizeof(u2));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2233
  jvmti_post_field_access(cache, index, is_static, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2234
  load_field_cp_cache_entry(obj, cache, index, off, flags, is_static);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2235
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2236
  if (!is_static) pop_and_check_object(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2237
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2238
  const Address lo(obj, off, Address::times_1, 0*wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2239
  const Address hi(obj, off, Address::times_1, 1*wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2240
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2241
  Label Done, notByte, notInt, notShort, notChar, notLong, notFloat, notObj, notDouble;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2242
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2243
  __ shrl(flags, ConstantPoolCacheEntry::tosBits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2244
  assert(btos == 0, "change code, btos != 0");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2245
  // btos
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2246
  __ andptr(flags, 0x0f);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2247
  __ jcc(Assembler::notZero, notByte);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2248
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2249
  __ load_signed_byte(rax, lo );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2250
  __ push(btos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2251
  // Rewrite bytecode to be faster
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2252
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2253
    patch_bytecode(Bytecodes::_fast_bgetfield, rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2254
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2255
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2256
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2257
  __ bind(notByte);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2258
  // itos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2259
  __ cmpl(flags, itos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2260
  __ jcc(Assembler::notEqual, notInt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2261
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2262
  __ movl(rax, lo );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2263
  __ push(itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2264
  // Rewrite bytecode to be faster
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2265
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2266
    patch_bytecode(Bytecodes::_fast_igetfield, rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2267
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2268
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2269
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2270
  __ bind(notInt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2271
  // atos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2272
  __ cmpl(flags, atos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2273
  __ jcc(Assembler::notEqual, notObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2274
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2275
  __ movl(rax, lo );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2276
  __ push(atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2277
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2278
    patch_bytecode(Bytecodes::_fast_agetfield, rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2279
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2280
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2281
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2282
  __ bind(notObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2283
  // ctos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
  __ cmpl(flags, ctos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2285
  __ jcc(Assembler::notEqual, notChar);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2286
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
  2287
  __ load_unsigned_short(rax, lo );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2288
  __ push(ctos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2289
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2290
    patch_bytecode(Bytecodes::_fast_cgetfield, rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2291
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2292
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2293
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2294
  __ bind(notChar);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2295
  // stos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2296
  __ cmpl(flags, stos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2297
  __ jcc(Assembler::notEqual, notShort);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2298
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
  2299
  __ load_signed_short(rax, lo );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2300
  __ push(stos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2301
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2302
    patch_bytecode(Bytecodes::_fast_sgetfield, rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2303
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2304
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2305
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2306
  __ bind(notShort);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2307
  // ltos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2308
  __ cmpl(flags, ltos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2309
  __ jcc(Assembler::notEqual, notLong);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2310
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2311
  // Generate code as if volatile.  There just aren't enough registers to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2312
  // save that information and this code is faster than the test.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2313
  __ fild_d(lo);                // Must load atomically
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2314
  __ subptr(rsp,2*wordSize);    // Make space for store
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2315
  __ fistp_d(Address(rsp,0));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2316
  __ pop(rax);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2317
  __ pop(rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2318
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2319
  __ push(ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2320
  // Don't rewrite to _fast_lgetfield for potential volatile case.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2321
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2322
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2323
  __ bind(notLong);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2324
  // ftos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2325
  __ cmpl(flags, ftos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2326
  __ jcc(Assembler::notEqual, notFloat);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2327
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2328
  __ fld_s(lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2329
  __ push(ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2330
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2331
    patch_bytecode(Bytecodes::_fast_fgetfield, rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2332
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2333
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2334
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2335
  __ bind(notFloat);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2336
  // dtos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2337
  __ cmpl(flags, dtos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2338
  __ jcc(Assembler::notEqual, notDouble);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2339
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2340
  __ fld_d(lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2341
  __ push(dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2342
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2343
    patch_bytecode(Bytecodes::_fast_dgetfield, rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2344
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2345
  __ jmpb(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2346
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2347
  __ bind(notDouble);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2348
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2349
  __ stop("Bad state");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2350
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2351
  __ bind(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2352
  // Doug Lea believes this is not needed with current Sparcs (TSO) and Intel (PSO).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2353
  // volatile_barrier( );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2354
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2355
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2356
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2357
void TemplateTable::getfield(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2358
  getfield_or_static(byte_no, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2359
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2360
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2361
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2362
void TemplateTable::getstatic(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2363
  getfield_or_static(byte_no, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2364
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2365
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2366
// The registers cache and index expected to be set before call.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2367
// The function may destroy various registers, just not the cache and index registers.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2368
void TemplateTable::jvmti_post_field_mod(Register cache, Register index, bool is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2369
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2370
  ByteSize cp_base_offset = constantPoolCacheOopDesc::base_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2371
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2372
  if (JvmtiExport::can_post_field_modification()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2373
    // Check to see if a field modification watch has been set before we take
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2374
    // the time to call into the VM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2375
    Label L1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2376
    assert_different_registers(cache, index, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2377
    __ mov32(rax, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2378
    __ testl(rax, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2379
    __ jcc(Assembler::zero, L1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2380
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2381
    // The cache and index registers have been already set.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2382
    // This allows to eliminate this call but the cache and index
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2383
    // registers have to be correspondingly used after this line.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2384
    __ get_cache_and_index_at_bcp(rax, rdx, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2385
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2386
    if (is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2387
      // Life is simple.  Null out the object pointer.
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2388
      __ xorptr(rbx, rbx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2389
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2390
      // Life is harder. The stack holds the value on top, followed by the object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2391
      // We don't know the size of the value, though; it could be one or two words
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2392
      // depending on its type. As a result, we must find the type to determine where
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2393
      // the object is.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2394
      Label two_word, valsize_known;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2395
      __ movl(rcx, Address(rax, rdx, Address::times_ptr, in_bytes(cp_base_offset +
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2396
                                   ConstantPoolCacheEntry::flags_offset())));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2397
      __ mov(rbx, rsp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2398
      __ shrl(rcx, ConstantPoolCacheEntry::tosBits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2399
      // Make sure we don't need to mask rcx for tosBits after the above shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2400
      ConstantPoolCacheEntry::verify_tosBits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2401
      __ cmpl(rcx, ltos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2402
      __ jccb(Assembler::equal, two_word);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2403
      __ cmpl(rcx, dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2404
      __ jccb(Assembler::equal, two_word);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2405
      __ addptr(rbx, Interpreter::expr_offset_in_bytes(1)); // one word jvalue (not ltos, dtos)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2406
      __ jmpb(valsize_known);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2407
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2408
      __ bind(two_word);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2409
      __ addptr(rbx, Interpreter::expr_offset_in_bytes(2)); // two words jvalue
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2410
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2411
      __ bind(valsize_known);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2412
      // setup object pointer
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2413
      __ movptr(rbx, Address(rbx, 0));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2414
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2415
    // cache entry pointer
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2416
    __ addptr(rax, in_bytes(cp_base_offset));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2417
    __ shll(rdx, LogBytesPerWord);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2418
    __ addptr(rax, rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2419
    // object (tos)
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2420
    __ mov(rcx, rsp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2421
    // rbx,: object pointer set up above (NULL if static)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2422
    // rax,: cache entry pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2423
    // rcx: jvalue object on the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2424
    __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2425
               rbx, rax, rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2426
    __ get_cache_and_index_at_bcp(cache, index, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2427
    __ bind(L1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2428
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2429
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2430
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2431
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2432
void TemplateTable::putfield_or_static(int byte_no, bool is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2433
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2434
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2435
  const Register cache = rcx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2436
  const Register index = rdx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2437
  const Register obj   = rcx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2438
  const Register off   = rbx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2439
  const Register flags = rax;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2440
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2441
  resolve_cache_and_index(byte_no, noreg, cache, index, sizeof(u2));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2442
  jvmti_post_field_mod(cache, index, is_static);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2443
  load_field_cp_cache_entry(obj, cache, index, off, flags, is_static);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2444
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2445
  // Doug Lea believes this is not needed with current Sparcs (TSO) and Intel (PSO).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2446
  // volatile_barrier( );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2447
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2448
  Label notVolatile, Done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2449
  __ movl(rdx, flags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2450
  __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2451
  __ andl(rdx, 0x1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2452
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2453
  // field addresses
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2454
  const Address lo(obj, off, Address::times_1, 0*wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2455
  const Address hi(obj, off, Address::times_1, 1*wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2456
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2457
  Label notByte, notInt, notShort, notChar, notLong, notFloat, notObj, notDouble;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2458
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2459
  __ shrl(flags, ConstantPoolCacheEntry::tosBits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2460
  assert(btos == 0, "change code, btos != 0");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2461
  // btos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2462
  __ andl(flags, 0x0f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2463
  __ jcc(Assembler::notZero, notByte);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2464
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2465
  __ pop(btos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2466
  if (!is_static) pop_and_check_object(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2467
  __ movb(lo, rax );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2468
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2469
    patch_bytecode(Bytecodes::_fast_bputfield, rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2470
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2471
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2472
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2473
  __ bind(notByte);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2474
  // itos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2475
  __ cmpl(flags, itos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2476
  __ jcc(Assembler::notEqual, notInt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2477
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2478
  __ pop(itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2479
  if (!is_static) pop_and_check_object(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2480
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2481
  __ movl(lo, rax );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2482
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2483
    patch_bytecode(Bytecodes::_fast_iputfield, rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2484
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2485
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2486
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2487
  __ bind(notInt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2488
  // atos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2489
  __ cmpl(flags, atos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2490
  __ jcc(Assembler::notEqual, notObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2491
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2492
  __ pop(atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2493
  if (!is_static) pop_and_check_object(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2494
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
  2495
  do_oop_store(_masm, lo, rax, _bs->kind(), false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
  2496
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2497
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2498
    patch_bytecode(Bytecodes::_fast_aputfield, rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2499
  }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
  2500
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2501
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2502
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2503
  __ bind(notObj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2504
  // ctos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2505
  __ cmpl(flags, ctos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2506
  __ jcc(Assembler::notEqual, notChar);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2507
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2508
  __ pop(ctos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2509
  if (!is_static) pop_and_check_object(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2510
  __ movw(lo, rax );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2511
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2512
    patch_bytecode(Bytecodes::_fast_cputfield, rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2513
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2514
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2515
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2516
  __ bind(notChar);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2517
  // stos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2518
  __ cmpl(flags, stos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2519
  __ jcc(Assembler::notEqual, notShort);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2520
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2521
  __ pop(stos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2522
  if (!is_static) pop_and_check_object(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2523
  __ movw(lo, rax );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2524
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2525
    patch_bytecode(Bytecodes::_fast_sputfield, rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2526
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2527
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2528
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2529
  __ bind(notShort);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2530
  // ltos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2531
  __ cmpl(flags, ltos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2532
  __ jcc(Assembler::notEqual, notLong);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2533
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2534
  Label notVolatileLong;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2535
  __ testl(rdx, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2536
  __ jcc(Assembler::zero, notVolatileLong);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2537
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2538
  __ pop(ltos);  // overwrites rdx, do this after testing volatile.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2539
  if (!is_static) pop_and_check_object(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2540
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2541
  // Replace with real volatile test
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2542
  __ push(rdx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2543
  __ push(rax);                 // Must update atomically with FIST
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2544
  __ fild_d(Address(rsp,0));    // So load into FPU register
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2545
  __ fistp_d(lo);               // and put into memory atomically
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2546
  __ addptr(rsp, 2*wordSize);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2547
  // volatile_barrier();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2548
  volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2549
                                               Assembler::StoreStore));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2550
  // Don't rewrite volatile version
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2551
  __ jmp(notVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2552
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2553
  __ bind(notVolatileLong);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2554
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2555
  __ pop(ltos);  // overwrites rdx
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2556
  if (!is_static) pop_and_check_object(obj);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2557
  NOT_LP64(__ movptr(hi, rdx));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2558
  __ movptr(lo, rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2559
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2560
    patch_bytecode(Bytecodes::_fast_lputfield, rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2561
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2562
  __ jmp(notVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2563
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2564
  __ bind(notLong);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2565
  // ftos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2566
  __ cmpl(flags, ftos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2567
  __ jcc(Assembler::notEqual, notFloat);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2568
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2569
  __ pop(ftos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2570
  if (!is_static) pop_and_check_object(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2571
  __ fstp_s(lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2572
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2573
    patch_bytecode(Bytecodes::_fast_fputfield, rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2574
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2575
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2576
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2577
  __ bind(notFloat);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2578
  // dtos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2579
  __ cmpl(flags, dtos );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2580
  __ jcc(Assembler::notEqual, notDouble);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2581
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2582
  __ pop(dtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2583
  if (!is_static) pop_and_check_object(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2584
  __ fstp_d(lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2585
  if (!is_static) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2586
    patch_bytecode(Bytecodes::_fast_dputfield, rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2587
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2588
  __ jmp(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2589
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2590
  __ bind(notDouble);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2591
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2592
  __ stop("Bad state");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2593
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2594
  __ bind(Done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2595
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2596
  // Check for volatile store
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2597
  __ testl(rdx, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2598
  __ jcc(Assembler::zero, notVolatile);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2599
  volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2600
                                               Assembler::StoreStore));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2601
  __ bind(notVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2602
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2603
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2604
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2605
void TemplateTable::putfield(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2606
  putfield_or_static(byte_no, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2607
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2608
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2609
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2610
void TemplateTable::putstatic(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2611
  putfield_or_static(byte_no, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2612
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2613
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2614
void TemplateTable::jvmti_post_fast_field_mod() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2615
  if (JvmtiExport::can_post_field_modification()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2616
    // Check to see if a field modification watch has been set before we take
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2617
    // the time to call into the VM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2618
    Label L2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2619
    __ mov32(rcx, ExternalAddress((address)JvmtiExport::get_field_modification_count_addr()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2620
    __ testl(rcx,rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2621
    __ jcc(Assembler::zero, L2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2622
    __ pop_ptr(rbx);               // copy the object pointer from tos
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2623
    __ verify_oop(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2624
    __ push_ptr(rbx);              // put the object pointer back on tos
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2625
    __ subptr(rsp, sizeof(jvalue));  // add space for a jvalue object
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2626
    __ mov(rcx, rsp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2627
    __ push_ptr(rbx);                 // save object pointer so we can steal rbx,
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2628
    __ xorptr(rbx, rbx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2629
    const Address lo_value(rcx, rbx, Address::times_1, 0*wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2630
    const Address hi_value(rcx, rbx, Address::times_1, 1*wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2631
    switch (bytecode()) {          // load values into the jvalue object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2632
    case Bytecodes::_fast_bputfield: __ movb(lo_value, rax); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2633
    case Bytecodes::_fast_sputfield: __ movw(lo_value, rax); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2634
    case Bytecodes::_fast_cputfield: __ movw(lo_value, rax); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2635
    case Bytecodes::_fast_iputfield: __ movl(lo_value, rax);                         break;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2636
    case Bytecodes::_fast_lputfield:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2637
      NOT_LP64(__ movptr(hi_value, rdx));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2638
      __ movptr(lo_value, rax);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2639
      break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2640
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2641
    // need to call fld_s() after fstp_s() to restore the value for below
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2642
    case Bytecodes::_fast_fputfield: __ fstp_s(lo_value); __ fld_s(lo_value);        break;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2643
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2644
    // need to call fld_d() after fstp_d() to restore the value for below
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2645
    case Bytecodes::_fast_dputfield: __ fstp_d(lo_value); __ fld_d(lo_value);        break;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2646
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2647
    // since rcx is not an object we don't call store_check() here
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2648
    case Bytecodes::_fast_aputfield: __ movptr(lo_value, rax);                       break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2649
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2650
    default:  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2651
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2652
    __ pop_ptr(rbx);  // restore copy of object pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2653
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2654
    // Save rax, and sometimes rdx because call_VM() will clobber them,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2655
    // then use them for JVM/DI purposes
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2656
    __ push(rax);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2657
    if (bytecode() == Bytecodes::_fast_lputfield) __ push(rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2658
    // access constant pool cache entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2659
    __ get_cache_entry_pointer_at_bcp(rax, rdx, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2660
    __ verify_oop(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2661
    // rbx,: object pointer copied above
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2662
    // rax,: cache entry pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2663
    // rcx: jvalue object on the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2664
    __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_modification), rbx, rax, rcx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2665
    if (bytecode() == Bytecodes::_fast_lputfield) __ pop(rdx);  // restore high value
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2666
    __ pop(rax);     // restore lower value
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2667
    __ addptr(rsp, sizeof(jvalue));  // release jvalue object space
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2668
    __ bind(L2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2669
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2670
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2671
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2672
void TemplateTable::fast_storefield(TosState state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2673
  transition(state, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2674
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2675
  ByteSize base = constantPoolCacheOopDesc::base_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2676
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2677
  jvmti_post_fast_field_mod();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2678
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2679
  // access constant pool cache
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2680
  __ get_cache_and_index_at_bcp(rcx, rbx, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2681
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2682
  // test for volatile with rdx but rdx is tos register for lputfield.
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2683
  if (bytecode() == Bytecodes::_fast_lputfield) __ push(rdx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2684
  __ movl(rdx, Address(rcx, rbx, Address::times_ptr, in_bytes(base +
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2685
                       ConstantPoolCacheEntry::flags_offset())));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2686
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2687
  // replace index with field offset from cache entry
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2688
  __ movptr(rbx, Address(rcx, rbx, Address::times_ptr, in_bytes(base + ConstantPoolCacheEntry::f2_offset())));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2689
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2690
  // Doug Lea believes this is not needed with current Sparcs (TSO) and Intel (PSO).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2691
  // volatile_barrier( );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2692
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2693
  Label notVolatile, Done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2694
  __ shrl(rdx, ConstantPoolCacheEntry::volatileField);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2695
  __ andl(rdx, 0x1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2696
  // Check for volatile store
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2697
  __ testl(rdx, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2698
  __ jcc(Assembler::zero, notVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2699
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2700
  if (bytecode() == Bytecodes::_fast_lputfield) __ pop(rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2701
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2702
  // Get object from stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2703
  pop_and_check_object(rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2704
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2705
  // field addresses
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2706
  const Address lo(rcx, rbx, Address::times_1, 0*wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2707
  const Address hi(rcx, rbx, Address::times_1, 1*wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2708
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2709
  // access field
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2710
  switch (bytecode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2711
    case Bytecodes::_fast_bputfield: __ movb(lo, rax); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2712
    case Bytecodes::_fast_sputfield: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2713
    case Bytecodes::_fast_cputfield: __ movw(lo, rax); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2714
    case Bytecodes::_fast_iputfield: __ movl(lo, rax); break;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2715
    case Bytecodes::_fast_lputfield:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2716
      NOT_LP64(__ movptr(hi, rdx));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2717
      __ movptr(lo, rax);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2718
      break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2719
    case Bytecodes::_fast_fputfield: __ fstp_s(lo); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2720
    case Bytecodes::_fast_dputfield: __ fstp_d(lo); break;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
  2721
    case Bytecodes::_fast_aputfield: {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
  2722
      do_oop_store(_masm, lo, rax, _bs->kind(), false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
  2723
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
  2724
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2725
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2726
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2727
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2728
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2729
  Label done;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2730
  volatile_barrier(Assembler::Membar_mask_bits(Assembler::StoreLoad |
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2731
                                               Assembler::StoreStore));
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
  2732
  // Barriers are so large that short branch doesn't reach!
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
  2733
  __ jmp(done);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2734
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2735
  // Same code as above, but don't need rdx to test for volatile.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2736
  __ bind(notVolatile);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2737
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2738
  if (bytecode() == Bytecodes::_fast_lputfield) __ pop(rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2739
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2740
  // Get object from stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2741
  pop_and_check_object(rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2742
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2743
  // access field
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2744
  switch (bytecode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2745
    case Bytecodes::_fast_bputfield: __ movb(lo, rax); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2746
    case Bytecodes::_fast_sputfield: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2747
    case Bytecodes::_fast_cputfield: __ movw(lo, rax); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2748
    case Bytecodes::_fast_iputfield: __ movl(lo, rax); break;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2749
    case Bytecodes::_fast_lputfield:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2750
      NOT_LP64(__ movptr(hi, rdx));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2751
      __ movptr(lo, rax);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2752
      break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2753
    case Bytecodes::_fast_fputfield: __ fstp_s(lo); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2754
    case Bytecodes::_fast_dputfield: __ fstp_d(lo); break;
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
  2755
    case Bytecodes::_fast_aputfield: {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
  2756
      do_oop_store(_masm, lo, rax, _bs->kind(), false);
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
  2757
      break;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
  2758
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2759
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2760
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2761
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2762
  __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2763
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2764
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2765
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2766
void TemplateTable::fast_accessfield(TosState state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2767
  transition(atos, state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2768
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2769
  // do the JVMTI work here to avoid disturbing the register state below
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2770
  if (JvmtiExport::can_post_field_access()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2771
    // Check to see if a field access watch has been set before we take
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2772
    // the time to call into the VM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2773
    Label L1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2774
    __ mov32(rcx, ExternalAddress((address) JvmtiExport::get_field_access_count_addr()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2775
    __ testl(rcx,rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2776
    __ jcc(Assembler::zero, L1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2777
    // access constant pool cache entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2778
    __ get_cache_entry_pointer_at_bcp(rcx, rdx, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2779
    __ push_ptr(rax);  // save object pointer before call_VM() clobbers it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2780
    __ verify_oop(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2781
    // rax,: object pointer copied above
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2782
    // rcx: cache entry pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2783
    __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::post_field_access), rax, rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2784
    __ pop_ptr(rax);   // restore object pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2785
    __ bind(L1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2786
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2787
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2788
  // access constant pool cache
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2789
  __ get_cache_and_index_at_bcp(rcx, rbx, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2790
  // replace index with field offset from cache entry
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2791
  __ movptr(rbx, Address(rcx,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2792
                         rbx,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2793
                         Address::times_ptr,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2794
                         in_bytes(constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f2_offset())));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2795
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2796
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2797
  // rax,: object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2798
  __ verify_oop(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2799
  __ null_check(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2800
  // field addresses
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2801
  const Address lo = Address(rax, rbx, Address::times_1, 0*wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2802
  const Address hi = Address(rax, rbx, Address::times_1, 1*wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2803
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2804
  // access field
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2805
  switch (bytecode()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2806
    case Bytecodes::_fast_bgetfield: __ movsbl(rax, lo );                 break;
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
  2807
    case Bytecodes::_fast_sgetfield: __ load_signed_short(rax, lo );      break;
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
  2808
    case Bytecodes::_fast_cgetfield: __ load_unsigned_short(rax, lo );    break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2809
    case Bytecodes::_fast_igetfield: __ movl(rax, lo);                    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2810
    case Bytecodes::_fast_lgetfield: __ stop("should not be rewritten");  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2811
    case Bytecodes::_fast_fgetfield: __ fld_s(lo);                        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2812
    case Bytecodes::_fast_dgetfield: __ fld_d(lo);                        break;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2813
    case Bytecodes::_fast_agetfield: __ movptr(rax, lo); __ verify_oop(rax); break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2814
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2815
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2816
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2817
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2818
  // Doug Lea believes this is not needed with current Sparcs(TSO) and Intel(PSO)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2819
  // volatile_barrier( );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2820
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2821
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2822
void TemplateTable::fast_xaccess(TosState state) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2823
  transition(vtos, state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2824
  // get receiver
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2825
  __ movptr(rax, aaddress(0));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2826
  // access constant pool cache
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2827
  __ get_cache_and_index_at_bcp(rcx, rdx, 2);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2828
  __ movptr(rbx, Address(rcx,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2829
                         rdx,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2830
                         Address::times_ptr,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2831
                         in_bytes(constantPoolCacheOopDesc::base_offset() + ConstantPoolCacheEntry::f2_offset())));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2832
  // make sure exception is reported in correct bcp range (getfield is next instruction)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2833
  __ increment(rsi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2834
  __ null_check(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2835
  const Address lo = Address(rax, rbx, Address::times_1, 0*wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2836
  if (state == itos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2837
    __ movl(rax, lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2838
  } else if (state == atos) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2839
    __ movptr(rax, lo);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2840
    __ verify_oop(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2841
  } else if (state == ftos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2842
    __ fld_s(lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2843
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2844
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2845
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2846
  __ decrement(rsi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2847
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2848
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2849
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2850
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2851
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2852
// Calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2853
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2854
void TemplateTable::count_calls(Register method, Register temp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2855
  // implemented elsewhere
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2856
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2857
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2858
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2859
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2860
void TemplateTable::prepare_invoke(Register method, Register index, int byte_no) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2861
  // determine flags
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2862
  Bytecodes::Code code = bytecode();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2863
  const bool is_invokeinterface  = code == Bytecodes::_invokeinterface;
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2864
  const bool is_invokedynamic    = code == Bytecodes::_invokedynamic;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2865
  const bool is_invokevirtual    = code == Bytecodes::_invokevirtual;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2866
  const bool is_invokespecial    = code == Bytecodes::_invokespecial;
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2867
  const bool load_receiver      = (code != Bytecodes::_invokestatic && code != Bytecodes::_invokedynamic);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2868
  const bool receiver_null_check = is_invokespecial;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2869
  const bool save_flags = is_invokeinterface || is_invokevirtual;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2870
  // setup registers & access constant pool cache
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2871
  const Register recv   = rcx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2872
  const Register flags  = rdx;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2873
  assert_different_registers(method, index, recv, flags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2874
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2875
  // save 'interpreter return address'
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2876
  __ save_bcp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2877
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2878
  load_invoke_cp_cache_entry(byte_no, method, index, flags, is_invokevirtual, false, is_invokedynamic);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2879
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2880
  // load receiver if needed (note: no return address pushed yet)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2881
  if (load_receiver) {
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2882
    assert(!is_invokedynamic, "");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2883
    __ movl(recv, flags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2884
    __ andl(recv, 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2885
    // recv count is 0 based?
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2886
    Address recv_addr(rsp, recv, Interpreter::stackElementScale(), -Interpreter::expr_offset_in_bytes(1));
5055
743f38c6e179 6932091: JSR 292 x86 code cleanup
twisti
parents: 4478
diff changeset
  2887
    __ movptr(recv, recv_addr);
743f38c6e179 6932091: JSR 292 x86 code cleanup
twisti
parents: 4478
diff changeset
  2888
    __ verify_oop(recv);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2889
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2890
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2891
  // do null check if needed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2892
  if (receiver_null_check) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2893
    __ null_check(recv);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2894
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2895
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2896
  if (save_flags) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2897
    __ mov(rsi, flags);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2898
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2899
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2900
  // compute return type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2901
  __ shrl(flags, ConstantPoolCacheEntry::tosBits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2902
  // Make sure we don't need to mask flags for tosBits after the above shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2903
  ConstantPoolCacheEntry::verify_tosBits();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2904
  // load return address
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2905
  {
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2906
    address table_addr;
4429
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 2570
diff changeset
  2907
    if (is_invokeinterface || is_invokedynamic)
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2908
      table_addr = (address)Interpreter::return_5_addrs_by_index_table();
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2909
    else
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2910
      table_addr = (address)Interpreter::return_3_addrs_by_index_table();
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2911
    ExternalAddress table(table_addr);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2912
    __ movptr(flags, ArrayAddress(table, Address(noreg, flags, Address::times_ptr)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2913
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2914
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2915
  // push return address
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2916
  __ push(flags);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2917
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2918
  // Restore flag value from the constant pool cache, and restore rsi
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2919
  // for later null checks.  rsi is the bytecode pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2920
  if (save_flags) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2921
    __ mov(flags, rsi);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2922
    __ restore_bcp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2923
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2924
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2925
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2926
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2927
void TemplateTable::invokevirtual_helper(Register index, Register recv,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2928
                        Register flags) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2929
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2930
  // Uses temporary registers rax, rdx
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2931
  assert_different_registers(index, recv, rax, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2932
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2933
  // Test for an invoke of a final method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2934
  Label notFinal;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2935
  __ movl(rax, flags);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2936
  __ andl(rax, (1 << ConstantPoolCacheEntry::vfinalMethod));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2937
  __ jcc(Assembler::zero, notFinal);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2938
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2939
  Register method = index;  // method must be rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2940
  assert(method == rbx, "methodOop must be rbx, for interpreter calling convention");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2941
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2942
  // do the call - the index is actually the method to call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2943
  __ verify_oop(method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2944
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2945
  // It's final, need a null check here!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2946
  __ null_check(recv);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2947
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2948
  // profile this call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2949
  __ profile_final_call(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2950
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2951
  __ jump_from_interpreted(method, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2952
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2953
  __ bind(notFinal);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2954
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2955
  // get receiver klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2956
  __ null_check(recv, oopDesc::klass_offset_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2957
  // Keep recv in rcx for callee expects it there
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2958
  __ movptr(rax, Address(recv, oopDesc::klass_offset_in_bytes()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2959
  __ verify_oop(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2960
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2961
  // profile this call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2962
  __ profile_virtual_call(rax, rdi, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2963
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2964
  // get target methodOop & entry point
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2965
  const int base = instanceKlass::vtable_start_offset() * wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2966
  assert(vtableEntry::size() * wordSize == 4, "adjust the scaling in the code below");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2967
  __ movptr(method, Address(rax, index, Address::times_ptr, base + vtableEntry::method_offset_in_bytes()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2968
  __ jump_from_interpreted(method, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2969
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2970
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2971
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2972
void TemplateTable::invokevirtual(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2973
  transition(vtos, vtos);
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2974
  assert(byte_no == f2_byte, "use this argument");
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2975
  prepare_invoke(rbx, noreg, byte_no);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2976
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2977
  // rbx,: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2978
  // rcx: receiver
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2979
  // rdx: flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2980
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2981
  invokevirtual_helper(rbx, rcx, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2982
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2983
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2984
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2985
void TemplateTable::invokespecial(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2986
  transition(vtos, vtos);
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2987
  assert(byte_no == f1_byte, "use this argument");
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2988
  prepare_invoke(rbx, noreg, byte_no);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2989
  // do the call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2990
  __ verify_oop(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2991
  __ profile_call(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2992
  __ jump_from_interpreted(rbx, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2993
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2994
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2995
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2996
void TemplateTable::invokestatic(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2997
  transition(vtos, vtos);
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  2998
  assert(byte_no == f1_byte, "use this argument");
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  2999
  prepare_invoke(rbx, noreg, byte_no);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3000
  // do the call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3001
  __ verify_oop(rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3002
  __ profile_call(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3003
  __ jump_from_interpreted(rbx, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3004
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3005
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3006
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3007
void TemplateTable::fast_invokevfinal(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3008
  transition(vtos, vtos);
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  3009
  assert(byte_no == f2_byte, "use this argument");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3010
  __ stop("fast_invokevfinal not used on x86");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3011
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3012
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3013
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3014
void TemplateTable::invokeinterface(int byte_no) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3015
  transition(vtos, vtos);
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  3016
  assert(byte_no == f1_byte, "use this argument");
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3017
  prepare_invoke(rax, rbx, byte_no);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3018
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3019
  // rax,: Interface
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3020
  // rbx,: index
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3021
  // rcx: receiver
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3022
  // rdx: flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3023
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3024
  // Special case of invokeinterface called for virtual method of
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3025
  // java.lang.Object.  See cpCacheOop.cpp for details.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3026
  // This code isn't produced by javac, but could be produced by
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3027
  // another compliant java compiler.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3028
  Label notMethod;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3029
  __ movl(rdi, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3030
  __ andl(rdi, (1 << ConstantPoolCacheEntry::methodInterface));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3031
  __ jcc(Assembler::zero, notMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3032
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3033
  invokevirtual_helper(rbx, rcx, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3034
  __ bind(notMethod);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3035
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3036
  // Get receiver klass into rdx - also a null check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3037
  __ restore_locals();  // restore rdi
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3038
  __ movptr(rdx, Address(rcx, oopDesc::klass_offset_in_bytes()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3039
  __ verify_oop(rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3040
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3041
  // profile this call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3042
  __ profile_virtual_call(rdx, rsi, rdi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3043
2149
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3044
  Label no_such_interface, no_such_method;
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3045
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3046
  __ lookup_interface_method(// inputs: rec. class, interface, itable index
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3047
                             rdx, rax, rbx,
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3048
                             // outputs: method, scan temp. reg
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3049
                             rbx, rsi,
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3050
                             no_such_interface);
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3051
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3052
  // rbx,: methodOop to call
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3053
  // rcx: receiver
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3054
  // Check for abstract method error
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3055
  // Note: This should be done more efficiently via a throw_abstract_method_error
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3056
  //       interpreter entry point and a conditional jump to it in case of a null
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3057
  //       method.
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3058
  __ testptr(rbx, rbx);
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3059
  __ jcc(Assembler::zero, no_such_method);
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3060
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3061
  // do the call
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3062
  // rcx: receiver
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3063
  // rbx,: methodOop
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3064
  __ jump_from_interpreted(rbx, rdx);
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3065
  __ should_not_reach_here();
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3066
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3067
  // exception handling code follows...
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3068
  // note: must restore interpreter registers to canonical
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3069
  //       state for exception handling to work correctly!
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3070
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3071
  __ bind(no_such_method);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3072
  // throw exception
2149
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3073
  __ pop(rbx);           // pop return address (pushed by prepare_invoke)
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3074
  __ restore_bcp();      // rsi must be correct for exception handler   (was destroyed)
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3075
  __ restore_locals();   // make sure locals pointer is correct as well (was destroyed)
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3076
  __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError));
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3077
  // the call_VM checks for exception, so we should never return here.
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3078
  __ should_not_reach_here();
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3079
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3080
  __ bind(no_such_interface);
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  3081
  // throw exception
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3082
  __ pop(rbx);           // pop return address (pushed by prepare_invoke)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3083
  __ restore_bcp();      // rsi must be correct for exception handler   (was destroyed)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3084
  __ restore_locals();   // make sure locals pointer is correct as well (was destroyed)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3085
  __ call_VM(noreg, CAST_FROM_FN_PTR(address,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3086
                   InterpreterRuntime::throw_IncompatibleClassChangeError));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3087
  // the call_VM checks for exception, so we should never return here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3088
  __ should_not_reach_here();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3089
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3090
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3091
void TemplateTable::invokedynamic(int byte_no) {
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3092
  transition(vtos, vtos);
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3093
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3094
  if (!EnableInvokeDynamic) {
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3095
    // We should not encounter this bytecode if !EnableInvokeDynamic.
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3096
    // The verifier will stop it.  However, if we get past the verifier,
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3097
    // this will stop the thread in a reasonable way, without crashing the JVM.
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3098
    __ call_VM(noreg, CAST_FROM_FN_PTR(address,
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3099
                     InterpreterRuntime::throw_IncompatibleClassChangeError));
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3100
    // the call_VM checks for exception, so we should never return here.
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3101
    __ should_not_reach_here();
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3102
    return;
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3103
  }
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3104
5688
9052dc91ea67 6939207: refactor constant pool index processing
jrose
parents: 5419
diff changeset
  3105
  assert(byte_no == f1_oop, "use this argument");
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3106
  prepare_invoke(rax, rbx, byte_no);
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3107
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3108
  // rax: CallSite object (f1)
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3109
  // rbx: unused (f2)
6772
2563324665d5 6829194: JSR 292 needs to support compressed oops
twisti
parents: 6453
diff changeset
  3110
  // rcx: receiver address
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3111
  // rdx: flags (unused)
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3112
6772
2563324665d5 6829194: JSR 292 needs to support compressed oops
twisti
parents: 6453
diff changeset
  3113
  Register rax_callsite      = rax;
2563324665d5 6829194: JSR 292 needs to support compressed oops
twisti
parents: 6453
diff changeset
  3114
  Register rcx_method_handle = rcx;
2563324665d5 6829194: JSR 292 needs to support compressed oops
twisti
parents: 6453
diff changeset
  3115
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3116
  if (ProfileInterpreter) {
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3117
    // %%% should make a type profile for any invokedynamic that takes a ref argument
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3118
    // profile this call
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3119
    __ profile_call(rsi);
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3120
  }
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3121
8676
9098d4e927e1 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 8315
diff changeset
  3122
  __ movptr(rcx_method_handle, Address(rax_callsite, __ delayed_value(java_lang_invoke_CallSite::target_offset_in_bytes, rcx)));
6772
2563324665d5 6829194: JSR 292 needs to support compressed oops
twisti
parents: 6453
diff changeset
  3123
  __ null_check(rcx_method_handle);
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3124
  __ prepare_to_jump_from_interpreted();
6772
2563324665d5 6829194: JSR 292 needs to support compressed oops
twisti
parents: 6453
diff changeset
  3125
  __ jump_to_method_handle_entry(rcx_method_handle, rdx);
2570
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3126
}
ecc7862946d4 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 2154
diff changeset
  3127
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3128
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3129
// Allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3130
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3131
void TemplateTable::_new() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3132
  transition(vtos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3133
  __ get_unsigned_2_byte_index_at_bcp(rdx, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3134
  Label slow_case;
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5882
diff changeset
  3135
  Label slow_case_no_pop;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3136
  Label done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3137
  Label initialize_header;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3138
  Label initialize_object;  // including clearing the fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3139
  Label allocate_shared;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3140
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3141
  __ get_cpool_and_tags(rcx, rax);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5882
diff changeset
  3142
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5882
diff changeset
  3143
  // Make sure the class we're about to instantiate has been resolved.
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5882
diff changeset
  3144
  // 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
  3145
  // how Constant Pool is updated (see constantPoolOopDesc::klass_at_put)
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5882
diff changeset
  3146
  const int tags_offset = typeArrayOopDesc::header_size(T_BYTE) * wordSize;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5882
diff changeset
  3147
  __ cmpb(Address(rax, rdx, Address::times_1, tags_offset), JVM_CONSTANT_Class);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5882
diff changeset
  3148
  __ jcc(Assembler::notEqual, slow_case_no_pop);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5882
diff changeset
  3149
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3150
  // get instanceKlass
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3151
  __ movptr(rcx, Address(rcx, rdx, Address::times_ptr, sizeof(constantPoolOopDesc)));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3152
  __ push(rcx);  // save the contexts of klass for initializing the header
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3153
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3154
  // make sure klass is initialized & doesn't have finalizer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3155
  // make sure klass is fully initialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3156
  __ cmpl(Address(rcx, instanceKlass::init_state_offset_in_bytes() + sizeof(oopDesc)), instanceKlass::fully_initialized);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3157
  __ jcc(Assembler::notEqual, slow_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3158
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3159
  // get instance_size in instanceKlass (scaled to a count of bytes)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3160
  __ movl(rdx, Address(rcx, Klass::layout_helper_offset_in_bytes() + sizeof(oopDesc)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3161
  // test to see if it has a finalizer or is malformed in some way
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3162
  __ testl(rdx, Klass::_lh_instance_slow_path_bit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3163
  __ jcc(Assembler::notZero, slow_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3164
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3165
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3166
  // Allocate the instance
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3167
  // 1) Try to allocate in the TLAB
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3168
  // 2) if fail and the object is large allocate in the shared Eden
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3169
  // 3) if the above fails (or is not applicable), go to a slow case
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3170
  // (creates a new TLAB, etc.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3171
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3172
  const bool allow_shared_alloc =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3173
    Universe::heap()->supports_inline_contig_alloc() && !CMSIncrementalMode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3174
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3175
  const Register thread = rcx;
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3176
  if (UseTLAB || allow_shared_alloc) {
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3177
    __ get_thread(thread);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3178
  }
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3179
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3180
  if (UseTLAB) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3181
    __ movptr(rax, Address(thread, in_bytes(JavaThread::tlab_top_offset())));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3182
    __ lea(rbx, Address(rax, rdx, Address::times_1));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3183
    __ cmpptr(rbx, Address(thread, in_bytes(JavaThread::tlab_end_offset())));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3184
    __ jcc(Assembler::above, allow_shared_alloc ? allocate_shared : slow_case);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3185
    __ movptr(Address(thread, in_bytes(JavaThread::tlab_top_offset())), rbx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3186
    if (ZeroTLAB) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3187
      // the fields have been already cleared
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3188
      __ jmp(initialize_header);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3189
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3190
      // initialize both the header and fields
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3191
      __ jmp(initialize_object);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3192
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3193
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3194
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3195
  // Allocation in the shared Eden, if allowed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3196
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3197
  // rdx: instance size in bytes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3198
  if (allow_shared_alloc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3199
    __ bind(allocate_shared);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3200
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
  3201
    ExternalAddress heap_top((address)Universe::heap()->top_addr());
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 354
diff changeset
  3202
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3203
    Label retry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3204
    __ bind(retry);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3205
    __ movptr(rax, heap_top);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3206
    __ lea(rbx, Address(rax, rdx, Address::times_1));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3207
    __ cmpptr(rbx, ExternalAddress((address)Universe::heap()->end_addr()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3208
    __ jcc(Assembler::above, slow_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3209
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3210
    // Compare rax, with the top addr, and if still equal, store the new
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3211
    // top addr in rbx, at the address of the top addr pointer. Sets ZF if was
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3212
    // equal, and clears it otherwise. Use lock prefix for atomicity on MPs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3213
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3214
    // rax,: object begin
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3215
    // rbx,: object end
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3216
    // rdx: instance size in bytes
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3217
    __ locked_cmpxchgptr(rbx, heap_top);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3218
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3219
    // if someone beat us on the allocation, try again, otherwise continue
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3220
    __ jcc(Assembler::notEqual, retry);
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3221
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3222
    __ incr_allocated_bytes(thread, rdx, 0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3223
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3224
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3225
  if (UseTLAB || Universe::heap()->supports_inline_contig_alloc()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3226
    // The object is initialized before the header.  If the object size is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3227
    // zero, go directly to the header initialization.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3228
    __ bind(initialize_object);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3229
    __ decrement(rdx, sizeof(oopDesc));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3230
    __ jcc(Assembler::zero, initialize_header);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3231
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3232
    // Initialize topmost object field, divide rdx by 8, check if odd and
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3233
    // test if zero.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3234
    __ xorl(rcx, rcx);    // use zero reg to clear memory (shorter code)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3235
    __ shrl(rdx, LogBytesPerLong); // divide by 2*oopSize and set carry flag if odd
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3236
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7397
diff changeset
  3237
    // rdx must have been multiple of 8
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3238
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3239
    // make sure rdx was multiple of 8
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3240
    Label L;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3241
    // Ignore partial flag stall after shrl() since it is debug VM
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3242
    __ jccb(Assembler::carryClear, L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3243
    __ stop("object size is not multiple of 2 - adjust this code");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3244
    __ bind(L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3245
    // rdx must be > 0, no extra check needed here
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3246
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3247
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3248
    // initialize remaining object fields: rdx was a multiple of 8
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3249
    { Label loop;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3250
    __ bind(loop);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3251
    __ movptr(Address(rax, rdx, Address::times_8, sizeof(oopDesc) - 1*oopSize), rcx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3252
    NOT_LP64(__ movptr(Address(rax, rdx, Address::times_8, sizeof(oopDesc) - 2*oopSize), rcx));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3253
    __ decrement(rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3254
    __ jcc(Assembler::notZero, loop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3255
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3256
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3257
    // initialize object header only.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3258
    __ bind(initialize_header);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3259
    if (UseBiasedLocking) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3260
      __ pop(rcx);   // get saved klass back in the register.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3261
      __ movptr(rbx, Address(rcx, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3262
      __ movptr(Address(rax, oopDesc::mark_offset_in_bytes ()), rbx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3263
    } else {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3264
      __ movptr(Address(rax, oopDesc::mark_offset_in_bytes ()),
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3265
                (int32_t)markOopDesc::prototype()); // header
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3266
      __ pop(rcx);   // get saved klass back in the register.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3267
    }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3268
    __ movptr(Address(rax, oopDesc::klass_offset_in_bytes()), rcx);  // klass
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3269
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3270
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3271
      SkipIfEqual skip_if(_masm, &DTraceAllocProbes, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3272
      // Trigger dtrace event for fastpath
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3273
      __ push(atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3274
      __ call_VM_leaf(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3275
           CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc), rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3276
      __ pop(atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3277
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3278
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3279
    __ jmp(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3280
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3281
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3282
  // slow case
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3283
  __ bind(slow_case);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3284
  __ pop(rcx);   // restore stack pointer to what it was when we came in.
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5882
diff changeset
  3285
  __ bind(slow_case_no_pop);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3286
  __ get_constant_pool(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3287
  __ get_unsigned_2_byte_index_at_bcp(rdx, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3288
  call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::_new), rax, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3289
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3290
  // continue
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3291
  __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3292
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3293
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3294
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3295
void TemplateTable::newarray() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3296
  transition(itos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3297
  __ push_i(rax);                                 // make sure everything is on the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3298
  __ load_unsigned_byte(rdx, at_bcp(1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3299
  call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::newarray), rdx, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3300
  __ pop_i(rdx);                                  // discard size
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3301
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3302
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3303
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3304
void TemplateTable::anewarray() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3305
  transition(itos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3306
  __ get_unsigned_2_byte_index_at_bcp(rdx, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3307
  __ get_constant_pool(rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3308
  call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::anewarray), rcx, rdx, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3309
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3310
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3311
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3312
void TemplateTable::arraylength() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3313
  transition(atos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3314
  __ null_check(rax, arrayOopDesc::length_offset_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3315
  __ movl(rax, Address(rax, arrayOopDesc::length_offset_in_bytes()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3316
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3317
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3318
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3319
void TemplateTable::checkcast() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3320
  transition(atos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3321
  Label done, is_null, ok_is_subtype, quicked, resolved;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3322
  __ testptr(rax, rax);   // Object is in EAX
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3323
  __ jcc(Assembler::zero, is_null);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3324
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3325
  // Get cpool & tags index
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3326
  __ get_cpool_and_tags(rcx, rdx); // ECX=cpool, EDX=tags array
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3327
  __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // EBX=index
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3328
  // See if bytecode has already been quicked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3329
  __ cmpb(Address(rdx, rbx, Address::times_1, typeArrayOopDesc::header_size(T_BYTE) * wordSize), JVM_CONSTANT_Class);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3330
  __ jcc(Assembler::equal, quicked);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3331
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3332
  __ push(atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3333
  call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc) );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3334
  __ pop_ptr(rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3335
  __ jmpb(resolved);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3336
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3337
  // Get superklass in EAX and subklass in EBX
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3338
  __ bind(quicked);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3339
  __ mov(rdx, rax);          // Save object in EDX; EAX needed for subtype check
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3340
  __ movptr(rax, Address(rcx, rbx, Address::times_ptr, sizeof(constantPoolOopDesc)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3341
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3342
  __ bind(resolved);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3343
  __ movptr(rbx, Address(rdx, oopDesc::klass_offset_in_bytes()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3344
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3345
  // Generate subtype check.  Blows ECX.  Resets EDI.  Object in EDX.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3346
  // Superklass in EAX.  Subklass in EBX.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3347
  __ gen_subtype_check( rbx, ok_is_subtype );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3348
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3349
  // Come here on failure
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3350
  __ push(rdx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3351
  // object is at TOS
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3352
  __ jump(ExternalAddress(Interpreter::_throw_ClassCastException_entry));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3353
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3354
  // Come here on success
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3355
  __ bind(ok_is_subtype);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3356
  __ mov(rax,rdx);           // Restore object in EDX
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3357
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3358
  // Collect counts on whether this check-cast sees NULLs a lot or not.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3359
  if (ProfileInterpreter) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3360
    __ jmp(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3361
    __ bind(is_null);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3362
    __ profile_null_seen(rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3363
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3364
    __ bind(is_null);   // same as 'done'
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3365
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3366
  __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3367
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3368
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3369
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3370
void TemplateTable::instanceof() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3371
  transition(atos, itos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3372
  Label done, is_null, ok_is_subtype, quicked, resolved;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3373
  __ testptr(rax, rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3374
  __ jcc(Assembler::zero, is_null);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3375
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3376
  // Get cpool & tags index
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3377
  __ get_cpool_and_tags(rcx, rdx); // ECX=cpool, EDX=tags array
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3378
  __ get_unsigned_2_byte_index_at_bcp(rbx, 1); // EBX=index
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3379
  // See if bytecode has already been quicked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3380
  __ cmpb(Address(rdx, rbx, Address::times_1, typeArrayOopDesc::header_size(T_BYTE) * wordSize), JVM_CONSTANT_Class);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3381
  __ jcc(Assembler::equal, quicked);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3382
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3383
  __ push(atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3384
  call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::quicken_io_cc) );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3385
  __ pop_ptr(rdx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3386
  __ movptr(rdx, Address(rdx, oopDesc::klass_offset_in_bytes()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3387
  __ jmp(resolved);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3388
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3389
  // Get superklass in EAX and subklass in EDX
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3390
  __ bind(quicked);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3391
  __ movptr(rdx, Address(rax, oopDesc::klass_offset_in_bytes()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3392
  __ movptr(rax, Address(rcx, rbx, Address::times_ptr, sizeof(constantPoolOopDesc)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3393
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3394
  __ bind(resolved);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3395
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3396
  // Generate subtype check.  Blows ECX.  Resets EDI.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3397
  // Superklass in EAX.  Subklass in EDX.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3398
  __ gen_subtype_check( rdx, ok_is_subtype );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3399
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3400
  // Come here on failure
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3401
  __ xorl(rax,rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3402
  __ jmpb(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3403
  // Come here on success
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3404
  __ bind(ok_is_subtype);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3405
  __ movl(rax, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3406
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3407
  // Collect counts on whether this test sees NULLs a lot or not.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3408
  if (ProfileInterpreter) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3409
    __ jmp(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3410
    __ bind(is_null);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3411
    __ profile_null_seen(rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3412
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3413
    __ bind(is_null);   // same as 'done'
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3414
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3415
  __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3416
  // rax, = 0: obj == NULL or  obj is not an instanceof the specified klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3417
  // rax, = 1: obj != NULL and obj is     an instanceof the specified klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3418
}
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
// Breakpoints
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3423
void TemplateTable::_breakpoint() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3424
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3425
  // Note: We get here even if we are single stepping..
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3426
  // jbug inists on setting breakpoints at every bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3427
  // even if we are in single step mode.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3428
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3429
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3430
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3431
  // get the unpatched byte code
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3432
  __ get_method(rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3433
  __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::get_original_bytecode_at), rcx, rsi);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3434
  __ mov(rbx, rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3435
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3436
  // post the breakpoint event
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3437
  __ get_method(rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3438
  __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::_breakpoint), rcx, rsi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3439
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3440
  // complete the execution of original bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3441
  __ dispatch_only_normal(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3442
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3443
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3444
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3445
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3446
// Exceptions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3447
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3448
void TemplateTable::athrow() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3449
  transition(atos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3450
  __ null_check(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3451
  __ jump(ExternalAddress(Interpreter::throw_exception_entry()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3452
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3453
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3454
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3455
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3456
// Synchronization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3457
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3458
// Note: monitorenter & exit are symmetric routines; which is reflected
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3459
//       in the assembly code structure as well
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3460
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3461
// Stack layout:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3462
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3463
// [expressions  ] <--- rsp               = expression stack top
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3464
// ..
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3465
// [expressions  ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3466
// [monitor entry] <--- monitor block top = expression stack bot
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3467
// ..
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3468
// [monitor entry]
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3469
// [frame data   ] <--- monitor block bot
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3470
// ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3471
// [saved rbp,    ] <--- rbp,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3472
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3473
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3474
void TemplateTable::monitorenter() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3475
  transition(atos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3476
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3477
  // check for NULL object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3478
  __ null_check(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3479
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3480
  const Address monitor_block_top(rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3481
  const Address monitor_block_bot(rbp, frame::interpreter_frame_initial_sp_offset        * wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3482
  const int entry_size =         (     frame::interpreter_frame_monitor_size()           * wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3483
  Label allocated;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3484
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3485
  // initialize entry pointer
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3486
  __ xorl(rdx, rdx);                             // points to free slot or NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3487
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3488
  // find a free slot in the monitor block (result in rdx)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3489
  { Label entry, loop, exit;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3490
    __ movptr(rcx, monitor_block_top);            // points to current entry, starting with top-most entry
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3491
    __ lea(rbx, monitor_block_bot);               // points to word before bottom of monitor block
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3492
    __ jmpb(entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3493
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3494
    __ bind(loop);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3495
    __ cmpptr(Address(rcx, BasicObjectLock::obj_offset_in_bytes()), (int32_t)NULL_WORD);  // check if current entry is used
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3496
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3497
// TODO - need new func here - kbt
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3498
    if (VM_Version::supports_cmov()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3499
      __ cmov(Assembler::equal, rdx, rcx);       // if not used then remember entry in rdx
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3500
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3501
      Label L;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3502
      __ jccb(Assembler::notEqual, L);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3503
      __ mov(rdx, rcx);                          // if not used then remember entry in rdx
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3504
      __ bind(L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3505
    }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3506
    __ cmpptr(rax, Address(rcx, BasicObjectLock::obj_offset_in_bytes()));   // check if current entry is for same object
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3507
    __ jccb(Assembler::equal, exit);             // if same object then stop searching
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3508
    __ addptr(rcx, entry_size);                  // otherwise advance to next entry
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3509
    __ bind(entry);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3510
    __ cmpptr(rcx, rbx);                         // check if bottom reached
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3511
    __ jcc(Assembler::notEqual, loop);           // if not at bottom then check this entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3512
    __ bind(exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3513
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3514
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3515
  __ testptr(rdx, rdx);                          // check if a slot has been found
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3516
  __ jccb(Assembler::notZero, allocated);        // if found, continue with that one
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3517
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3518
  // allocate one if there's no free slot
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3519
  { Label entry, loop;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3520
    // 1. compute new pointers                   // rsp: old expression stack top
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3521
    __ movptr(rdx, monitor_block_bot);           // rdx: old expression stack bottom
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3522
    __ subptr(rsp, entry_size);                  // move expression stack top
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3523
    __ subptr(rdx, entry_size);                  // move expression stack bottom
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3524
    __ mov(rcx, rsp);                            // set start value for copy loop
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3525
    __ movptr(monitor_block_bot, rdx);           // set new monitor block top
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3526
    __ jmp(entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3527
    // 2. move expression stack contents
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3528
    __ bind(loop);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3529
    __ movptr(rbx, Address(rcx, entry_size));    // load expression stack word from old location
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3530
    __ movptr(Address(rcx, 0), rbx);             // and store it at new location
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3531
    __ addptr(rcx, wordSize);                    // advance to next word
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3532
    __ bind(entry);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3533
    __ cmpptr(rcx, rdx);                         // check if bottom reached
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3534
    __ jcc(Assembler::notEqual, loop);           // if not at bottom then copy next word
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3535
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3536
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3537
  // call run-time routine
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3538
  // rdx: points to monitor entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3539
  __ bind(allocated);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3540
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3541
  // Increment bcp to point to the next bytecode, so exception handling for async. exceptions work correctly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3542
  // The object has already been poped from the stack, so the expression stack looks correct.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3543
  __ increment(rsi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3544
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3545
  __ movptr(Address(rdx, BasicObjectLock::obj_offset_in_bytes()), rax);     // store object
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3546
  __ lock_object(rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3547
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3548
  // check to make sure this monitor doesn't cause stack overflow after locking
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3549
  __ save_bcp();  // in case of exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3550
  __ generate_stack_overflow_check(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3551
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3552
  // The bcp has already been incremented. Just need to dispatch to next instruction.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3553
  __ dispatch_next(vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3554
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3555
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3556
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3557
void TemplateTable::monitorexit() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3558
  transition(atos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3559
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3560
  // check for NULL object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3561
  __ null_check(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3562
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3563
  const Address monitor_block_top(rbp, frame::interpreter_frame_monitor_block_top_offset * wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3564
  const Address monitor_block_bot(rbp, frame::interpreter_frame_initial_sp_offset        * wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3565
  const int entry_size =         (     frame::interpreter_frame_monitor_size()           * wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3566
  Label found;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3567
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3568
  // find matching slot
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3569
  { Label entry, loop;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3570
    __ movptr(rdx, monitor_block_top);           // points to current entry, starting with top-most entry
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3571
    __ lea(rbx, monitor_block_bot);             // points to word before bottom of monitor block
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3572
    __ jmpb(entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3573
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3574
    __ bind(loop);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3575
    __ cmpptr(rax, Address(rdx, BasicObjectLock::obj_offset_in_bytes()));   // check if current entry is for same object
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3576
    __ jcc(Assembler::equal, found);             // if same object then stop searching
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3577
    __ addptr(rdx, entry_size);                  // otherwise advance to next entry
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3578
    __ bind(entry);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3579
    __ cmpptr(rdx, rbx);                         // check if bottom reached
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3580
    __ jcc(Assembler::notEqual, loop);           // if not at bottom then check this entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3581
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3582
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3583
  // error handling. Unlocking was not block-structured
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3584
  Label end;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3585
  __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_illegal_monitor_state_exception));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3586
  __ should_not_reach_here();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3587
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3588
  // call run-time routine
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3589
  // rcx: points to monitor entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3590
  __ bind(found);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3591
  __ push_ptr(rax);                                 // make sure object is on stack (contract with oopMaps)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3592
  __ unlock_object(rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3593
  __ pop_ptr(rax);                                  // discard object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3594
  __ bind(end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3595
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3596
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3597
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3598
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3599
// Wide instructions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3600
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3601
void TemplateTable::wide() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3602
  transition(vtos, vtos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3603
  __ load_unsigned_byte(rbx, at_bcp(1));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3604
  ExternalAddress wtable((address)Interpreter::_wentry_point);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3605
  __ jump(ArrayAddress(wtable, Address(noreg, rbx, Address::times_ptr)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3606
  // Note: the rsi increment step is part of the individual wide bytecode implementations
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3607
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3608
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3609
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3610
//----------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3611
// Multi arrays
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3612
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3613
void TemplateTable::multianewarray() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3614
  transition(vtos, atos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3615
  __ load_unsigned_byte(rax, at_bcp(3)); // get number of dimensions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3616
  // last dim is on top of stack; we want address of first one:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3617
  // first_addr = last_addr + (ndims - 1) * stackElementSize - 1*wordsize
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3618
  // the latter wordSize to point to the beginning of the array.
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3619
  __ lea(  rax, Address(rsp, rax, Interpreter::stackElementScale(), -wordSize));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3620
  call_VM(rax, CAST_FROM_FN_PTR(address, InterpreterRuntime::multianewarray), rax);     // pass in rax,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3621
  __ load_unsigned_byte(rbx, at_bcp(3));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3622
  __ lea(rsp, Address(rsp, rbx, Interpreter::stackElementScale()));  // get rid of counts
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3623
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3624
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3625
#endif /* !CC_INTERP */