hotspot/src/share/vm/asm/assembler.hpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 14837 a75c3082d106
child 15116 af423dcb739c
permissions -rw-r--r--
8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13963
e5b53c306fb5 7197424: update copyright year to match last edit in jdk8 hotspot repository
mikael
parents: 13391
diff changeset
     2
 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2332
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2332
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 2332
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    25
#ifndef SHARE_VM_ASM_ASSEMBLER_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#define SHARE_VM_ASM_ASSEMBLER_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
    28
#include "asm/codeBuffer.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "code/oopRecorder.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
#include "code/relocInfo.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
#include "memory/allocation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    32
#include "utilities/debug.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    33
#include "utilities/growableArray.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    34
#include "utilities/top.hpp"
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
    35
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    36
#ifdef TARGET_ARCH_x86
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    37
# include "register_x86.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    38
# include "vm_version_x86.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    39
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    40
#ifdef TARGET_ARCH_sparc
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    41
# include "register_sparc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    42
# include "vm_version_sparc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    43
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    44
#ifdef TARGET_ARCH_zero
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    45
# include "register_zero.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    46
# include "vm_version_zero.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    47
#endif
8107
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7433
diff changeset
    48
#ifdef TARGET_ARCH_arm
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7433
diff changeset
    49
# include "register_arm.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7433
diff changeset
    50
# include "vm_version_arm.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7433
diff changeset
    51
#endif
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7433
diff changeset
    52
#ifdef TARGET_ARCH_ppc
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7433
diff changeset
    53
# include "register_ppc.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7433
diff changeset
    54
# include "vm_version_ppc.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7433
diff changeset
    55
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    56
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 1
diff changeset
    57
// This file contains platform-independent assembler declarations.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
class MacroAssembler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
class AbstractAssembler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
class Label;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
/**
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
 * Labels represent destinations for control transfer instructions.  Such
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
 * instructions can accept a Label as their target argument.  A Label is
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
 * bound to the current location in the code stream by calling the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
 * MacroAssembler's 'bind' method, which in turn calls the Label's 'bind'
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
 * method.  A Label may be referenced by an instruction before it's bound
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
 * (i.e., 'forward referenced').  'bind' stores the current code offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
 * in the Label object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
 * If an instruction references a bound Label, the offset field(s) within
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
 * the instruction are immediately filled in based on the Label's code
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
 * offset.  If an instruction references an unbound label, that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
 * instruction is put on a list of instructions that must be patched
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
 * (i.e., 'resolved') when the Label is bound.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
 * 'bind' will call the platform-specific 'patch_instruction' method to
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
 * fill in the offset field(s) for each unresolved instruction (if there
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
 * are any).  'patch_instruction' lives in one of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
 * cpu/<arch>/vm/assembler_<arch>* files.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
 * Instead of using a linked list of unresolved instructions, a Label has
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
 * an array of unresolved instruction code offsets.  _patch_index
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
 * contains the total number of forward references.  If the Label's array
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
 * overflows (i.e., _patch_index grows larger than the array size), a
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
 * GrowableArray is allocated to hold the remaining offsets.  (The cache
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
 * size is 4 for now, which handles over 99.5% of the cases)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
 * Labels may only be used within a single CodeSection.  If you need
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
 * to create references between code sections, use explicit relocations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
class Label VALUE_OBJ_CLASS_SPEC {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  enum { PatchCacheSize = 4 };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  // _loc encodes both the binding state (via its sign)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  // and the binding locator (via its value) of a label.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  // _loc >= 0   bound label, loc() encodes the target (jump) position
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  // _loc == -1  unbound label
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  int _loc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
  // References to instructions that jump to this unresolved label.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  // These instructions need to be patched when the label is bound
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  // using the platform-specific patchInstruction() method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  // To avoid having to allocate from the C-heap each time, we provide
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  // a local cache and use the overflow only if we exceed the local cache
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  int _patches[PatchCacheSize];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  int _patch_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  GrowableArray<int>* _patch_overflow;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  Label(const Label&) { ShouldNotReachHere(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  /**
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
   * After binding, be sure 'patch_instructions' is called later to link
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
   */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  void bind_loc(int loc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
    assert(loc >= 0, "illegal locator");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    assert(_loc == -1, "already bound");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
    _loc = loc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  }
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   126
  void bind_loc(int pos, int sect) { bind_loc(CodeBuffer::locator(pos, sect)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  // Iterates over all unresolved instructions for printing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  void print_instructions(MacroAssembler* masm) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  /**
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
   * Returns the position of the the Label in the code buffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
   * The position is a 'locator', which encodes both offset and section.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
   */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  int loc() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    assert(_loc >= 0, "unbound label");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    return _loc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  }
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   141
  int loc_pos()  const { return CodeBuffer::locator_pos(loc()); }
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   142
  int loc_sect() const { return CodeBuffer::locator_sect(loc()); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  bool is_bound() const    { return _loc >=  0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  bool is_unbound() const  { return _loc == -1 && _patch_index > 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  bool is_unused() const   { return _loc == -1 && _patch_index == 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  /**
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
   * Adds a reference to an unresolved displacement instruction to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
   * this unbound label
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
   *
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
   * @param cb         the code buffer being patched
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
   * @param branch_loc the locator of the branch instruction in the code buffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
   */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  void add_patch_at(CodeBuffer* cb, int branch_loc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  /**
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
   * Iterate over the list of patches, resolving the instructions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
   * Call patch_instruction on each 'branch_loc' value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
   */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  void patch_instructions(MacroAssembler* masm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  void init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
    _loc = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
    _patch_index = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
    _patch_overflow = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  Label() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
    init();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   174
// A union type for code which has to assemble both constant and
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   175
// non-constant operands, when the distinction cannot be made
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   176
// statically.
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2148
diff changeset
   177
class RegisterOrConstant VALUE_OBJ_CLASS_SPEC {
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   178
 private:
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   179
  Register _r;
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   180
  intptr_t _c;
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   181
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   182
 public:
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2148
diff changeset
   183
  RegisterOrConstant(): _r(noreg), _c(0) {}
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2148
diff changeset
   184
  RegisterOrConstant(Register r): _r(r), _c(0) {}
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2148
diff changeset
   185
  RegisterOrConstant(intptr_t c): _r(noreg), _c(c) {}
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   186
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   187
  Register as_register() const { assert(is_register(),""); return _r; }
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   188
  intptr_t as_constant() const { assert(is_constant(),""); return _c; }
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   189
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   190
  Register register_or_noreg() const { return _r; }
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   191
  intptr_t constant_or_zero() const  { return _c; }
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   192
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   193
  bool is_register() const { return _r != noreg; }
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   194
  bool is_constant() const { return _r == noreg; }
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   195
};
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
// The Abstract Assembler: Pure assembler doing NO optimizations on the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
// instruction level; i.e., what you write is what you get.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
// The Assembler is generating code into a CodeBuffer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
class AbstractAssembler : public ResourceObj  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  friend class Label;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  CodeSection* _code_section;          // section within the code buffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  OopRecorder* _oop_recorder;          // support for relocInfo::oop_type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  // Code emission & accessing
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   208
  address addr_at(int pos) const { return code_section()->start() + pos; }
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   209
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  // This routine is called with a label is used for an address.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  // Labels and displacements truck in offsets, but target must return a PC.
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   213
  address target(Label& L)             { return code_section()->target(L, pc()); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  bool is8bit(int x) const             { return -0x80 <= x && x < 0x80; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  bool isByte(int x) const             { return 0 <= x && x < 0x100; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  bool isShiftCount(int x) const       { return 0 <= x && x < 32; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
14625
b02f361c324e 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 14624
diff changeset
   219
  void emit_long(jint x) { emit_int32(x); }  // deprecated
b02f361c324e 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 14624
diff changeset
   220
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  // Instruction boundaries (required when emitting relocatable values).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  class InstructionMark: public StackObj {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
   private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
    AbstractAssembler* _assm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
   public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
    InstructionMark(AbstractAssembler* assm) : _assm(assm) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
      assert(assm->inst_mark() == NULL, "overlapping instructions");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
      _assm->set_inst_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
    ~InstructionMark() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
      _assm->clear_inst_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  friend class InstructionMark;
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   236
#ifdef ASSERT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  // Make it return true on platforms which need to verify
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  // instruction boundaries for some operations.
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents: 14626
diff changeset
   239
  static bool pd_check_instruction_mark();
11434
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   240
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   241
  // Add delta to short branch distance to verify that it still fit into imm8.
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   242
  int _short_branch_delta;
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   243
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   244
  int  short_branch_delta() const { return _short_branch_delta; }
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   245
  void set_short_branch_delta()   { _short_branch_delta = 32; }
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   246
  void clear_short_branch_delta() { _short_branch_delta = 0; }
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   247
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   248
  class ShortBranchVerifier: public StackObj {
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   249
   private:
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   250
    AbstractAssembler* _assm;
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   251
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   252
   public:
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   253
    ShortBranchVerifier(AbstractAssembler* assm) : _assm(assm) {
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   254
      assert(assm->short_branch_delta() == 0, "overlapping instructions");
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   255
      _assm->set_short_branch_delta();
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   256
    }
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   257
    ~ShortBranchVerifier() {
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   258
      _assm->clear_short_branch_delta();
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   259
    }
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   260
  };
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   261
#else
11434
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   262
  // Dummy in product.
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   263
  class ShortBranchVerifier: public StackObj {
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   264
   public:
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   265
    ShortBranchVerifier(AbstractAssembler* assm) {}
c50976508b6b 7110832: ctw/.../org_apache_avalon_composition_util_StringHelper crashes the VM
kvn
parents: 11190
diff changeset
   266
  };
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   267
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  // Creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  AbstractAssembler(CodeBuffer* code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  // ensure buf contains all code (call this before using/copying the code)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  void flush();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
14837
a75c3082d106 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 14831
diff changeset
   277
  void emit_int8(   int8_t  x) { code_section()->emit_int8(   x); }
a75c3082d106 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 14831
diff changeset
   278
  void emit_int16(  int16_t x) { code_section()->emit_int16(  x); }
a75c3082d106 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 14831
diff changeset
   279
  void emit_int32(  int32_t x) { code_section()->emit_int32(  x); }
a75c3082d106 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 14831
diff changeset
   280
  void emit_int64(  int64_t x) { code_section()->emit_int64(  x); }
a75c3082d106 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 14831
diff changeset
   281
a75c3082d106 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 14831
diff changeset
   282
  void emit_float(  jfloat  x) { code_section()->emit_float(  x); }
a75c3082d106 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 14831
diff changeset
   283
  void emit_double( jdouble x) { code_section()->emit_double( x); }
a75c3082d106 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 14831
diff changeset
   284
  void emit_address(address x) { code_section()->emit_address(x); }
a75c3082d106 8004250: replace AbstractAssembler a_byte/a_long with emit_int8/emit_int32
twisti
parents: 14831
diff changeset
   285
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   286
  // min and max values for signed immediate ranges
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   287
  static int min_simm(int nbits) { return -(intptr_t(1) << (nbits - 1))    ; }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   288
  static int max_simm(int nbits) { return  (intptr_t(1) << (nbits - 1)) - 1; }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   289
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   290
  // Define some:
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   291
  static int min_simm10() { return min_simm(10); }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   292
  static int min_simm13() { return min_simm(13); }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   293
  static int min_simm16() { return min_simm(16); }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   294
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   295
  // Test if x is within signed immediate range for nbits
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   296
  static bool is_simm(intptr_t x, int nbits) { return min_simm(nbits) <= x && x <= max_simm(nbits); }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   297
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   298
  // Define some:
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   299
  static bool is_simm5( intptr_t x) { return is_simm(x, 5 ); }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   300
  static bool is_simm8( intptr_t x) { return is_simm(x, 8 ); }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   301
  static bool is_simm10(intptr_t x) { return is_simm(x, 10); }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   302
  static bool is_simm11(intptr_t x) { return is_simm(x, 11); }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   303
  static bool is_simm12(intptr_t x) { return is_simm(x, 12); }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   304
  static bool is_simm13(intptr_t x) { return is_simm(x, 13); }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   305
  static bool is_simm16(intptr_t x) { return is_simm(x, 16); }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   306
  static bool is_simm26(intptr_t x) { return is_simm(x, 26); }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   307
  static bool is_simm32(intptr_t x) { return is_simm(x, 32); }
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 8921
diff changeset
   308
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  // Accessors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  CodeSection*  code_section() const   { return _code_section; }
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   311
  CodeBuffer*   code()         const   { return code_section()->outer(); }
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   312
  int           sect()         const   { return code_section()->index(); }
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   313
  address       pc()           const   { return code_section()->end();   }
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   314
  int           offset()       const   { return code_section()->size();  }
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   315
  int           locator()      const   { return CodeBuffer::locator(offset(), sect()); }
14625
b02f361c324e 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 14624
diff changeset
   316
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  OopRecorder*  oop_recorder() const   { return _oop_recorder; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  void      set_oop_recorder(OopRecorder* r) { _oop_recorder = r; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   320
  address       inst_mark() const { return code_section()->mark();       }
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   321
  void      set_inst_mark()       {        code_section()->set_mark();   }
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   322
  void    clear_inst_mark()       {        code_section()->clear_mark(); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  // Constants in code
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   325
  void relocate(RelocationHolder const& rspec, int format = 0) {
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   326
    assert(!pd_check_instruction_mark()
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   327
        || inst_mark() == NULL || inst_mark() == code_section()->end(),
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   328
        "call relocate() between instructions");
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   329
    code_section()->relocate(code_section()->end(), rspec, format);
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   330
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  void relocate(   relocInfo::relocType rtype, int format = 0) {
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14625
diff changeset
   332
    code_section()->relocate(code_section()->end(), rtype, format);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  static int code_fill_byte();         // used to pad out odd-sized code buffers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  // Associate a comment with the current offset.  It will be printed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  // along with the disassembly when printing nmethods.  Currently
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  // only supported in the instruction section of the code buffer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
  void block_comment(const char* comment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
  // Label functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  void bind(Label& L); // binds an unbound label L to the current code position
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
  // Move to a different section in the same code buffer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  void set_code_section(CodeSection* cs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
  // Inform assembler when generating stub code and relocation info
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  address    start_a_stub(int required_space);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
  void       end_a_stub();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  // Ditto for constants.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  address    start_a_const(int required_space, int required_align = sizeof(double));
14624
8f5ec8cfe196 8003850: add support for constants in stub code
kvn
parents: 13963
diff changeset
   353
  void       end_a_const(CodeSection* cs);  // Pass the codesection to continue in (insts or stubs?).
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   355
  // constants support
14624
8f5ec8cfe196 8003850: add support for constants in stub code
kvn
parents: 13963
diff changeset
   356
  //
8f5ec8cfe196 8003850: add support for constants in stub code
kvn
parents: 13963
diff changeset
   357
  // We must remember the code section (insts or stubs) in c1
8f5ec8cfe196 8003850: add support for constants in stub code
kvn
parents: 13963
diff changeset
   358
  // so we can reset to the proper section in end_a_const().
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   359
  address long_constant(jlong c) {
14624
8f5ec8cfe196 8003850: add support for constants in stub code
kvn
parents: 13963
diff changeset
   360
    CodeSection* c1 = _code_section;
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   361
    address ptr = start_a_const(sizeof(c), sizeof(c));
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   362
    if (ptr != NULL) {
14625
b02f361c324e 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 14624
diff changeset
   363
      emit_int64(c);
14624
8f5ec8cfe196 8003850: add support for constants in stub code
kvn
parents: 13963
diff changeset
   364
      end_a_const(c1);
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   365
    }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   366
    return ptr;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   367
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  address double_constant(jdouble c) {
14624
8f5ec8cfe196 8003850: add support for constants in stub code
kvn
parents: 13963
diff changeset
   369
    CodeSection* c1 = _code_section;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
    address ptr = start_a_const(sizeof(c), sizeof(c));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
    if (ptr != NULL) {
14625
b02f361c324e 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 14624
diff changeset
   372
      emit_double(c);
14624
8f5ec8cfe196 8003850: add support for constants in stub code
kvn
parents: 13963
diff changeset
   373
      end_a_const(c1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
    return ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  address float_constant(jfloat c) {
14624
8f5ec8cfe196 8003850: add support for constants in stub code
kvn
parents: 13963
diff changeset
   378
    CodeSection* c1 = _code_section;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
    address ptr = start_a_const(sizeof(c), sizeof(c));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
    if (ptr != NULL) {
14625
b02f361c324e 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 14624
diff changeset
   381
      emit_float(c);
14624
8f5ec8cfe196 8003850: add support for constants in stub code
kvn
parents: 13963
diff changeset
   382
      end_a_const(c1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
    return ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  }
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   386
  address address_constant(address c) {
14624
8f5ec8cfe196 8003850: add support for constants in stub code
kvn
parents: 13963
diff changeset
   387
    CodeSection* c1 = _code_section;
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   388
    address ptr = start_a_const(sizeof(c), sizeof(c));
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   389
    if (ptr != NULL) {
14625
b02f361c324e 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 14624
diff changeset
   390
      emit_address(c);
14624
8f5ec8cfe196 8003850: add support for constants in stub code
kvn
parents: 13963
diff changeset
   391
      end_a_const(c1);
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   392
    }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   393
    return ptr;
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
   394
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  address address_constant(address c, RelocationHolder const& rspec) {
14624
8f5ec8cfe196 8003850: add support for constants in stub code
kvn
parents: 13963
diff changeset
   396
    CodeSection* c1 = _code_section;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
    address ptr = start_a_const(sizeof(c), sizeof(c));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
    if (ptr != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
      relocate(rspec);
14625
b02f361c324e 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 14624
diff changeset
   400
      emit_address(c);
14624
8f5ec8cfe196 8003850: add support for constants in stub code
kvn
parents: 13963
diff changeset
   401
      end_a_const(c1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
    return ptr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   406
  // Bootstrapping aid to cope with delayed determination of constants.
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   407
  // Returns a static address which will eventually contain the constant.
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   408
  // The value zero (NULL) stands instead of a constant which is still uncomputed.
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   409
  // Thus, the eventual value of the constant must not be zero.
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   410
  // This is fine, since this is designed for embedding object field
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   411
  // offsets in code which must be generated before the object class is loaded.
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   412
  // Field offsets are never zero, since an object's header (mark word)
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   413
  // is located at offset zero.
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 11434
diff changeset
   414
  RegisterOrConstant delayed_value(int(*value_fn)(), Register tmp, int offset = 0);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 11434
diff changeset
   415
  RegisterOrConstant delayed_value(address(*value_fn)(), Register tmp, int offset = 0);
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2148
diff changeset
   416
  virtual RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr, Register tmp, int offset) = 0;
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   417
  // Last overloading is platform-dependent; look in assembler_<arch>.cpp.
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   418
  static intptr_t* delayed_value_addr(int(*constant_fn)());
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   419
  static intptr_t* delayed_value_addr(address(*constant_fn)());
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   420
  static void update_delayed_values();
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2131
diff changeset
   421
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  // Bang stack to trigger StackOverflowError at a safe location
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  // implementation delegates to machine-specific bang_stack_with_offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  void generate_stack_overflow_check( int frame_size_in_bytes );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  virtual void bang_stack_with_offset(int offset) = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  /**
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
   * A platform-dependent method to patch a jump instruction that refers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
   * to this label.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
   *
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
   * @param branch the location of the instruction to patch
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
   * @param masm the assembler which generated the branch
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
   */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  void pd_patch_instruction(address branch, address target);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   439
#ifdef TARGET_ARCH_x86
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   440
# include "assembler_x86.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   441
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   442
#ifdef TARGET_ARCH_sparc
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   443
# include "assembler_sparc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   444
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   445
#ifdef TARGET_ARCH_zero
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   446
# include "assembler_zero.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   447
#endif
8107
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7433
diff changeset
   448
#ifdef TARGET_ARCH_arm
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7433
diff changeset
   449
# include "assembler_arm.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7433
diff changeset
   450
#endif
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7433
diff changeset
   451
#ifdef TARGET_ARCH_ppc
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7433
diff changeset
   452
# include "assembler_ppc.hpp"
78e5bd944384 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 7433
diff changeset
   453
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   454
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   455
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   456
#endif // SHARE_VM_ASM_ASSEMBLER_HPP