src/hotspot/cpu/sparc/macroAssembler_sparc.hpp
author coleenp
Mon, 04 Jun 2018 10:18:43 -0400
changeset 50380 bec342339138
parent 49816 a3e79f97e86b
child 51633 21154cb84d2a
permissions -rw-r--r--
8204195: Clean up macroAssembler.inline.hpp and other inline.hpp files included in .hpp files Summary: Moved macroAssembler.inline.hpp out of header file and distributed to .cpp files that included them: ie. c1_MacroAssembler.hpp and interp_masm.hpp. Also freeList.inline.hpp and allocation.inline.hpp. Reviewed-by: jiangli, kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
     1
/*
49364
601146c66cad 8173070: Remove ValueObj class for allocation subclassing for runtime code
coleenp
parents: 49010
diff changeset
     2
 * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
     4
 *
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
     7
 * published by the Free Software Foundation.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
     8
 *
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    13
 * accompanied this code).
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    14
 *
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    18
 *
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    21
 * questions.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    22
 *
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    23
 */
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    24
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    25
#ifndef CPU_SPARC_VM_MACROASSEMBLER_SPARC_HPP
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    26
#define CPU_SPARC_VM_MACROASSEMBLER_SPARC_HPP
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    27
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    28
#include "asm/assembler.hpp"
15482
470d0b0c09f1 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 14827
diff changeset
    29
#include "utilities/macros.hpp"
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    30
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    31
// <sys/trap.h> promises that the system will not use traps 16-31
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    32
#define ST_RESERVED_FOR_USER_0 0x10
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    33
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    34
class BiasedLockingCounters;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    35
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    36
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    37
// Register aliases for parts of the system:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    38
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    39
// 64 bit values can be kept in g1-g5, o1-o5 and o7 and all 64 bits are safe
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    40
// across context switches in V8+ ABI.  Of course, there are no 64 bit regs
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    41
// in V8 ABI. All 64 bits are preserved in V9 ABI for all registers.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    42
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    43
// g2-g4 are scratch registers called "application globals".  Their
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    44
// meaning is reserved to the "compilation system"--which means us!
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    45
// They are are not supposed to be touched by ordinary C code, although
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    46
// highly-optimized C code might steal them for temps.  They are safe
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    47
// across thread switches, and the ABI requires that they be safe
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    48
// across function calls.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    49
//
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    50
// g1 and g3 are touched by more modules.  V8 allows g1 to be clobbered
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    51
// across func calls, and V8+ also allows g5 to be clobbered across
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    52
// func calls.  Also, g1 and g5 can get touched while doing shared
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    53
// library loading.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    54
//
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    55
// We must not touch g7 (it is the thread-self register) and g6 is
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    56
// reserved for certain tools.  g0, of course, is always zero.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    57
//
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    58
// (Sources:  SunSoft Compilers Group, thread library engineers.)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    59
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    60
// %%%% The interpreter should be revisited to reduce global scratch regs.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    61
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    62
// This global always holds the current JavaThread pointer:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    63
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    64
REGISTER_DECLARATION(Register, G2_thread , G2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    65
REGISTER_DECLARATION(Register, G6_heapbase , G6);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    66
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    67
// The following globals are part of the Java calling convention:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    68
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    69
REGISTER_DECLARATION(Register, G5_method             , G5);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    70
REGISTER_DECLARATION(Register, G5_megamorphic_method , G5_method);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    71
REGISTER_DECLARATION(Register, G5_inline_cache_reg   , G5_method);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    72
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    73
// The following globals are used for the new C1 & interpreter calling convention:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    74
REGISTER_DECLARATION(Register, Gargs        , G4); // pointing to the last argument
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    75
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    76
// This local is used to preserve G2_thread in the interpreter and in stubs:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    77
REGISTER_DECLARATION(Register, L7_thread_cache , L7);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    78
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    79
// These globals are used as scratch registers in the interpreter:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    80
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    81
REGISTER_DECLARATION(Register, Gframe_size   , G1); // SAME REG as G1_scratch
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    82
REGISTER_DECLARATION(Register, G1_scratch    , G1); // also SAME
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    83
REGISTER_DECLARATION(Register, G3_scratch    , G3);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    84
REGISTER_DECLARATION(Register, G4_scratch    , G4);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    85
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    86
// These globals are used as short-lived scratch registers in the compiler:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    87
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    88
REGISTER_DECLARATION(Register, Gtemp  , G5);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    89
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    90
// JSR 292 fixed register usages:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    91
REGISTER_DECLARATION(Register, G5_method_type        , G5);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    92
REGISTER_DECLARATION(Register, G3_method_handle      , G3);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    93
REGISTER_DECLARATION(Register, L7_mh_SP_save         , L7);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    94
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    95
// The compiler requires that G5_megamorphic_method is G5_inline_cache_klass,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    96
// because a single patchable "set" instruction (NativeMovConstReg,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    97
// or NativeMovConstPatching for compiler1) instruction
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    98
// serves to set up either quantity, depending on whether the compiled
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
    99
// call site is an inline cache or is megamorphic.  See the function
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   100
// CompiledIC::set_to_megamorphic.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   101
//
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   102
// If a inline cache targets an interpreted method, then the
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   103
// G5 register will be used twice during the call.  First,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   104
// the call site will be patched to load a compiledICHolder
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   105
// into G5. (This is an ordered pair of ic_klass, method.)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   106
// The c2i adapter will first check the ic_klass, then load
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   107
// G5_method with the method part of the pair just before
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   108
// jumping into the interpreter.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   109
//
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   110
// Note that G5_method is only the method-self for the interpreter,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   111
// and is logically unrelated to G5_megamorphic_method.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   112
//
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   113
// Invariants on G2_thread (the JavaThread pointer):
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   114
//  - it should not be used for any other purpose anywhere
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   115
//  - it must be re-initialized by StubRoutines::call_stub()
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   116
//  - it must be preserved around every use of call_VM
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   117
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   118
// We can consider using g2/g3/g4 to cache more values than the
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   119
// JavaThread, such as the card-marking base or perhaps pointers into
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   120
// Eden.  It's something of a waste to use them as scratch temporaries,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   121
// since they are not supposed to be volatile.  (Of course, if we find
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   122
// that Java doesn't benefit from application globals, then we can just
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   123
// use them as ordinary temporaries.)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   124
//
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   125
// Since g1 and g5 (and/or g6) are the volatile (caller-save) registers,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   126
// it makes sense to use them routinely for procedure linkage,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   127
// whenever the On registers are not applicable.  Examples:  G5_method,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   128
// G5_inline_cache_klass, and a double handful of miscellaneous compiler
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   129
// stubs.  This means that compiler stubs, etc., should be kept to a
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   130
// maximum of two or three G-register arguments.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   131
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   132
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   133
// stub frames
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   134
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   135
REGISTER_DECLARATION(Register, Lentry_args      , L0); // pointer to args passed to callee (interpreter) not stub itself
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   136
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   137
// Interpreter frames
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   138
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   139
REGISTER_DECLARATION(Register, Lesp             , L0); // expression stack pointer
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   140
REGISTER_DECLARATION(Register, Lbcp             , L1); // pointer to next bytecode
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   141
REGISTER_DECLARATION(Register, Lmethod          , L2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   142
REGISTER_DECLARATION(Register, Llocals          , L3);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   143
REGISTER_DECLARATION(Register, Largs            , L3); // pointer to locals for signature handler
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   144
                                                       // must match Llocals in asm interpreter
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   145
REGISTER_DECLARATION(Register, Lmonitors        , L4);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   146
REGISTER_DECLARATION(Register, Lbyte_code       , L5);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   147
// When calling out from the interpreter we record SP so that we can remove any extra stack
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   148
// space allocated during adapter transitions. This register is only live from the point
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   149
// of the call until we return.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   150
REGISTER_DECLARATION(Register, Llast_SP         , L5);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   151
REGISTER_DECLARATION(Register, Lscratch         , L5);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   152
REGISTER_DECLARATION(Register, Lscratch2        , L6);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   153
REGISTER_DECLARATION(Register, LcpoolCache      , L6); // constant pool cache
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   154
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   155
REGISTER_DECLARATION(Register, O5_savedSP       , O5);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   156
REGISTER_DECLARATION(Register, I5_savedSP       , I5); // Saved SP before bumping for locals.  This is simply
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   157
                                                       // a copy SP, so in 64-bit it's a biased value.  The bias
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   158
                                                       // is added and removed as needed in the frame code.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   159
REGISTER_DECLARATION(Register, IdispatchAddress , I3); // Register which saves the dispatch address for each bytecode
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   160
REGISTER_DECLARATION(Register, ImethodDataPtr   , I2); // Pointer to the current method data
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   161
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   162
// NOTE: Lscratch2 and LcpoolCache point to the same registers in
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   163
//       the interpreter code. If Lscratch2 needs to be used for some
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   164
//       purpose than LcpoolCache should be restore after that for
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   165
//       the interpreter to work right
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   166
// (These assignments must be compatible with L7_thread_cache; see above.)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   167
25714
87fa6860b5ae 8004128: NPG: remove stackwalking in Threads::gc_prologue and gc_epilogue code
coleenp
parents: 19319
diff changeset
   168
// Lbcp points into the middle of the method object.
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   169
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   170
// Exception processing
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   171
// These registers are passed into exception handlers.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   172
// All exception handlers require the exception object being thrown.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   173
// In addition, an nmethod's exception handler must be passed
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   174
// the address of the call site within the nmethod, to allow
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   175
// proper selection of the applicable catch block.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   176
// (Interpreter frames use their own bcp() for this purpose.)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   177
//
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   178
// The Oissuing_pc value is not always needed.  When jumping to a
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   179
// handler that is known to be interpreted, the Oissuing_pc value can be
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   180
// omitted.  An actual catch block in compiled code receives (from its
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   181
// nmethod's exception handler) the thrown exception in the Oexception,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   182
// but it doesn't need the Oissuing_pc.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   183
//
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   184
// If an exception handler (either interpreted or compiled)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   185
// discovers there is no applicable catch block, it updates
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   186
// the Oissuing_pc to the continuation PC of its own caller,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   187
// pops back to that caller's stack frame, and executes that
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   188
// caller's exception handler.  Obviously, this process will
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   189
// iterate until the control stack is popped back to a method
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   190
// containing an applicable catch block.  A key invariant is
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   191
// that the Oissuing_pc value is always a value local to
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   192
// the method whose exception handler is currently executing.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   193
//
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   194
// Note:  The issuing PC value is __not__ a raw return address (I7 value).
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   195
// It is a "return pc", the address __following__ the call.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   196
// Raw return addresses are converted to issuing PCs by frame::pc(),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   197
// or by stubs.  Issuing PCs can be used directly with PC range tables.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   198
//
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   199
REGISTER_DECLARATION(Register, Oexception  , O0); // exception being thrown
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   200
REGISTER_DECLARATION(Register, Oissuing_pc , O1); // where the exception is coming from
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   201
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   202
// Address is an abstraction used to represent a memory location.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   203
//
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   204
// Note: A register location is represented via a Register, not
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   205
//       via an address for efficiency & simplicity reasons.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   206
49364
601146c66cad 8173070: Remove ValueObj class for allocation subclassing for runtime code
coleenp
parents: 49010
diff changeset
   207
class Address {
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   208
 private:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   209
  Register           _base;           // Base register.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   210
  RegisterOrConstant _index_or_disp;  // Index register or constant displacement.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   211
  RelocationHolder   _rspec;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   212
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   213
 public:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   214
  Address() : _base(noreg), _index_or_disp(noreg) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   215
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   216
  Address(Register base, RegisterOrConstant index_or_disp)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   217
    : _base(base),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   218
      _index_or_disp(index_or_disp) {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   219
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   220
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   221
  Address(Register base, Register index)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   222
    : _base(base),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   223
      _index_or_disp(index) {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   224
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   225
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   226
  Address(Register base, int disp)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   227
    : _base(base),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   228
      _index_or_disp(disp) {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   229
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   230
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   231
#ifdef ASSERT
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   232
  // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   233
  Address(Register base, ByteSize disp)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   234
    : _base(base),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   235
      _index_or_disp(in_bytes(disp)) {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   236
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   237
#endif
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   238
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   239
  // accessors
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   240
  Register base()             const { return _base; }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   241
  Register index()            const { return _index_or_disp.as_register(); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   242
  int      disp()             const { return _index_or_disp.as_constant(); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   243
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   244
  bool     has_index()        const { return _index_or_disp.is_register(); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   245
  bool     has_disp()         const { return _index_or_disp.is_constant(); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   246
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   247
  bool     uses(Register reg) const { return base() == reg || (has_index() && index() == reg); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   248
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   249
  const relocInfo::relocType rtype() { return _rspec.type(); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   250
  const RelocationHolder&    rspec() { return _rspec; }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   251
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   252
  RelocationHolder rspec(int offset) const {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   253
    return offset == 0 ? _rspec : _rspec.plus(offset);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   254
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   255
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   256
  inline bool is_simm13(int offset = 0);  // check disp+offset for overflow
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   257
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   258
  Address plus_disp(int plusdisp) const {     // bump disp by a small amount
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   259
    assert(_index_or_disp.is_constant(), "must have a displacement");
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   260
    Address a(base(), disp() + plusdisp);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   261
    return a;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   262
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   263
  bool is_same_address(Address a) const {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   264
    // disregard _rspec
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   265
    return base() == a.base() && (has_index() ? index() == a.index() : disp() == a.disp());
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   266
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   267
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   268
  Address after_save() const {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   269
    Address a = (*this);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   270
    a._base = a._base->after_save();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   271
    return a;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   272
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   273
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   274
  Address after_restore() const {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   275
    Address a = (*this);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   276
    a._base = a._base->after_restore();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   277
    return a;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   278
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   279
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   280
  // Convert the raw encoding form into the form expected by the
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   281
  // constructor for Address.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   282
  static Address make_raw(int base, int index, int scale, int disp, relocInfo::relocType disp_reloc);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   283
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   284
  friend class Assembler;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   285
};
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   286
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   287
49364
601146c66cad 8173070: Remove ValueObj class for allocation subclassing for runtime code
coleenp
parents: 49010
diff changeset
   288
class AddressLiteral {
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   289
 private:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   290
  address          _address;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   291
  RelocationHolder _rspec;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   292
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   293
  RelocationHolder rspec_from_rtype(relocInfo::relocType rtype, address addr) {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   294
    switch (rtype) {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   295
    case relocInfo::external_word_type:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   296
      return external_word_Relocation::spec(addr);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   297
    case relocInfo::internal_word_type:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   298
      return internal_word_Relocation::spec(addr);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   299
    case relocInfo::opt_virtual_call_type:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   300
      return opt_virtual_call_Relocation::spec();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   301
    case relocInfo::static_call_type:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   302
      return static_call_Relocation::spec();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   303
    case relocInfo::runtime_call_type:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   304
      return runtime_call_Relocation::spec();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   305
    case relocInfo::none:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   306
      return RelocationHolder();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   307
    default:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   308
      ShouldNotReachHere();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   309
      return RelocationHolder();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   310
    }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   311
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   312
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   313
 protected:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   314
  // creation
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   315
  AddressLiteral() : _address(NULL), _rspec(NULL) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   316
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   317
 public:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   318
  AddressLiteral(address addr, RelocationHolder const& rspec)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   319
    : _address(addr),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   320
      _rspec(rspec) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   321
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   322
  // Some constructors to avoid casting at the call site.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   323
  AddressLiteral(jobject obj, RelocationHolder const& rspec)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   324
    : _address((address) obj),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   325
      _rspec(rspec) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   326
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   327
  AddressLiteral(intptr_t value, RelocationHolder const& rspec)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   328
    : _address((address) value),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   329
      _rspec(rspec) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   330
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   331
  AddressLiteral(address addr, relocInfo::relocType rtype = relocInfo::none)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   332
    : _address((address) addr),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   333
    _rspec(rspec_from_rtype(rtype, (address) addr)) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   334
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   335
  // Some constructors to avoid casting at the call site.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   336
  AddressLiteral(address* addr, relocInfo::relocType rtype = relocInfo::none)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   337
    : _address((address) addr),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   338
    _rspec(rspec_from_rtype(rtype, (address) addr)) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   339
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   340
  AddressLiteral(bool* addr, relocInfo::relocType rtype = relocInfo::none)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   341
    : _address((address) addr),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   342
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   343
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   344
  AddressLiteral(const bool* addr, relocInfo::relocType rtype = relocInfo::none)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   345
    : _address((address) addr),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   346
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   347
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   348
  AddressLiteral(signed char* addr, relocInfo::relocType rtype = relocInfo::none)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   349
    : _address((address) addr),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   350
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   351
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   352
  AddressLiteral(int* addr, relocInfo::relocType rtype = relocInfo::none)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   353
    : _address((address) addr),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   354
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   355
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   356
  AddressLiteral(intptr_t addr, relocInfo::relocType rtype = relocInfo::none)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   357
    : _address((address) addr),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   358
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   359
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   360
  // 32-bit complains about a multiple declaration for int*.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   361
  AddressLiteral(intptr_t* addr, relocInfo::relocType rtype = relocInfo::none)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   362
    : _address((address) addr),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   363
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   364
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   365
  AddressLiteral(Metadata* addr, relocInfo::relocType rtype = relocInfo::none)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   366
    : _address((address) addr),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   367
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   368
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   369
  AddressLiteral(Metadata** addr, relocInfo::relocType rtype = relocInfo::none)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   370
    : _address((address) addr),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   371
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   372
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   373
  AddressLiteral(float* addr, relocInfo::relocType rtype = relocInfo::none)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   374
    : _address((address) addr),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   375
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   376
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   377
  AddressLiteral(double* addr, relocInfo::relocType rtype = relocInfo::none)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   378
    : _address((address) addr),
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   379
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   380
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   381
  intptr_t value() const { return (intptr_t) _address; }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   382
  int      low10() const;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   383
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   384
  const relocInfo::relocType rtype() const { return _rspec.type(); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   385
  const RelocationHolder&    rspec() const { return _rspec; }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   386
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   387
  RelocationHolder rspec(int offset) const {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   388
    return offset == 0 ? _rspec : _rspec.plus(offset);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   389
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   390
};
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   391
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   392
// Convenience classes
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   393
class ExternalAddress: public AddressLiteral {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   394
 private:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   395
  static relocInfo::relocType reloc_for_target(address target) {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   396
    // Sometimes ExternalAddress is used for values which aren't
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   397
    // exactly addresses, like the card table base.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   398
    // external_word_type can't be used for values in the first page
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   399
    // so just skip the reloc in that case.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   400
    return external_word_Relocation::can_be_relocated(target) ? relocInfo::external_word_type : relocInfo::none;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   401
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   402
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   403
 public:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   404
  ExternalAddress(address target) : AddressLiteral(target, reloc_for_target(          target)) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   405
  ExternalAddress(Metadata** target) : AddressLiteral(target, reloc_for_target((address) target)) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   406
};
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   407
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   408
inline Address RegisterImpl::address_in_saved_window() const {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   409
   return (Address(SP, (sp_offset_in_saved_window() * wordSize) + STACK_BIAS));
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   410
}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   411
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   412
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   413
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   414
// Argument is an abstraction used to represent an outgoing
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   415
// actual argument or an incoming formal parameter, whether
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   416
// it resides in memory or in a register, in a manner consistent
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   417
// with the SPARC Application Binary Interface, or ABI.  This is
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   418
// often referred to as the native or C calling convention.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   419
49364
601146c66cad 8173070: Remove ValueObj class for allocation subclassing for runtime code
coleenp
parents: 49010
diff changeset
   420
class Argument {
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   421
 private:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   422
  int _number;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   423
  bool _is_in;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   424
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   425
 public:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   426
  enum {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   427
    n_register_parameters = 6,          // only 6 registers may contain integer parameters
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   428
    n_float_register_parameters = 16    // Can have up to 16 floating registers
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   429
  };
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   430
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   431
  // creation
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   432
  Argument(int number, bool is_in) : _number(number), _is_in(is_in) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   433
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   434
  int  number() const  { return _number;  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   435
  bool is_in()  const  { return _is_in;   }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   436
  bool is_out() const  { return !is_in(); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   437
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   438
  Argument successor() const  { return Argument(number() + 1, is_in()); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   439
  Argument as_in()     const  { return Argument(number(), true ); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   440
  Argument as_out()    const  { return Argument(number(), false); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   441
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   442
  // locating register-based arguments:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   443
  bool is_register() const { return _number < n_register_parameters; }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   444
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   445
  // locating Floating Point register-based arguments:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   446
  bool is_float_register() const { return _number < n_float_register_parameters; }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   447
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   448
  FloatRegister as_float_register() const {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   449
    assert(is_float_register(), "must be a register argument");
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   450
    return as_FloatRegister(( number() *2 ) + 1);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   451
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   452
  FloatRegister as_double_register() const {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   453
    assert(is_float_register(), "must be a register argument");
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   454
    return as_FloatRegister(( number() *2 ));
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   455
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   456
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   457
  Register as_register() const {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   458
    assert(is_register(), "must be a register argument");
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   459
    return is_in() ? as_iRegister(number()) : as_oRegister(number());
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   460
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   461
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   462
  // locating memory-based arguments
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   463
  Address as_address() const {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   464
    assert(!is_register(), "must be a memory argument");
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   465
    return address_in_frame();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   466
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   467
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   468
  // When applied to a register-based argument, give the corresponding address
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   469
  // into the 6-word area "into which callee may store register arguments"
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   470
  // (This is a different place than the corresponding register-save area location.)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   471
  Address address_in_frame() const;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   472
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   473
  // debugging
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   474
  const char* name() const;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   475
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   476
  friend class Assembler;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   477
};
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   478
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   479
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   480
class RegistersForDebugging : public StackObj {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   481
 public:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   482
  intptr_t i[8], l[8], o[8], g[8];
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   483
  float    f[32];
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   484
  double   d[32];
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   485
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   486
  void print(outputStream* s);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   487
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   488
  static int i_offset(int j) { return offset_of(RegistersForDebugging, i[j]); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   489
  static int l_offset(int j) { return offset_of(RegistersForDebugging, l[j]); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   490
  static int o_offset(int j) { return offset_of(RegistersForDebugging, o[j]); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   491
  static int g_offset(int j) { return offset_of(RegistersForDebugging, g[j]); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   492
  static int f_offset(int j) { return offset_of(RegistersForDebugging, f[j]); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   493
  static int d_offset(int j) { return offset_of(RegistersForDebugging, d[j / 2]); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   494
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   495
  // gen asm code to save regs
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   496
  static void save_registers(MacroAssembler* a);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   497
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   498
  // restore global registers in case C code disturbed them
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   499
  static void restore_registers(MacroAssembler* a, Register r);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   500
};
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   501
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   502
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   503
// MacroAssembler extends Assembler by a few frequently used macros.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   504
//
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   505
// Most of the standard SPARC synthetic ops are defined here.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   506
// Instructions for which a 'better' code sequence exists depending
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   507
// on arguments should also go in here.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   508
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   509
#define JMP2(r1, r2) jmp(r1, r2, __FILE__, __LINE__)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   510
#define JMP(r1, off) jmp(r1, off, __FILE__, __LINE__)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   511
#define JUMP(a, temp, off)     jump(a, temp, off, __FILE__, __LINE__)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   512
#define JUMPL(a, temp, d, off) jumpl(a, temp, d, off, __FILE__, __LINE__)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   513
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   514
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   515
class MacroAssembler : public Assembler {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   516
  // code patchers need various routines like inv_wdisp()
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   517
  friend class NativeInstruction;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   518
  friend class NativeGeneralJump;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   519
  friend class Relocation;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   520
  friend class Label;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   521
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   522
 protected:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   523
  static int  patched_branch(int dest_pos, int inst, int inst_pos);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   524
  static int  branch_destination(int inst, int pos);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   525
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   526
  // Support for VM calls
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   527
  // This is the base routine called by the different versions of call_VM_leaf. The interpreter
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   528
  // may customize this version by overriding it for its purposes (e.g., to save/restore
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   529
  // additional registers when doing a VM call).
35214
d86005e0b4c2 8074457: Remove the non-Zero CPP Interpreter
coleenp
parents: 35071
diff changeset
   530
  virtual void call_VM_leaf_base(Register thread_cache, address entry_point, int number_of_arguments);
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   531
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   532
  //
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   533
  // It is imperative that all calls into the VM are handled via the call_VM macros.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   534
  // They make sure that the stack linkage is setup correctly. call_VM's correspond
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   535
  // to ENTRY/ENTRY_X entry points while call_VM_leaf's correspond to LEAF entry points.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   536
  //
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   537
  // This is the base routine called by the different versions of call_VM. The interpreter
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   538
  // may customize this version by overriding it for its purposes (e.g., to save/restore
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   539
  // additional registers when doing a VM call).
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   540
  //
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   541
  // A non-volatile java_thread_cache register should be specified so
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   542
  // that the G2_thread value can be preserved across the call.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   543
  // (If java_thread_cache is noreg, then a slow get_thread call
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   544
  // will re-initialize the G2_thread.) call_VM_base returns the register that contains the
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   545
  // thread.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   546
  //
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   547
  // If no last_java_sp is specified (noreg) than SP will be used instead.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   548
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   549
  virtual void call_VM_base(
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   550
    Register        oop_result,             // where an oop-result ends up if any; use noreg otherwise
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   551
    Register        java_thread_cache,      // the thread if computed before     ; use noreg otherwise
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   552
    Register        last_java_sp,           // to set up last_Java_frame in stubs; use noreg otherwise
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   553
    address         entry_point,            // the entry point
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   554
    int             number_of_arguments,    // the number of arguments (w/o thread) to pop after call
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   555
    bool            check_exception=true    // flag which indicates if exception should be checked
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   556
  );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   557
46294
345a46524a19 8172020: Internal Error (cpu/arm/vm/frame_arm.cpp:571): assert(obj == __null || Universe::heap()->is_in(obj)) failed: sanity check #
cjplummer
parents: 40032
diff changeset
   558
 public:
345a46524a19 8172020: Internal Error (cpu/arm/vm/frame_arm.cpp:571): assert(obj == __null || Universe::heap()->is_in(obj)) failed: sanity check #
cjplummer
parents: 40032
diff changeset
   559
  MacroAssembler(CodeBuffer* code) : Assembler(code) {}
345a46524a19 8172020: Internal Error (cpu/arm/vm/frame_arm.cpp:571): assert(obj == __null || Universe::heap()->is_in(obj)) failed: sanity check #
cjplummer
parents: 40032
diff changeset
   560
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   561
  // This routine should emit JVMTI PopFrame and ForceEarlyReturn handling code.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   562
  // The implementation is only non-empty for the InterpreterMacroAssembler,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   563
  // as only the interpreter handles and ForceEarlyReturn PopFrame requests.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   564
  virtual void check_and_handle_popframe(Register scratch_reg);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   565
  virtual void check_and_handle_earlyret(Register scratch_reg);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   566
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   567
  // Support for NULL-checks
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   568
  //
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   569
  // Generates code that causes a NULL OS exception if the content of reg is NULL.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   570
  // If the accessed location is M[reg + offset] and the offset is known, provide the
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   571
  // offset.  No explicit code generation is needed if the offset is within a certain
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   572
  // range (0 <= offset <= page_size).
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   573
  //
47561
f59f0e51ef8a 8167199: Add C2 SPARC intrinsic for BigInteger::multiplyToLen() method.
neliasso
parents: 47216
diff changeset
   574
  // FIXME: Currently not done for SPARC
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   575
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   576
  void null_check(Register reg, int offset = -1);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   577
  static bool needs_explicit_null_check(intptr_t offset);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   578
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   579
  // support for delayed instructions
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   580
  MacroAssembler* delayed() { Assembler::delayed();  return this; }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   581
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   582
  // branches that use right instruction for v8 vs. v9
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   583
  inline void br( Condition c, bool a, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   584
  inline void br( Condition c, bool a, Predict p, Label& L );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   585
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   586
  inline void fb( Condition c, bool a, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   587
  inline void fb( Condition c, bool a, Predict p, Label& L );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   588
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   589
  // compares register with zero (32 bit) and branches (V9 and V8 instructions)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   590
  void cmp_zero_and_br( Condition c, Register s1, Label& L, bool a = false, Predict p = pn );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   591
  // Compares a pointer register with zero and branches on (not)null.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   592
  // Does a test & branch on 32-bit systems and a register-branch on 64-bit.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   593
  void br_null   ( Register s1, bool a, Predict p, Label& L );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   594
  void br_notnull( Register s1, bool a, Predict p, Label& L );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   595
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   596
  //
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   597
  // Compare registers and branch with nop in delay slot or cbcond without delay slot.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   598
  //
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   599
  // ATTENTION: use these instructions with caution because cbcond instruction
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   600
  //            has very short distance: 512 instructions (2Kbyte).
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   601
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   602
  // Compare integer (32 bit) values (icc only).
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   603
  void cmp_and_br_short(Register s1, Register s2, Condition c, Predict p, Label& L);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   604
  void cmp_and_br_short(Register s1, int simm13a, Condition c, Predict p, Label& L);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   605
  // Platform depending version for pointer compare (icc on !LP64 and xcc on LP64).
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   606
  void cmp_and_brx_short(Register s1, Register s2, Condition c, Predict p, Label& L);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   607
  void cmp_and_brx_short(Register s1, int simm13a, Condition c, Predict p, Label& L);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   608
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   609
  // Short branch version for compares a pointer pwith zero.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   610
  void br_null_short   ( Register s1, Predict p, Label& L );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   611
  void br_notnull_short( Register s1, Predict p, Label& L );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   612
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   613
  // unconditional short branch
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   614
  void ba_short(Label& L);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   615
47561
f59f0e51ef8a 8167199: Add C2 SPARC intrinsic for BigInteger::multiplyToLen() method.
neliasso
parents: 47216
diff changeset
   616
  // Branch on icc.z (true or not).
f59f0e51ef8a 8167199: Add C2 SPARC intrinsic for BigInteger::multiplyToLen() method.
neliasso
parents: 47216
diff changeset
   617
  void br_icc_zero(bool iszero, Predict p, Label &L);
f59f0e51ef8a 8167199: Add C2 SPARC intrinsic for BigInteger::multiplyToLen() method.
neliasso
parents: 47216
diff changeset
   618
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   619
  inline void bp( Condition c, bool a, CC cc, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   620
  inline void bp( Condition c, bool a, CC cc, Predict p, Label& L );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   621
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   622
  // Branch that tests xcc in LP64 and icc in !LP64
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   623
  inline void brx( Condition c, bool a, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   624
  inline void brx( Condition c, bool a, Predict p, Label& L );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   625
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   626
  // unconditional branch
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   627
  inline void ba( Label& L );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   628
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   629
  // Branch that tests fp condition codes
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   630
  inline void fbp( Condition c, bool a, CC cc, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   631
  inline void fbp( Condition c, bool a, CC cc, Predict p, Label& L );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   632
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   633
  // Sparc shorthands(pp 85, V8 manual, pp 289 V9 manual)
47561
f59f0e51ef8a 8167199: Add C2 SPARC intrinsic for BigInteger::multiplyToLen() method.
neliasso
parents: 47216
diff changeset
   634
  inline void cmp( Register s1, Register s2 );
f59f0e51ef8a 8167199: Add C2 SPARC intrinsic for BigInteger::multiplyToLen() method.
neliasso
parents: 47216
diff changeset
   635
  inline void cmp( Register s1, int simm13a );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   636
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   637
  inline void jmp( Register s1, Register s2 );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   638
  inline void jmp( Register s1, int simm13a, RelocationHolder const& rspec = RelocationHolder() );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   639
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   640
  // Check if the call target is out of wdisp30 range (relative to the code cache)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   641
  static inline bool is_far_target(address d);
47561
f59f0e51ef8a 8167199: Add C2 SPARC intrinsic for BigInteger::multiplyToLen() method.
neliasso
parents: 47216
diff changeset
   642
  inline void call( address d, relocInfo::relocType rt = relocInfo::runtime_call_type );
f59f0e51ef8a 8167199: Add C2 SPARC intrinsic for BigInteger::multiplyToLen() method.
neliasso
parents: 47216
diff changeset
   643
  inline void call( address d, RelocationHolder const& rspec);
35086
bbf32241d851 8072008: Emit direct call instead of linkTo* for recursive indy/MH.invoke* calls
vlivanov
parents: 34205
diff changeset
   644
47561
f59f0e51ef8a 8167199: Add C2 SPARC intrinsic for BigInteger::multiplyToLen() method.
neliasso
parents: 47216
diff changeset
   645
  inline void call( Label& L, relocInfo::relocType rt = relocInfo::runtime_call_type );
f59f0e51ef8a 8167199: Add C2 SPARC intrinsic for BigInteger::multiplyToLen() method.
neliasso
parents: 47216
diff changeset
   646
  inline void call( Label& L, RelocationHolder const& rspec);
35086
bbf32241d851 8072008: Emit direct call instead of linkTo* for recursive indy/MH.invoke* calls
vlivanov
parents: 34205
diff changeset
   647
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   648
  inline void callr( Register s1, Register s2 );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   649
  inline void callr( Register s1, int simm13a, RelocationHolder const& rspec = RelocationHolder() );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   650
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   651
  // Emits nothing on V8
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   652
  inline void iprefetch( address d, relocInfo::relocType rt = relocInfo::none );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   653
  inline void iprefetch( Label& L);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   654
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   655
  inline void tst( Register s );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   656
40032
bc2e42cd23ea 8132318: -XX:TraceJumps is broken on Sparc
dpochepk
parents: 38241
diff changeset
   657
  inline void ret(  bool trace = false );
bc2e42cd23ea 8132318: -XX:TraceJumps is broken on Sparc
dpochepk
parents: 38241
diff changeset
   658
  inline void retl( bool trace = false );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   659
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   660
  // Required platform-specific helpers for Label::patch_instructions.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   661
  // They _shadow_ the declarations in AbstractAssembler, which are undefined.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   662
  void pd_patch_instruction(address branch, address target);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   663
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   664
  // sethi Macro handles optimizations and relocations
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   665
private:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   666
  void internal_sethi(const AddressLiteral& addrlit, Register d, bool ForceRelocatable);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   667
public:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   668
  void sethi(const AddressLiteral& addrlit, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   669
  void patchable_sethi(const AddressLiteral& addrlit, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   670
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   671
  // compute the number of instructions for a sethi/set
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   672
  static int  insts_for_sethi( address a, bool worst_case = false );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   673
  static int  worst_case_insts_for_set();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   674
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   675
  // set may be either setsw or setuw (high 32 bits may be zero or sign)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   676
private:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   677
  void internal_set(const AddressLiteral& al, Register d, bool ForceRelocatable);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   678
  static int insts_for_internal_set(intptr_t value);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   679
public:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   680
  void set(const AddressLiteral& addrlit, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   681
  void set(intptr_t value, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   682
  void set(address addr, Register d, RelocationHolder const& rspec);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   683
  static int insts_for_set(intptr_t value) { return insts_for_internal_set(value); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   684
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   685
  void patchable_set(const AddressLiteral& addrlit, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   686
  void patchable_set(intptr_t value, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   687
  void set64(jlong value, Register d, Register tmp);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   688
  static int insts_for_set64(jlong value);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   689
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   690
  // sign-extend 32 to 64
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   691
  inline void signx( Register s, Register d );
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   692
  inline void signx( Register d );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   693
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   694
  inline void not1( Register s, Register d );
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   695
  inline void not1( Register d );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   696
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   697
  inline void neg( Register s, Register d );
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   698
  inline void neg( Register d );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   699
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   700
  inline void cas(  Register s1, Register s2, Register d);
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   701
  inline void casx( Register s1, Register s2, Register d);
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   702
  // Functions for isolating 64 bit atomic swaps for LP64
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   703
  // cas_ptr will perform cas for 32 bit VM's and casx for 64 bit VM's
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   704
  inline void cas_ptr(  Register s1, Register s2, Register d);
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   705
49748
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   706
  // Resolve a jobject or jweak
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   707
  void resolve_jobject(Register value, Register tmp);
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   708
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   709
  // Functions for isolating 64 bit shifts for LP64
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   710
  inline void sll_ptr( Register s1, Register s2, Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   711
  inline void sll_ptr( Register s1, int imm6a,   Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   712
  inline void sll_ptr( Register s1, RegisterOrConstant s2, Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   713
  inline void srl_ptr( Register s1, Register s2, Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   714
  inline void srl_ptr( Register s1, int imm6a,   Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   715
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   716
  // little-endian
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   717
  inline void casl(  Register s1, Register s2, Register d);
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   718
  inline void casxl( Register s1, Register s2, Register d);
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   719
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   720
  inline void inc(   Register d,  int const13 = 1 );
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   721
  inline void inccc( Register d,  int const13 = 1 );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   722
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   723
  inline void dec(   Register d,  int const13 = 1 );
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   724
  inline void deccc( Register d,  int const13 = 1 );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   725
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   726
  using Assembler::add;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   727
  inline void add(Register s1, int simm13a, Register d, relocInfo::relocType rtype);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   728
  inline void add(Register s1, int simm13a, Register d, RelocationHolder const& rspec);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   729
  inline void add(Register s1, RegisterOrConstant s2, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   730
  inline void add(const Address& a, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   731
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   732
  using Assembler::andn;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   733
  inline void andn(  Register s1, RegisterOrConstant s2, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   734
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   735
  inline void btst( Register s1,  Register s2 );
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   736
  inline void btst( int simm13a,  Register s );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   737
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   738
  inline void bset( Register s1,  Register s2 );
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   739
  inline void bset( int simm13a,  Register s );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   740
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   741
  inline void bclr( Register s1,  Register s2 );
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   742
  inline void bclr( int simm13a,  Register s );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   743
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   744
  inline void btog( Register s1,  Register s2 );
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   745
  inline void btog( int simm13a,  Register s );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   746
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   747
  inline void clr( Register d );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   748
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   749
  inline void clrb( Register s1, Register s2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   750
  inline void clrh( Register s1, Register s2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   751
  inline void clr(  Register s1, Register s2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   752
  inline void clrx( Register s1, Register s2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   753
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   754
  inline void clrb( Register s1, int simm13a);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   755
  inline void clrh( Register s1, int simm13a);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   756
  inline void clr(  Register s1, int simm13a);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   757
  inline void clrx( Register s1, int simm13a);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   758
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   759
  // copy & clear upper word
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   760
  inline void clruw( Register s, Register d );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   761
  // clear upper word
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   762
  inline void clruwu( Register d );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   763
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   764
  using Assembler::ldsb;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   765
  using Assembler::ldsh;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   766
  using Assembler::ldsw;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   767
  using Assembler::ldub;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   768
  using Assembler::lduh;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   769
  using Assembler::lduw;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   770
  using Assembler::ldx;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   771
  using Assembler::ldd;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   772
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   773
#ifdef ASSERT
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   774
  // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   775
  inline void ld(Register s1, ByteSize simm13a, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   776
#endif
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   777
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   778
  inline void ld(Register s1, Register s2, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   779
  inline void ld(Register s1, int simm13a, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   780
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   781
  inline void ldsb(const Address& a, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   782
  inline void ldsh(const Address& a, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   783
  inline void ldsw(const Address& a, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   784
  inline void ldub(const Address& a, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   785
  inline void lduh(const Address& a, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   786
  inline void lduw(const Address& a, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   787
  inline void ldx( const Address& a, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   788
  inline void ld(  const Address& a, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   789
  inline void ldd( const Address& a, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   790
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   791
  inline void ldub(Register s1, RegisterOrConstant s2, Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   792
  inline void ldsb(Register s1, RegisterOrConstant s2, Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   793
  inline void lduh(Register s1, RegisterOrConstant s2, Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   794
  inline void ldsh(Register s1, RegisterOrConstant s2, Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   795
  inline void lduw(Register s1, RegisterOrConstant s2, Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   796
  inline void ldsw(Register s1, RegisterOrConstant s2, Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   797
  inline void ldx( Register s1, RegisterOrConstant s2, Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   798
  inline void ld(  Register s1, RegisterOrConstant s2, Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   799
  inline void ldd( Register s1, RegisterOrConstant s2, Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   800
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   801
  using Assembler::ldf;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   802
  inline void ldf(FloatRegisterImpl::Width w, Register s1, RegisterOrConstant s2, FloatRegister d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   803
  inline void ldf(FloatRegisterImpl::Width w, const Address& a, FloatRegister d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   804
31515
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 25714
diff changeset
   805
  // little-endian
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   806
  inline void lduwl(Register s1, Register s2, Register d);
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   807
  inline void ldswl(Register s1, Register s2, Register d);
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   808
  inline void ldxl( Register s1, Register s2, Register d);
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   809
  inline void ldfl(FloatRegisterImpl::Width w, Register s1, Register s2, FloatRegister d);
31515
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 25714
diff changeset
   810
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   811
  // membar psuedo instruction.  takes into account target memory model.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   812
  inline void membar( Assembler::Membar_mask_bits const7a );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   813
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   814
  // returns if membar generates anything.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   815
  inline bool membar_has_effect( Assembler::Membar_mask_bits const7a );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   816
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   817
  // mov pseudo instructions
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   818
  inline void mov( Register s,  Register d);
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   819
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   820
  inline void mov_or_nop( Register s,  Register d);
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   821
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   822
  inline void mov( int simm13a, Register d);
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   823
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   824
  using Assembler::prefetch;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   825
  inline void prefetch(const Address& a, PrefetchFcn F, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   826
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   827
  using Assembler::stb;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   828
  using Assembler::sth;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   829
  using Assembler::stw;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   830
  using Assembler::stx;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   831
  using Assembler::std;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   832
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   833
#ifdef ASSERT
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   834
  // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   835
  inline void st(Register d, Register s1, ByteSize simm13a);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   836
#endif
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   837
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   838
  inline void st(Register d, Register s1, Register s2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   839
  inline void st(Register d, Register s1, int simm13a);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   840
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   841
  inline void stb(Register d, const Address& a, int offset = 0 );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   842
  inline void sth(Register d, const Address& a, int offset = 0 );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   843
  inline void stw(Register d, const Address& a, int offset = 0 );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   844
  inline void stx(Register d, const Address& a, int offset = 0 );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   845
  inline void st( Register d, const Address& a, int offset = 0 );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   846
  inline void std(Register d, const Address& a, int offset = 0 );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   847
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   848
  inline void stb(Register d, Register s1, RegisterOrConstant s2 );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   849
  inline void sth(Register d, Register s1, RegisterOrConstant s2 );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   850
  inline void stw(Register d, Register s1, RegisterOrConstant s2 );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   851
  inline void stx(Register d, Register s1, RegisterOrConstant s2 );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   852
  inline void std(Register d, Register s1, RegisterOrConstant s2 );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   853
  inline void st( Register d, Register s1, RegisterOrConstant s2 );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   854
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   855
  using Assembler::stf;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   856
  inline void stf(FloatRegisterImpl::Width w, FloatRegister d, Register s1, RegisterOrConstant s2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   857
  inline void stf(FloatRegisterImpl::Width w, FloatRegister d, const Address& a, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   858
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   859
  // Note: offset is added to s2.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   860
  using Assembler::sub;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   861
  inline void sub(Register s1, RegisterOrConstant s2, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   862
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   863
  using Assembler::swap;
18104
590c10f73634 8002160: Compilation issue with adlc using latest SunStudio compilers
drchase
parents: 18097
diff changeset
   864
  inline void swap(const Address& a, Register d, int offset = 0);
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   865
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   866
  // address pseudos: make these names unlike instruction names to avoid confusion
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   867
  inline intptr_t load_pc_address( Register reg, int bytes_to_skip );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   868
  inline void load_contents(const AddressLiteral& addrlit, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   869
  inline void load_bool_contents(const AddressLiteral& addrlit, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   870
  inline void load_ptr_contents(const AddressLiteral& addrlit, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   871
  inline void store_contents(Register s, const AddressLiteral& addrlit, Register temp, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   872
  inline void store_ptr_contents(Register s, const AddressLiteral& addrlit, Register temp, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   873
  inline void jumpl_to(const AddressLiteral& addrlit, Register temp, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   874
  inline void jump_to(const AddressLiteral& addrlit, Register temp, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   875
  inline void jump_indirect_to(Address& a, Register temp, int ld_offset = 0, int jmp_offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   876
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   877
  // ring buffer traceable jumps
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   878
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   879
  void jmp2( Register r1, Register r2, const char* file, int line );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   880
  void jmp ( Register r1, int offset,  const char* file, int line );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   881
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   882
  void jumpl(const AddressLiteral& addrlit, Register temp, Register d, int offset, const char* file, int line);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   883
  void jump (const AddressLiteral& addrlit, Register temp,             int offset, const char* file, int line);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   884
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   885
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   886
  // argument pseudos:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   887
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   888
  inline void load_argument( Argument& a, Register  d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   889
  inline void store_argument( Register s, Argument& a );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   890
  inline void store_ptr_argument( Register s, Argument& a );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   891
  inline void store_float_argument( FloatRegister s, Argument& a );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   892
  inline void store_double_argument( FloatRegister s, Argument& a );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   893
  inline void store_long_argument( Register s, Argument& a );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   894
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   895
  // handy macros:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   896
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   897
  inline void round_to( Register r, int modulus );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   898
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   899
  // --------------------------------------------------
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   900
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   901
  // Functions for isolating 64 bit loads for LP64
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   902
  // ld_ptr will perform ld for 32 bit VM's and ldx for 64 bit VM's
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   903
  // st_ptr will perform st for 32 bit VM's and stx for 64 bit VM's
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   904
  inline void ld_ptr(Register s1, Register s2, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   905
  inline void ld_ptr(Register s1, int simm13a, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   906
  inline void ld_ptr(Register s1, RegisterOrConstant s2, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   907
  inline void ld_ptr(const Address& a, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   908
  inline void st_ptr(Register d, Register s1, Register s2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   909
  inline void st_ptr(Register d, Register s1, int simm13a);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   910
  inline void st_ptr(Register d, Register s1, RegisterOrConstant s2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   911
  inline void st_ptr(Register d, const Address& a, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   912
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   913
#ifdef ASSERT
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   914
  // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   915
  inline void ld_ptr(Register s1, ByteSize simm13a, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   916
  inline void st_ptr(Register d, Register s1, ByteSize simm13a);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   917
#endif
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   918
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   919
  // ld_long will perform ldd for 32 bit VM's and ldx for 64 bit VM's
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   920
  // st_long will perform std for 32 bit VM's and stx for 64 bit VM's
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   921
  inline void ld_long(Register s1, Register s2, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   922
  inline void ld_long(Register s1, int simm13a, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   923
  inline void ld_long(Register s1, RegisterOrConstant s2, Register d);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   924
  inline void ld_long(const Address& a, Register d, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   925
  inline void st_long(Register d, Register s1, Register s2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   926
  inline void st_long(Register d, Register s1, int simm13a);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   927
  inline void st_long(Register d, Register s1, RegisterOrConstant s2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   928
  inline void st_long(Register d, const Address& a, int offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   929
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   930
  // Helpers for address formation.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   931
  // - They emit only a move if s2 is a constant zero.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   932
  // - If dest is a constant and either s1 or s2 is a register, the temp argument is required and becomes the result.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   933
  // - If dest is a register and either s1 or s2 is a non-simm13 constant, the temp argument is required and used to materialize the constant.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   934
  RegisterOrConstant regcon_andn_ptr(RegisterOrConstant s1, RegisterOrConstant s2, RegisterOrConstant d, Register temp = noreg);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   935
  RegisterOrConstant regcon_inc_ptr( RegisterOrConstant s1, RegisterOrConstant s2, RegisterOrConstant d, Register temp = noreg);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   936
  RegisterOrConstant regcon_sll_ptr( RegisterOrConstant s1, RegisterOrConstant s2, RegisterOrConstant d, Register temp = noreg);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   937
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   938
  RegisterOrConstant ensure_simm13_or_reg(RegisterOrConstant src, Register temp) {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   939
    if (is_simm13(src.constant_or_zero()))
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   940
      return src;               // register or short constant
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   941
    guarantee(temp != noreg, "constant offset overflow");
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   942
    set(src.as_constant(), temp);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   943
    return temp;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   944
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   945
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   946
  // --------------------------------------------------
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   947
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   948
 public:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   949
  // traps as per trap.h (SPARC ABI?)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   950
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   951
  void breakpoint_trap();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   952
  void breakpoint_trap(Condition c, CC cc);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   953
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   954
  // Support for serializing memory accesses between threads
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   955
  void serialize_memory(Register thread, Register tmp1, Register tmp2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   956
47881
0ce0ac68ace7 8189941: Implementation JEP 312: Thread-local handshake
rehn
parents: 47561
diff changeset
   957
  void safepoint_poll(Label& slow_path, bool a, Register thread_reg, Register temp_reg);
0ce0ac68ace7 8189941: Implementation JEP 312: Thread-local handshake
rehn
parents: 47561
diff changeset
   958
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   959
  // Stack frame creation/removal
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   960
  void enter();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   961
  void leave();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   962
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   963
  // Manipulation of C++ bools
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   964
  // These are idioms to flag the need for care with accessing bools but on
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   965
  // this platform we assume byte size
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   966
35090
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   967
  inline void stbool(Register d, const Address& a);
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   968
  inline void ldbool(const Address& a, Register d);
1f5b6aa795d0 8144748: Move assembler/macroAssembler inline function definitions to corresponding inline.hpp files
mikael
parents: 35086
diff changeset
   969
  inline void movbool( bool boolconst, Register d);
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   970
49816
a3e79f97e86b 8200555: OopHandle should use Access API
coleenp
parents: 49748
diff changeset
   971
  void resolve_oop_handle(Register result, Register tmp);
a3e79f97e86b 8200555: OopHandle should use Access API
coleenp
parents: 49748
diff changeset
   972
  void load_mirror(Register mirror, Register method, Register tmp);
38074
8475fdc6dcc3 8154580: Save mirror in interpreter frame to enable cleanups of CLDClosure
coleenp
parents: 36808
diff changeset
   973
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   974
  // klass oop manipulations if compressed
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   975
  void load_klass(Register src_oop, Register klass);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   976
  void store_klass(Register klass, Register dst_oop);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   977
  void store_klass_gap(Register s, Register dst_oop);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   978
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   979
   // oop manipulations
49748
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   980
  void access_store_at(BasicType type, DecoratorSet decorators,
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   981
                       Register src, Address dst, Register tmp);
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   982
  void access_load_at(BasicType type, DecoratorSet decorators,
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   983
                      Address src, Register dst, Register tmp);
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   984
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   985
  void load_heap_oop(const Address& s, Register d,
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   986
                     Register tmp = noreg, DecoratorSet decorators = 0);
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   987
  void load_heap_oop(Register s1, Register s2, Register d,
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   988
                     Register tmp = noreg, DecoratorSet decorators = 0);
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   989
  void load_heap_oop(Register s1, int simm13a, Register d,
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   990
                     Register tmp = noreg, DecoratorSet decorators = 0);
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   991
  void load_heap_oop(Register s1, RegisterOrConstant s2, Register d,
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   992
                     Register tmp = noreg, DecoratorSet decorators = 0);
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   993
  void store_heap_oop(Register d, Register s1, Register s2,
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   994
                      Register tmp = noreg, DecoratorSet decorators = 0);
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   995
  void store_heap_oop(Register d, Register s1, int simm13a,
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   996
                      Register tmp = noreg, DecoratorSet decorators = 0);
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   997
  void store_heap_oop(Register d, const Address& a, int offset = 0,
6a880e576856 8199417: Modularize interpreter GC barriers
eosterlund
parents: 49625
diff changeset
   998
                      Register tmp = noreg, DecoratorSet decorators = 0);
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
   999
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1000
  void encode_heap_oop(Register src, Register dst);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1001
  void encode_heap_oop(Register r) {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1002
    encode_heap_oop(r, r);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1003
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1004
  void decode_heap_oop(Register src, Register dst);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1005
  void decode_heap_oop(Register r) {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1006
    decode_heap_oop(r, r);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1007
  }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1008
  void encode_heap_oop_not_null(Register r);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1009
  void decode_heap_oop_not_null(Register r);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1010
  void encode_heap_oop_not_null(Register src, Register dst);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1011
  void decode_heap_oop_not_null(Register src, Register dst);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1012
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1013
  void encode_klass_not_null(Register r);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1014
  void decode_klass_not_null(Register r);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1015
  void encode_klass_not_null(Register src, Register dst);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1016
  void decode_klass_not_null(Register src, Register dst);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1017
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1018
  // Support for managing the JavaThread pointer (i.e.; the reference to
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1019
  // thread-local information).
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1020
  void get_thread();                                // load G2_thread
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1021
  void verify_thread();                             // verify G2_thread contents
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1022
  void save_thread   (const Register threache); // save to cache
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1023
  void restore_thread(const Register thread_cache); // restore from cache
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1024
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1025
  // Support for last Java frame (but use call_VM instead where possible)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1026
  void set_last_Java_frame(Register last_java_sp, Register last_Java_pc);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1027
  void reset_last_Java_frame(void);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1028
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1029
  // Call into the VM.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1030
  // Passes the thread pointer (in O0) as a prepended argument.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1031
  // Makes sure oop return values are visible to the GC.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1032
  void call_VM(Register oop_result, address entry_point, int number_of_arguments = 0, bool check_exceptions = true);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1033
  void call_VM(Register oop_result, address entry_point, Register arg_1, bool check_exceptions = true);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1034
  void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, bool check_exceptions = true);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1035
  void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, Register arg_3, bool check_exceptions = true);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1036
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1037
  // these overloadings are not presently used on SPARC:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1038
  void call_VM(Register oop_result, Register last_java_sp, address entry_point, int number_of_arguments = 0, bool check_exceptions = true);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1039
  void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, bool check_exceptions = true);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1040
  void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, bool check_exceptions = true);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1041
  void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, Register arg_3, bool check_exceptions = true);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1042
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1043
  void call_VM_leaf(Register thread_cache, address entry_point, int number_of_arguments = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1044
  void call_VM_leaf(Register thread_cache, address entry_point, Register arg_1);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1045
  void call_VM_leaf(Register thread_cache, address entry_point, Register arg_1, Register arg_2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1046
  void call_VM_leaf(Register thread_cache, address entry_point, Register arg_1, Register arg_2, Register arg_3);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1047
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1048
  void get_vm_result  (Register oop_result);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1049
  void get_vm_result_2(Register metadata_result);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1050
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1051
  // vm result is currently getting hijacked to for oop preservation
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1052
  void set_vm_result(Register oop_result);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1053
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1054
  // Emit the CompiledIC call idiom
35086
bbf32241d851 8072008: Emit direct call instead of linkTo* for recursive indy/MH.invoke* calls
vlivanov
parents: 34205
diff changeset
  1055
  void ic_call(address entry, bool emit_delay = true, jint method_index = 0);
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1056
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1057
  // if call_VM_base was called with check_exceptions=false, then call
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1058
  // check_and_forward_exception to handle exceptions when it is safe
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1059
  void check_and_forward_exception(Register scratch_reg);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1060
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1061
  // pushes double TOS element of FPU stack on CPU stack; pops from FPU stack
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1062
  void push_fTOS();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1063
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1064
  // pops double TOS element from CPU stack and pushes on FPU stack
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1065
  void pop_fTOS();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1066
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1067
  void empty_FPU_stack();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1068
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1069
  void push_IU_state();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1070
  void pop_IU_state();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1071
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1072
  void push_FPU_state();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1073
  void pop_FPU_state();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1074
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1075
  void push_CPU_state();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1076
  void pop_CPU_state();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1077
19319
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18104
diff changeset
  1078
  // Returns the byte size of the instructions generated by decode_klass_not_null().
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18104
diff changeset
  1079
  static int instr_size_for_decode_klass_not_null();
0ad35be0733a 8003424: Enable Class Data Sharing for CompressedOops
hseigel
parents: 18104
diff changeset
  1080
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1081
  // if heap base register is used - reinit it with the correct value
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1082
  void reinit_heapbase();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1083
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1084
  // Debugging
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1085
  void _verify_oop(Register reg, const char * msg, const char * file, int line);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1086
  void _verify_oop_addr(Address addr, const char * msg, const char * file, int line);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1087
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1088
  // TODO: verify_method and klass metadata (compare against vptr?)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1089
  void _verify_method_ptr(Register reg, const char * msg, const char * file, int line) {}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1090
  void _verify_klass_ptr(Register reg, const char * msg, const char * file, int line){}
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1091
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1092
#define verify_oop(reg) _verify_oop(reg, "broken oop " #reg, __FILE__, __LINE__)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1093
#define verify_oop_addr(addr) _verify_oop_addr(addr, "broken oop addr ", __FILE__, __LINE__)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1094
#define verify_method_ptr(reg) _verify_method_ptr(reg, "broken method " #reg, __FILE__, __LINE__)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1095
#define verify_klass_ptr(reg) _verify_klass_ptr(reg, "broken klass " #reg, __FILE__, __LINE__)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1096
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1097
        // only if +VerifyOops
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1098
  void verify_FPU(int stack_depth, const char* s = "illegal FPU state");
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1099
        // only if +VerifyFPU
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1100
  void stop(const char* msg);                          // prints msg, dumps registers and stops execution
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1101
  void warn(const char* msg);                          // prints msg, but don't stop
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1102
  void untested(const char* what = "");
46560
388aa8d67c80 8181449: Fix debug.hpp / globalDefinitions.hpp dependency inversion
kbarrett
parents: 46461
diff changeset
  1103
  void unimplemented(const char* what = "");
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1104
  void should_not_reach_here()                   { stop("should not reach here"); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1105
  void print_CPU_state();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1106
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1107
  // oops in code
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1108
  AddressLiteral allocate_oop_address(jobject obj);                          // allocate_index
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1109
  AddressLiteral constant_oop_address(jobject obj);                          // find_index
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1110
  inline void    set_oop             (jobject obj, Register d);              // uses allocate_oop_address
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1111
  inline void    set_oop_constant    (jobject obj, Register d);              // uses constant_oop_address
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1112
  inline void    set_oop             (const AddressLiteral& obj_addr, Register d); // same as load_address
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1113
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1114
  // metadata in code that we have to keep track of
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1115
  AddressLiteral allocate_metadata_address(Metadata* obj); // allocate_index
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1116
  AddressLiteral constant_metadata_address(Metadata* obj); // find_index
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1117
  inline void    set_metadata             (Metadata* obj, Register d);              // uses allocate_metadata_address
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1118
  inline void    set_metadata_constant    (Metadata* obj, Register d);              // uses constant_metadata_address
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1119
  inline void    set_metadata             (const AddressLiteral& obj_addr, Register d); // same as load_address
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1120
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1121
  void set_narrow_oop( jobject obj, Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1122
  void set_narrow_klass( Klass* k, Register d );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1123
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1124
  // nop padding
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1125
  void align(int modulus);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1126
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1127
  // declare a safepoint
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1128
  void safepoint();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1129
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1130
  // factor out part of stop into subroutine to save space
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1131
  void stop_subroutine();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1132
  // factor out part of verify_oop into subroutine to save space
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1133
  void verify_oop_subroutine();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1134
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1135
  // side-door communication with signalHandler in os_solaris.cpp
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1136
  static address _verify_oop_implicit_branch[3];
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1137
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1138
  int total_frame_size_in_bytes(int extraWords);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1139
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1140
  // used when extraWords known statically
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1141
  void save_frame(int extraWords = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1142
  void save_frame_c1(int size_in_bytes);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1143
  // make a frame, and simultaneously pass up one or two register value
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1144
  // into the new register window
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1145
  void save_frame_and_mov(int extraWords, Register s1, Register d1, Register s2 = Register(), Register d2 = Register());
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1146
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1147
  // give no. (outgoing) params, calc # of words will need on frame
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1148
  void calc_mem_param_words(Register Rparam_words, Register Rresult);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1149
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1150
  // used to calculate frame size dynamically
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1151
  // result is in bytes and must be negated for save inst
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1152
  void calc_frame_size(Register extraWords, Register resultReg);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1153
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1154
  // calc and also save
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1155
  void calc_frame_size_and_save(Register extraWords, Register resultReg);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1156
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1157
  static void debug(char* msg, RegistersForDebugging* outWindow);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1158
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1159
  // implementations of bytecodes used by both interpreter and compiler
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1160
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1161
  void lcmp( Register Ra_hi, Register Ra_low,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1162
             Register Rb_hi, Register Rb_low,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1163
             Register Rresult);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1164
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1165
  void lneg( Register Rhi, Register Rlow );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1166
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1167
  void lshl(  Register Rin_high,  Register Rin_low,  Register Rcount,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1168
              Register Rout_high, Register Rout_low, Register Rtemp );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1169
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1170
  void lshr(  Register Rin_high,  Register Rin_low,  Register Rcount,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1171
              Register Rout_high, Register Rout_low, Register Rtemp );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1172
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1173
  void lushr( Register Rin_high,  Register Rin_low,  Register Rcount,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1174
              Register Rout_high, Register Rout_low, Register Rtemp );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1175
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1176
  void lcmp( Register Ra, Register Rb, Register Rresult);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1177
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1178
  // Load and store values by size and signed-ness
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1179
  void load_sized_value( Address src, Register dst, size_t size_in_bytes, bool is_signed);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1180
  void store_sized_value(Register src, Address dst, size_t size_in_bytes);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1181
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1182
  void float_cmp( bool is_float, int unordered_result,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1183
                  FloatRegister Fa, FloatRegister Fb,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1184
                  Register Rresult);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1185
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1186
  void save_all_globals_into_locals();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1187
  void restore_globals_from_locals();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1188
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1189
  // These set the icc condition code to equal if the lock succeeded
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1190
  // and notEqual if it failed and requires a slow case
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1191
  void compiler_lock_object(Register Roop, Register Rmark, Register Rbox,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1192
                            Register Rscratch,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1193
                            BiasedLockingCounters* counters = NULL,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1194
                            bool try_bias = UseBiasedLocking);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1195
  void compiler_unlock_object(Register Roop, Register Rmark, Register Rbox,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1196
                              Register Rscratch,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1197
                              bool try_bias = UseBiasedLocking);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1198
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1199
  // Biased locking support
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1200
  // Upon entry, lock_reg must point to the lock record on the stack,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1201
  // obj_reg must contain the target object, and mark_reg must contain
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1202
  // the target object's header.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1203
  // Destroys mark_reg if an attempt is made to bias an anonymously
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1204
  // biased lock. In this case a failure will go either to the slow
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1205
  // case or fall through with the notEqual condition code set with
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1206
  // the expectation that the slow case in the runtime will be called.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1207
  // In the fall-through case where the CAS-based lock is done,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1208
  // mark_reg is not destroyed.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1209
  void biased_locking_enter(Register obj_reg, Register mark_reg, Register temp_reg,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1210
                            Label& done, Label* slow_case = NULL,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1211
                            BiasedLockingCounters* counters = NULL);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1212
  // Upon entry, the base register of mark_addr must contain the oop.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1213
  // Destroys temp_reg.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1214
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1215
  // If allow_delay_slot_filling is set to true, the next instruction
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1216
  // emitted after this one will go in an annulled delay slot if the
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1217
  // biased locking exit case failed.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1218
  void biased_locking_exit(Address mark_addr, Register temp_reg, Label& done, bool allow_delay_slot_filling = false);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1219
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1220
  // allocation
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1221
  void eden_allocate(
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1222
    Register obj,                      // result: pointer to object after successful allocation
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1223
    Register var_size_in_bytes,        // object size in bytes if unknown at compile time; invalid otherwise
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1224
    int      con_size_in_bytes,        // object size in bytes if   known at compile time
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1225
    Register t1,                       // temp register
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1226
    Register t2,                       // temp register
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1227
    Label&   slow_case                 // continuation point if fast allocation fails
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1228
  );
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1229
  void tlab_allocate(
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1230
    Register obj,                      // result: pointer to object after successful allocation
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1231
    Register var_size_in_bytes,        // object size in bytes if unknown at compile time; invalid otherwise
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1232
    int      con_size_in_bytes,        // object size in bytes if   known at compile time
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1233
    Register t1,                       // temp register
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1234
    Label&   slow_case                 // continuation point if fast allocation fails
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1235
  );
35548
8d3afe96ffea 8086053: Address inconsistencies regarding ZeroTLAB
zmajo
parents: 35232
diff changeset
  1236
  void zero_memory(Register base, Register index);
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1237
  void incr_allocated_bytes(RegisterOrConstant size_in_bytes,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1238
                            Register t1, Register t2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1239
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1240
  // interface method calling
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1241
  void lookup_interface_method(Register recv_klass,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1242
                               Register intf_klass,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1243
                               RegisterOrConstant itable_index,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1244
                               Register method_result,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1245
                               Register temp_reg, Register temp2_reg,
48557
2e867226b914 8174962: Better interface invocations
vlivanov
parents: 47881
diff changeset
  1246
                               Label& no_such_interface,
2e867226b914 8174962: Better interface invocations
vlivanov
parents: 47881
diff changeset
  1247
                               bool return_method = true);
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1248
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1249
  // virtual method calling
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1250
  void lookup_virtual_method(Register recv_klass,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1251
                             RegisterOrConstant vtable_index,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1252
                             Register method_result);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1253
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1254
  // Test sub_klass against super_klass, with fast and slow paths.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1255
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1256
  // The fast path produces a tri-state answer: yes / no / maybe-slow.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1257
  // One of the three labels can be NULL, meaning take the fall-through.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1258
  // If super_check_offset is -1, the value is loaded up from super_klass.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1259
  // No registers are killed, except temp_reg and temp2_reg.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1260
  // If super_check_offset is not -1, temp2_reg is not used and can be noreg.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1261
  void check_klass_subtype_fast_path(Register sub_klass,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1262
                                     Register super_klass,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1263
                                     Register temp_reg,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1264
                                     Register temp2_reg,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1265
                                     Label* L_success,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1266
                                     Label* L_failure,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1267
                                     Label* L_slow_path,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1268
                RegisterOrConstant super_check_offset = RegisterOrConstant(-1));
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1269
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1270
  // The rest of the type check; must be wired to a corresponding fast path.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1271
  // It does not repeat the fast path logic, so don't use it standalone.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1272
  // The temp_reg can be noreg, if no temps are available.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1273
  // It can also be sub_klass or super_klass, meaning it's OK to kill that one.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1274
  // Updates the sub's secondary super cache as necessary.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1275
  void check_klass_subtype_slow_path(Register sub_klass,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1276
                                     Register super_klass,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1277
                                     Register temp_reg,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1278
                                     Register temp2_reg,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1279
                                     Register temp3_reg,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1280
                                     Register temp4_reg,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1281
                                     Label* L_success,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1282
                                     Label* L_failure);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1283
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1284
  // Simplified, combined version, good for typical uses.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1285
  // Falls through on failure.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1286
  void check_klass_subtype(Register sub_klass,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1287
                           Register super_klass,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1288
                           Register temp_reg,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1289
                           Register temp2_reg,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1290
                           Label& L_success);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1291
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1292
  // method handles (JSR 292)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1293
  // offset relative to Gargs of argument at tos[arg_slot].
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1294
  // (arg_slot == 0 means the last argument, not the first).
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1295
  RegisterOrConstant argument_offset(RegisterOrConstant arg_slot,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1296
                                     Register temp_reg,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1297
                                     int extra_slot_offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1298
  // Address of Gargs and argument_offset.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1299
  Address            argument_address(RegisterOrConstant arg_slot,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1300
                                      Register temp_reg = noreg,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1301
                                      int extra_slot_offset = 0);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1302
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1303
  // Stack overflow checking
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1304
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1305
  // Note: this clobbers G3_scratch
50380
bec342339138 8204195: Clean up macroAssembler.inline.hpp and other inline.hpp files included in .hpp files
coleenp
parents: 49816
diff changeset
  1306
  void bang_stack_with_offset(int offset);
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1307
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1308
  // Writes to stack successive pages until offset reached to check for
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1309
  // stack overflow + shadow pages.  Clobbers tsp and scratch registers.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1310
  void bang_stack_size(Register Rsize, Register Rtsp, Register Rscratch);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1311
35071
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34205
diff changeset
  1312
  // Check for reserved stack access in method being exited (for JIT)
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34205
diff changeset
  1313
  void reserved_stack_check();
a0910b1d3e0d 8046936: JEP 270: Reserved Stack Areas for Critical Sections
fparain
parents: 34205
diff changeset
  1314
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1315
  virtual RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr, Register tmp, int offset);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1316
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1317
  void verify_tlab();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1318
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1319
  Condition negate_condition(Condition cond);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1320
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1321
  // Helper functions for statistics gathering.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1322
  // Conditionally (non-atomically) increments passed counter address, preserving condition codes.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1323
  void cond_inc(Condition cond, address counter_addr, Register Rtemp1, Register Rtemp2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1324
  // Unconditional increment.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1325
  void inc_counter(address counter_addr, Register Rtmp1, Register Rtmp2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1326
  void inc_counter(int*    counter_addr, Register Rtmp1, Register Rtmp2);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1327
33628
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1328
#ifdef COMPILER2
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1329
  // Compress char[] to byte[] by compressing 16 bytes at once. Return 0 on failure.
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1330
  void string_compress_16(Register src, Register dst, Register cnt, Register result,
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1331
                          Register tmp1, Register tmp2, Register tmp3, Register tmp4,
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1332
                          FloatRegister ftmp1, FloatRegister ftmp2, FloatRegister ftmp3, Label& Ldone);
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1333
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1334
  // Compress char[] to byte[]. Return 0 on failure.
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1335
  void string_compress(Register src, Register dst, Register cnt, Register tmp, Register result, Label& Ldone);
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1336
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1337
  // Inflate byte[] to char[] by inflating 16 bytes at once.
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1338
  void string_inflate_16(Register src, Register dst, Register cnt, Register tmp,
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1339
                         FloatRegister ftmp1, FloatRegister ftmp2, FloatRegister ftmp3, FloatRegister ftmp4, Label& Ldone);
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1340
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1341
  // Inflate byte[] to char[].
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1342
  void string_inflate(Register src, Register dst, Register cnt, Register tmp, Label& Ldone);
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1343
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1344
  void string_compare(Register str1, Register str2,
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1345
                      Register cnt1, Register cnt2,
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1346
                      Register tmp1, Register tmp2,
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1347
                      Register result, int ae);
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1348
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1349
  void array_equals(bool is_array_equ, Register ary1, Register ary2,
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1350
                    Register limit, Register tmp, Register result, bool is_byte);
36808
bae14ddeff3b 8144693: Intrinsify StringCoding.hasNegatives() on SPARC
thartmann
parents: 35548
diff changeset
  1351
  // test for negative bytes in input string of a given size, result 0 if none
bae14ddeff3b 8144693: Intrinsify StringCoding.hasNegatives() on SPARC
thartmann
parents: 35548
diff changeset
  1352
  void has_negatives(Register inp, Register size, Register result,
bae14ddeff3b 8144693: Intrinsify StringCoding.hasNegatives() on SPARC
thartmann
parents: 35548
diff changeset
  1353
                     Register t2, Register t3, Register t4,
bae14ddeff3b 8144693: Intrinsify StringCoding.hasNegatives() on SPARC
thartmann
parents: 35548
diff changeset
  1354
                     Register t5);
bae14ddeff3b 8144693: Intrinsify StringCoding.hasNegatives() on SPARC
thartmann
parents: 35548
diff changeset
  1355
33628
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1356
#endif
09241459a8b8 8141132: JEP 254: Compact Strings
thartmann
parents: 31515
diff changeset
  1357
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1358
  // Use BIS for zeroing
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1359
  void bis_zeroing(Register to, Register count, Register temp, Label& Ldone);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1360
31515
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 25714
diff changeset
  1361
  // Update CRC-32[C] with a byte value according to constants in table
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 25714
diff changeset
  1362
  void update_byte_crc32(Register crc, Register val, Register table);
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 25714
diff changeset
  1363
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 25714
diff changeset
  1364
  // Reverse byte order of lower 32 bits, assuming upper 32 bits all zeros
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 25714
diff changeset
  1365
  void reverse_bytes_32(Register src, Register dst, Register tmp);
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 25714
diff changeset
  1366
  void movitof_revbytes(Register src, FloatRegister dst, Register tmp1, Register tmp2);
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 25714
diff changeset
  1367
  void movftoi_revbytes(FloatRegister src, Register dst, Register tmp1, Register tmp2);
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 25714
diff changeset
  1368
46596
a7c9706d25a9 8144448: Avoid placing CTI immediately following or preceding RDPC instruction
neliasso
parents: 46560
diff changeset
  1369
  // CRC32 code for java.util.zip.CRC32::updateBytes0() intrinsic.
34205
9ec51d30a11e 8143012: CRC32 Intrinsics support on SPARC
kvn
parents: 33628
diff changeset
  1370
  void kernel_crc32(Register crc, Register buf, Register len, Register table);
9ec51d30a11e 8143012: CRC32 Intrinsics support on SPARC
kvn
parents: 33628
diff changeset
  1371
  // Fold 128-bit data chunk
9ec51d30a11e 8143012: CRC32 Intrinsics support on SPARC
kvn
parents: 33628
diff changeset
  1372
  void fold_128bit_crc32(Register xcrc_hi, Register xcrc_lo, Register xK_hi, Register xK_lo, Register xtmp_hi, Register xtmp_lo, Register buf, int offset);
9ec51d30a11e 8143012: CRC32 Intrinsics support on SPARC
kvn
parents: 33628
diff changeset
  1373
  void fold_128bit_crc32(Register xcrc_hi, Register xcrc_lo, Register xK_hi, Register xK_lo, Register xtmp_hi, Register xtmp_lo, Register xbuf_hi, Register xbuf_lo);
9ec51d30a11e 8143012: CRC32 Intrinsics support on SPARC
kvn
parents: 33628
diff changeset
  1374
  // Fold 8-bit data
9ec51d30a11e 8143012: CRC32 Intrinsics support on SPARC
kvn
parents: 33628
diff changeset
  1375
  void fold_8bit_crc32(Register xcrc, Register table, Register xtmp, Register tmp);
9ec51d30a11e 8143012: CRC32 Intrinsics support on SPARC
kvn
parents: 33628
diff changeset
  1376
  void fold_8bit_crc32(Register crc, Register table, Register tmp);
46596
a7c9706d25a9 8144448: Avoid placing CTI immediately following or preceding RDPC instruction
neliasso
parents: 46560
diff changeset
  1377
  // CRC32C code for java.util.zip.CRC32C::updateBytes/updateDirectByteBuffer intrinsic.
38237
d972e3a2df53 8155162: java.util.zip.CRC32C Interpreter/C1 intrinsics support on SPARC
kvn
parents: 36808
diff changeset
  1378
  void kernel_crc32c(Register crc, Register buf, Register len, Register table);
34205
9ec51d30a11e 8143012: CRC32 Intrinsics support on SPARC
kvn
parents: 33628
diff changeset
  1379
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1380
};
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1381
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1382
/**
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1383
 * class SkipIfEqual:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1384
 *
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1385
 * Instantiating this class will result in assembly code being output that will
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1386
 * jump around any code emitted between the creation of the instance and it's
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1387
 * automatic destruction at the end of a scope block, depending on the value of
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1388
 * the flag passed to the constructor, which will be checked at run-time.
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1389
 */
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1390
class SkipIfEqual : public StackObj {
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1391
 private:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1392
  MacroAssembler* _masm;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1393
  Label _label;
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1394
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1395
 public:
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1396
   // 'temp' is a temp register that this object can use (and trash)
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1397
   SkipIfEqual(MacroAssembler*, Register temp,
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1398
               const bool* flag_addr, Assembler::Condition condition);
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1399
   ~SkipIfEqual();
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1400
};
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1401
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents:
diff changeset
  1402
#endif // CPU_SPARC_VM_MACROASSEMBLER_SPARC_HPP