hotspot/src/cpu/x86/vm/assembler_x86.hpp
author johnc
Thu, 07 Apr 2011 09:53:20 -0700
changeset 9176 42d9d1010f38
parent 8494 4258c78226d9
child 9179 6db9c9dffe1f
permissions -rw-r--r--
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer. Reviewed-by: kvn, iveresov, never, tonyp, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
     2
 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5416
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5416
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5416
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    25
#ifndef CPU_X86_VM_ASSEMBLER_X86_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    26
#define CPU_X86_VM_ASSEMBLER_X86_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    27
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
class BiasedLockingCounters;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
// Contains all the definitions needed for x86 assembly code generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
// Calling convention
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
class Argument VALUE_OBJ_CLASS_SPEC {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
#ifdef _WIN64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
    n_int_register_parameters_c   = 4, // rcx, rdx, r8, r9 (c_rarg0, c_rarg1, ...)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
    n_float_register_parameters_c = 4,  // xmm0 - xmm3 (c_farg0, c_farg1, ... )
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
    n_int_register_parameters_c   = 6, // rdi, rsi, rdx, rcx, r8, r9 (c_rarg0, c_rarg1, ...)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
    n_float_register_parameters_c = 8,  // xmm0 - xmm7 (c_farg0, c_farg1, ... )
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
#endif // _WIN64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
    n_int_register_parameters_j   = 6, // j_rarg0, j_rarg1, ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
    n_float_register_parameters_j = 8  // j_farg0, j_farg1, ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
    n_register_parameters = 0   // 0 registers used to pass arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
#endif // _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
#ifdef _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
// Symbolically name the register arguments used by the c calling convention.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
// Windows is different from linux/solaris. So much for standards...
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
#ifdef _WIN64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
REGISTER_DECLARATION(Register, c_rarg0, rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
REGISTER_DECLARATION(Register, c_rarg1, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
REGISTER_DECLARATION(Register, c_rarg2, r8);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
REGISTER_DECLARATION(Register, c_rarg3, r9);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    64
REGISTER_DECLARATION(XMMRegister, c_farg0, xmm0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    65
REGISTER_DECLARATION(XMMRegister, c_farg1, xmm1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    66
REGISTER_DECLARATION(XMMRegister, c_farg2, xmm2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    67
REGISTER_DECLARATION(XMMRegister, c_farg3, xmm3);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
REGISTER_DECLARATION(Register, c_rarg0, rdi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
REGISTER_DECLARATION(Register, c_rarg1, rsi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
REGISTER_DECLARATION(Register, c_rarg2, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
REGISTER_DECLARATION(Register, c_rarg3, rcx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
REGISTER_DECLARATION(Register, c_rarg4, r8);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
REGISTER_DECLARATION(Register, c_rarg5, r9);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    78
REGISTER_DECLARATION(XMMRegister, c_farg0, xmm0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    79
REGISTER_DECLARATION(XMMRegister, c_farg1, xmm1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    80
REGISTER_DECLARATION(XMMRegister, c_farg2, xmm2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    81
REGISTER_DECLARATION(XMMRegister, c_farg3, xmm3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    82
REGISTER_DECLARATION(XMMRegister, c_farg4, xmm4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    83
REGISTER_DECLARATION(XMMRegister, c_farg5, xmm5);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    84
REGISTER_DECLARATION(XMMRegister, c_farg6, xmm6);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    85
REGISTER_DECLARATION(XMMRegister, c_farg7, xmm7);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
#endif // _WIN64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
// Symbolically name the register arguments used by the Java calling convention.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
// We have control over the convention for java so we can do what we please.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
// What pleases us is to offset the java calling convention so that when
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
// we call a suitable jni method the arguments are lined up and we don't
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
// have to do little shuffling. A suitable jni method is non-static and a
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
// small number of arguments (two fewer args on windows)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
//        |-------------------------------------------------------|
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
//        | c_rarg0   c_rarg1  c_rarg2 c_rarg3 c_rarg4 c_rarg5    |
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
//        |-------------------------------------------------------|
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
//        | rcx       rdx      r8      r9      rdi*    rsi*       | windows (* not a c_rarg)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
//        | rdi       rsi      rdx     rcx     r8      r9         | solaris/linux
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
//        |-------------------------------------------------------|
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
//        | j_rarg5   j_rarg0  j_rarg1 j_rarg2 j_rarg3 j_rarg4    |
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
//        |-------------------------------------------------------|
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
REGISTER_DECLARATION(Register, j_rarg0, c_rarg1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
REGISTER_DECLARATION(Register, j_rarg1, c_rarg2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
REGISTER_DECLARATION(Register, j_rarg2, c_rarg3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
// Windows runs out of register args here
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
#ifdef _WIN64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
REGISTER_DECLARATION(Register, j_rarg3, rdi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
REGISTER_DECLARATION(Register, j_rarg4, rsi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
REGISTER_DECLARATION(Register, j_rarg3, c_rarg4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
REGISTER_DECLARATION(Register, j_rarg4, c_rarg5);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
#endif /* _WIN64 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
REGISTER_DECLARATION(Register, j_rarg5, c_rarg0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   118
REGISTER_DECLARATION(XMMRegister, j_farg0, xmm0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   119
REGISTER_DECLARATION(XMMRegister, j_farg1, xmm1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   120
REGISTER_DECLARATION(XMMRegister, j_farg2, xmm2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   121
REGISTER_DECLARATION(XMMRegister, j_farg3, xmm3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   122
REGISTER_DECLARATION(XMMRegister, j_farg4, xmm4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   123
REGISTER_DECLARATION(XMMRegister, j_farg5, xmm5);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   124
REGISTER_DECLARATION(XMMRegister, j_farg6, xmm6);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   125
REGISTER_DECLARATION(XMMRegister, j_farg7, xmm7);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
REGISTER_DECLARATION(Register, rscratch1, r10);  // volatile
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
REGISTER_DECLARATION(Register, rscratch2, r11);  // volatile
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   130
REGISTER_DECLARATION(Register, r12_heapbase, r12); // callee-saved
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
REGISTER_DECLARATION(Register, r15_thread, r15); // callee-saved
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   133
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   134
// rscratch1 will apear in 32bit code that is dead but of course must compile
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   135
// Using noreg ensures if the dead code is incorrectly live and executed it
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   136
// will cause an assertion failure
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   137
#define rscratch1 noreg
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   138
#define rscratch2 noreg
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   139
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
#endif // _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
5687
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5416
diff changeset
   142
// JSR 292 fixed register usages:
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5416
diff changeset
   143
REGISTER_DECLARATION(Register, rbp_mh_SP_save, rbp);
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5416
diff changeset
   144
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
// Address is an abstraction used to represent a memory location
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
// using any of the amd64 addressing modes with one object.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
// Note: A register location is represented via a Register, not
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
//       via an address for efficiency & simplicity reasons.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
class ArrayAddress;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
class Address VALUE_OBJ_CLASS_SPEC {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  enum ScaleFactor {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
    no_scale = -1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    times_1  =  0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
    times_2  =  1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
    times_4  =  2,
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   160
    times_8  =  3,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   161
    times_ptr = LP64_ONLY(times_8) NOT_LP64(times_4)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  };
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   163
  static ScaleFactor times(int size) {
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   164
    assert(size >= 1 && size <= 8 && is_power_of_2(size), "bad scale size");
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   165
    if (size == 8)  return times_8;
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   166
    if (size == 4)  return times_4;
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   167
    if (size == 2)  return times_2;
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   168
    return times_1;
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   169
  }
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   170
  static int scale_size(ScaleFactor scale) {
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   171
    assert(scale != no_scale, "");
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   172
    assert(((1 << (int)times_1) == 1 &&
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   173
            (1 << (int)times_2) == 2 &&
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   174
            (1 << (int)times_4) == 4 &&
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   175
            (1 << (int)times_8) == 8), "");
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   176
    return (1 << (int)scale);
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   177
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  Register         _base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  Register         _index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  ScaleFactor      _scale;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  int              _disp;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  RelocationHolder _rspec;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   186
  // Easily misused constructors make them private
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   187
  // %%% can we make these go away?
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   188
  NOT_LP64(Address(address loc, RelocationHolder spec);)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   189
  Address(int disp, address loc, relocInfo::relocType rtype);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   190
  Address(int disp, address loc, RelocationHolder spec);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
 public:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   193
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   194
 int disp() { return _disp; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  Address()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
    : _base(noreg),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
      _index(noreg),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
      _scale(no_scale),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
      _disp(0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  // No default displacement otherwise Register can be implicitly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  // converted to 0(Register) which is quite a different animal.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  Address(Register base, int disp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
    : _base(base),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
      _index(noreg),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
      _scale(no_scale),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
      _disp(disp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  Address(Register base, Register index, ScaleFactor scale, int disp = 0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
    : _base (base),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
      _index(index),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
      _scale(scale),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
      _disp (disp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
    assert(!index->is_valid() == (scale == Address::no_scale),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
           "inconsistent address");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2256
diff changeset
   222
  Address(Register base, RegisterOrConstant index, ScaleFactor scale = times_1, int disp = 0)
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   223
    : _base (base),
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   224
      _index(index.register_or_noreg()),
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   225
      _scale(scale),
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   226
      _disp (disp + (index.constant_or_zero() * scale_size(scale))) {
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   227
    if (!index.is_register())  scale = Address::no_scale;
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   228
    assert(!_index->is_valid() == (scale == Address::no_scale),
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   229
           "inconsistent address");
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   230
  }
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   231
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   232
  Address plus_disp(int disp) const {
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   233
    Address a = (*this);
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   234
    a._disp += disp;
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   235
    return a;
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   236
  }
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   237
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  // The following two overloads are used in connection with the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  // ByteSize type (see sizes.hpp).  They simplify the use of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  // ByteSize'd arguments in assembly code. Note that their equivalent
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  // for the optimized build are the member functions with int disp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  // argument since ByteSize is mapped to an int type in that case.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  // Note: DO NOT introduce similar overloaded functions for WordSize
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  // arguments as in the optimized mode, both ByteSize and WordSize
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  // are mapped to the same type and thus the compiler cannot make a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  // distinction anymore (=> compiler errors).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  Address(Register base, ByteSize disp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
    : _base(base),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
      _index(noreg),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
      _scale(no_scale),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
      _disp(in_bytes(disp)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  Address(Register base, Register index, ScaleFactor scale, ByteSize disp)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    : _base(base),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
      _index(index),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
      _scale(scale),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
      _disp(in_bytes(disp)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
    assert(!index->is_valid() == (scale == Address::no_scale),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
           "inconsistent address");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  }
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   265
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2256
diff changeset
   266
  Address(Register base, RegisterOrConstant index, ScaleFactor scale, ByteSize disp)
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   267
    : _base (base),
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   268
      _index(index.register_or_noreg()),
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   269
      _scale(scale),
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   270
      _disp (in_bytes(disp) + (index.constant_or_zero() * scale_size(scale))) {
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   271
    if (!index.is_register())  scale = Address::no_scale;
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   272
    assert(!_index->is_valid() == (scale == Address::no_scale),
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   273
           "inconsistent address");
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   274
  }
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
   275
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
#endif // ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  // accessors
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 244
diff changeset
   279
  bool        uses(Register reg) const { return _base == reg || _index == reg; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 244
diff changeset
   280
  Register    base()             const { return _base;  }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 244
diff changeset
   281
  Register    index()            const { return _index; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 244
diff changeset
   282
  ScaleFactor scale()            const { return _scale; }
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 244
diff changeset
   283
  int         disp()             const { return _disp;  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  // Convert the raw encoding form into the form expected by the constructor for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  // Address.  An index of 4 (rsp) corresponds to having no index, so convert
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  // that to noreg for the Address constructor.
2150
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
   288
  static Address make_raw(int base, int index, int scale, int disp, bool disp_is_oop);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  static Address make_array(ArrayAddress);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  bool base_needs_rex() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
    return _base != noreg && _base->encoding() >= 8;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  bool index_needs_rex() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
    return _index != noreg &&_index->encoding() >= 8;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  relocInfo::relocType reloc() const { return _rspec.type(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  friend class Assembler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  friend class MacroAssembler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  friend class LIR_Assembler; // base/index/scale/disp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
// AddressLiteral has been split out from Address because operands of this type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
// need to be treated specially on 32bit vs. 64bit platforms. By splitting it out
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
// the few instructions that need to deal with address literals are unique and the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
// MacroAssembler does not have to implement every instruction in the Assembler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
// in order to search for address literals that may need special handling depending
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
// on the instruction and the platform. As small step on the way to merging i486/amd64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
// directories.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
class AddressLiteral VALUE_OBJ_CLASS_SPEC {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  friend class ArrayAddress;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  RelocationHolder _rspec;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  // Typically we use AddressLiterals we want to use their rval
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  // However in some situations we want the lval (effect address) of the item.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  // We provide a special factory for making those lvals.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  bool _is_lval;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  // If the target is far we'll need to load the ea of this to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  // a register to reach it. Otherwise if near we can do rip
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  // relative addressing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  address          _target;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  // creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  AddressLiteral()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    : _is_lval(false),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
      _target(NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  AddressLiteral(address target, relocInfo::relocType rtype);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  AddressLiteral(address target, RelocationHolder const& rspec)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
    : _rspec(rspec),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
      _is_lval(false),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
      _target(target)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  AddressLiteral addr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
    AddressLiteral ret = *this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
    ret._is_lval = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
    return ret;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  address target() { return _target; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  bool is_lval() { return _is_lval; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  relocInfo::relocType reloc() const { return _rspec.type(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
  const RelocationHolder& rspec() const { return _rspec; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  friend class Assembler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  friend class MacroAssembler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  friend class Address;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  friend class LIR_Assembler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
// Convience classes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
class RuntimeAddress: public AddressLiteral {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  RuntimeAddress(address target) : AddressLiteral(target, relocInfo::runtime_call_type) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
class OopAddress: public AddressLiteral {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  OopAddress(address target) : AddressLiteral(target, relocInfo::oop_type){}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
class ExternalAddress: public AddressLiteral {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  ExternalAddress(address target) : AddressLiteral(target, relocInfo::external_word_type){}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
class InternalAddress: public AddressLiteral {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  InternalAddress(address target) : AddressLiteral(target, relocInfo::internal_word_type) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
// x86 can do array addressing as a single operation since disp can be an absolute
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
// address amd64 can't. We create a class that expresses the concept but does extra
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
// magic on amd64 to get the final result
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
class ArrayAddress VALUE_OBJ_CLASS_SPEC {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  AddressLiteral _base;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  Address        _index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  ArrayAddress() {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  ArrayAddress(AddressLiteral base, Address index): _base(base), _index(index) {};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  AddressLiteral base() { return _base; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  Address index() { return _index; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   422
const int FPUStateSizeInWords = NOT_LP64(27) LP64_ONLY( 512 / wordSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
// The Intel x86/Amd64 Assembler: Pure assembler doing NO optimizations on the instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
// level (e.g. mov rax, 0 is not translated into xor rax, rax!); i.e., what you write
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
// is what you get. The Assembler is generating code into a CodeBuffer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
class Assembler : public AbstractAssembler  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  friend class AbstractAssembler; // for the non-virtual hack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  friend class LIR_Assembler; // as_Address()
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   431
  friend class StubGenerator;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  enum Condition {                     // The x86 condition codes used for conditional jumps/moves.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
    zero          = 0x4,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
    notZero       = 0x5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
    equal         = 0x4,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
    notEqual      = 0x5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
    less          = 0xc,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
    lessEqual     = 0xe,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
    greater       = 0xf,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
    greaterEqual  = 0xd,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
    below         = 0x2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
    belowEqual    = 0x6,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
    above         = 0x7,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
    aboveEqual    = 0x3,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
    overflow      = 0x0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
    noOverflow    = 0x1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
    carrySet      = 0x2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
    carryClear    = 0x3,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
    negative      = 0x8,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
    positive      = 0x9,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
    parity        = 0xa,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
    noParity      = 0xb
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  enum Prefix {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
    // segment overrides
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
    CS_segment = 0x2e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
    SS_segment = 0x36,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
    DS_segment = 0x3e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
    ES_segment = 0x26,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
    FS_segment = 0x64,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
    GS_segment = 0x65,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
    REX        = 0x40,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
    REX_B      = 0x41,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
    REX_X      = 0x42,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
    REX_XB     = 0x43,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
    REX_R      = 0x44,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
    REX_RB     = 0x45,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
    REX_RX     = 0x46,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
    REX_RXB    = 0x47,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
    REX_W      = 0x48,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
    REX_WB     = 0x49,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
    REX_WX     = 0x4A,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
    REX_WXB    = 0x4B,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
    REX_WR     = 0x4C,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
    REX_WRB    = 0x4D,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
    REX_WRX    = 0x4E,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
    REX_WRXB   = 0x4F
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  enum WhichOperand {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
    // input to locate_operand, and format code for relocations
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   489
    imm_operand  = 0,            // embedded 32-bit|64-bit immediate operand
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
    disp32_operand = 1,          // embedded 32-bit displacement or address
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
    call32_operand = 2,          // embedded 32-bit self-relative displacement
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   492
#ifndef _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
    _WhichOperand_limit = 3
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   494
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   495
     narrow_oop_operand = 3,     // embedded 32-bit immediate narrow oop
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   496
    _WhichOperand_limit = 4
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   497
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   500
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   501
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   502
  // NOTE: The general philopsophy of the declarations here is that 64bit versions
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   503
  // of instructions are freely declared without the need for wrapping them an ifdef.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   504
  // (Some dangerous instructions are ifdef's out of inappropriate jvm's.)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   505
  // In the .cpp file the implementations are wrapped so that they are dropped out
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   506
  // of the resulting jvm. This is done mostly to keep the footprint of KERNEL
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   507
  // to the size it was prior to merging up the 32bit and 64bit assemblers.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   508
  //
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   509
  // This does mean you'll get a linker/runtime error if you use a 64bit only instruction
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   510
  // in a 32bit vm. This is somewhat unfortunate but keeps the ifdef noise down.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   511
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   512
private:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   513
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   514
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   515
  // 64bit prefixes
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   516
  int prefix_and_encode(int reg_enc, bool byteinst = false);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   517
  int prefixq_and_encode(int reg_enc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   518
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   519
  int prefix_and_encode(int dst_enc, int src_enc, bool byteinst = false);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   520
  int prefixq_and_encode(int dst_enc, int src_enc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   521
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   522
  void prefix(Register reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   523
  void prefix(Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   524
  void prefixq(Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   525
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   526
  void prefix(Address adr, Register reg,  bool byteinst = false);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   527
  void prefixq(Address adr, Register reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   528
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   529
  void prefix(Address adr, XMMRegister reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   530
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   531
  void prefetch_prefix(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   532
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   533
  // Helper functions for groups of instructions
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   534
  void emit_arith_b(int op1, int op2, Register dst, int imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   535
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   536
  void emit_arith(int op1, int op2, Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   537
  // only 32bit??
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   538
  void emit_arith(int op1, int op2, Register dst, jobject obj);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   539
  void emit_arith(int op1, int op2, Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   540
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   541
  void emit_operand(Register reg,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   542
                    Register base, Register index, Address::ScaleFactor scale,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   543
                    int disp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   544
                    RelocationHolder const& rspec,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   545
                    int rip_relative_correction = 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   546
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   547
  void emit_operand(Register reg, Address adr, int rip_relative_correction = 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   548
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   549
  // operands that only take the original 32bit registers
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   550
  void emit_operand32(Register reg, Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   551
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   552
  void emit_operand(XMMRegister reg,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   553
                    Register base, Register index, Address::ScaleFactor scale,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   554
                    int disp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   555
                    RelocationHolder const& rspec);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   556
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   557
  void emit_operand(XMMRegister reg, Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   558
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   559
  void emit_operand(MMXRegister reg, Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   560
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   561
  // workaround gcc (3.2.1-7) bug
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   562
  void emit_operand(Address adr, MMXRegister reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   563
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   564
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   565
  // Immediate-to-memory forms
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   566
  void emit_arith_operand(int op1, Register rm, Address adr, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   567
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   568
  void emit_farith(int b1, int b2, int i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   569
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   570
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   571
 protected:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   572
  #ifdef ASSERT
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   573
  void check_relocation(RelocationHolder const& rspec, int format);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   574
  #endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   575
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   576
  inline void emit_long64(jlong x);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   577
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   578
  void emit_data(jint data, relocInfo::relocType    rtype, int format);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   579
  void emit_data(jint data, RelocationHolder const& rspec, int format);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   580
  void emit_data64(jlong data, relocInfo::relocType rtype, int format = 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   581
  void emit_data64(jlong data, RelocationHolder const& rspec, int format = 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   582
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   583
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   584
  bool reachable(AddressLiteral adr) NOT_LP64({ return true;});
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   585
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   586
  // These are all easily abused and hence protected
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   587
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   588
  // 32BIT ONLY SECTION
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   589
#ifndef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   590
  // Make these disappear in 64bit mode since they would never be correct
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   591
  void cmp_literal32(Register src1, int32_t imm32, RelocationHolder const& rspec);   // 32BIT ONLY
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   592
  void cmp_literal32(Address src1, int32_t imm32, RelocationHolder const& rspec);    // 32BIT ONLY
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   593
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
   594
  void mov_literal32(Register dst, int32_t imm32, RelocationHolder const& rspec);    // 32BIT ONLY
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   595
  void mov_literal32(Address dst, int32_t imm32, RelocationHolder const& rspec);     // 32BIT ONLY
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   596
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   597
  void push_literal32(int32_t imm32, RelocationHolder const& rspec);                 // 32BIT ONLY
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   598
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   599
  // 64BIT ONLY SECTION
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   600
  void mov_literal64(Register dst, intptr_t imm64, RelocationHolder const& rspec);   // 64BIT ONLY
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
   601
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
   602
  void cmp_narrow_oop(Register src1, int32_t imm32, RelocationHolder const& rspec);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
   603
  void cmp_narrow_oop(Address src1, int32_t imm32, RelocationHolder const& rspec);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
   604
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
   605
  void mov_narrow_oop(Register dst, int32_t imm32, RelocationHolder const& rspec);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
   606
  void mov_narrow_oop(Address dst, int32_t imm32, RelocationHolder const& rspec);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   607
#endif // _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   608
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   609
  // These are unique in that we are ensured by the caller that the 32bit
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   610
  // relative in these instructions will always be able to reach the potentially
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   611
  // 64bit address described by entry. Since they can take a 64bit address they
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   612
  // don't have the 32 suffix like the other instructions in this class.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   613
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   614
  void call_literal(address entry, RelocationHolder const& rspec);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   615
  void jmp_literal(address entry, RelocationHolder const& rspec);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   616
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   617
  // Avoid using directly section
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   618
  // Instructions in this section are actually usable by anyone without danger
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   619
  // of failure but have performance issues that are addressed my enhanced
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   620
  // instructions which will do the proper thing base on the particular cpu.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   621
  // We protect them because we don't trust you...
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   622
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   623
  // Don't use next inc() and dec() methods directly. INC & DEC instructions
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   624
  // could cause a partial flag stall since they don't set CF flag.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   625
  // Use MacroAssembler::decrement() & MacroAssembler::increment() methods
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   626
  // which call inc() & dec() or add() & sub() in accordance with
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   627
  // the product flag UseIncDec value.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   628
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   629
  void decl(Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   630
  void decl(Address dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   631
  void decq(Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   632
  void decq(Address dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   633
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   634
  void incl(Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   635
  void incl(Address dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   636
  void incq(Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   637
  void incq(Address dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   638
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   639
  // New cpus require use of movsd and movss to avoid partial register stall
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   640
  // when loading from memory. But for old Opteron use movlpd instead of movsd.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   641
  // The selection is done in MacroAssembler::movdbl() and movflt().
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   642
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   643
  // Move Scalar Single-Precision Floating-Point Values
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   644
  void movss(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   645
  void movss(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   646
  void movss(Address dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   647
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   648
  // Move Scalar Double-Precision Floating-Point Values
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   649
  void movsd(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   650
  void movsd(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   651
  void movsd(Address dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   652
  void movlpd(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   653
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   654
  // New cpus require use of movaps and movapd to avoid partial register stall
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   655
  // when moving between registers.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   656
  void movaps(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   657
  void movapd(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   658
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   659
  // End avoid using directly
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   660
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   661
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   662
  // Instruction prefixes
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   663
  void prefix(Prefix p);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   664
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
  public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  // Creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
  Assembler(CodeBuffer* code) : AbstractAssembler(code) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
  // Decoding
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  static address locate_operand(address inst, WhichOperand which);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
  static address locate_next_instruction(address inst);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   674
  // Utilities
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   675
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   676
#ifdef _LP64
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
   677
 static bool is_simm(int64_t x, int nbits) { return -(CONST64(1) << (nbits-1)) <= x &&
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
   678
                                                    x < (CONST64(1) << (nbits-1)); }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   679
 static bool is_simm32(int64_t x) { return x == (int64_t)(int32_t)x; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   680
#else
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
   681
 static bool is_simm(int32_t x, int nbits) { return -(1 << (nbits-1)) <= x &&
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
   682
                                                    x < (1 << (nbits-1)); }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   683
 static bool is_simm32(int32_t x) { return true; }
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
   684
#endif // _LP64
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   685
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   686
  // Generic instructions
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   687
  // Does 32bit or 64bit as needed for the platform. In some sense these
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   688
  // belong in macro assembler but there is no need for both varieties to exist
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   689
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   690
  void lea(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   691
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   692
  void mov(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   693
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   694
  void pusha();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   695
  void popa();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   696
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   697
  void pushf();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   698
  void popf();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   699
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   700
  void push(int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   701
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   702
  void push(Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   703
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   704
  void pop(Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   705
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   706
  // These are dummies to prevent surprise implicit conversions to Register
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   707
  void push(void* v);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   708
  void pop(void* v);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   709
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   710
  // These do register sized moves/scans
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   711
  void rep_mov();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   712
  void rep_set();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   713
  void repne_scan();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   714
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   715
  void repne_scanl();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   716
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   717
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   718
  // Vanilla instructions in lexical order
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   719
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
   720
  void adcl(Address dst, int32_t imm32);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
   721
  void adcl(Address dst, Register src);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   722
  void adcl(Register dst, int32_t imm32);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
  void adcl(Register dst, Address src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
  void adcl(Register dst, Register src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   726
  void adcq(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   727
  void adcq(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   728
  void adcq(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   729
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   730
  void addl(Address dst, int32_t imm32);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
  void addl(Address dst, Register src);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   732
  void addl(Register dst, int32_t imm32);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
  void addl(Register dst, Address src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
  void addl(Register dst, Register src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   736
  void addq(Address dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   737
  void addq(Address dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   738
  void addq(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   739
  void addq(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   740
  void addq(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   741
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
  void addr_nop_4();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
  void addr_nop_5();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
  void addr_nop_7();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
  void addr_nop_8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   747
  // Add Scalar Double-Precision Floating-Point Values
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   748
  void addsd(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   749
  void addsd(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   750
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   751
  // Add Scalar Single-Precision Floating-Point Values
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   752
  void addss(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   753
  void addss(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   754
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   755
  void andl(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   756
  void andl(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   757
  void andl(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   758
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   759
  void andq(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   760
  void andq(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   761
  void andq(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   762
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   763
  // Bitwise Logical AND of Packed Double-Precision Floating-Point Values
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   764
  void andpd(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   765
  void andpd(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   766
2862
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   767
  void bsfl(Register dst, Register src);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   768
  void bsrl(Register dst, Register src);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   769
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   770
#ifdef _LP64
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   771
  void bsfq(Register dst, Register src);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   772
  void bsrq(Register dst, Register src);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   773
#endif
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   774
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   775
  void bswapl(Register reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   776
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   777
  void bswapq(Register reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   778
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  void call(Label& L, relocInfo::relocType rtype);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  void call(Register reg);  // push pc; pc <- reg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  void call(Address adr);   // push pc; pc <- adr
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   783
  void cdql();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   784
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   785
  void cdqq();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   786
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   787
  void cld() { emit_byte(0xfc); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   788
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   789
  void clflush(Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   790
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   791
  void cmovl(Condition cc, Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   792
  void cmovl(Condition cc, Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   793
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   794
  void cmovq(Condition cc, Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   795
  void cmovq(Condition cc, Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   796
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   797
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   798
  void cmpb(Address dst, int imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   799
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   800
  void cmpl(Address dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   801
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   802
  void cmpl(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   803
  void cmpl(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   804
  void cmpl(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   805
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   806
  void cmpq(Address dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   807
  void cmpq(Address dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   808
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   809
  void cmpq(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   810
  void cmpq(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   811
  void cmpq(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   812
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   813
  // these are dummies used to catch attempting to convert NULL to Register
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   814
  void cmpl(Register dst, void* junk); // dummy
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   815
  void cmpq(Register dst, void* junk); // dummy
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   816
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   817
  void cmpw(Address dst, int imm16);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   818
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   819
  void cmpxchg8 (Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   820
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   821
  void cmpxchgl(Register reg, Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   822
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   823
  void cmpxchgq(Register reg, Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   824
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   825
  // Ordered Compare Scalar Double-Precision Floating-Point Values and set EFLAGS
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   826
  void comisd(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   827
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   828
  // Ordered Compare Scalar Single-Precision Floating-Point Values and set EFLAGS
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   829
  void comiss(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   830
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   831
  // Identify processor type and features
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   832
  void cpuid() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   833
    emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   834
    emit_byte(0xA2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   835
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   836
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   837
  // Convert Scalar Double-Precision Floating-Point Value to Scalar Single-Precision Floating-Point Value
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   838
  void cvtsd2ss(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   839
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   840
  // Convert Doubleword Integer to Scalar Double-Precision Floating-Point Value
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   841
  void cvtsi2sdl(XMMRegister dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   842
  void cvtsi2sdq(XMMRegister dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   843
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   844
  // Convert Doubleword Integer to Scalar Single-Precision Floating-Point Value
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   845
  void cvtsi2ssl(XMMRegister dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   846
  void cvtsi2ssq(XMMRegister dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   847
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   848
  // Convert Packed Signed Doubleword Integers to Packed Double-Precision Floating-Point Value
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   849
  void cvtdq2pd(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   850
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   851
  // Convert Packed Signed Doubleword Integers to Packed Single-Precision Floating-Point Value
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   852
  void cvtdq2ps(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   853
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   854
  // Convert Scalar Single-Precision Floating-Point Value to Scalar Double-Precision Floating-Point Value
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   855
  void cvtss2sd(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   856
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   857
  // Convert with Truncation Scalar Double-Precision Floating-Point Value to Doubleword Integer
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   858
  void cvttsd2sil(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   859
  void cvttsd2sil(Register dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   860
  void cvttsd2siq(Register dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   861
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   862
  // Convert with Truncation Scalar Single-Precision Floating-Point Value to Doubleword Integer
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   863
  void cvttss2sil(Register dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   864
  void cvttss2siq(Register dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   865
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   866
  // Divide Scalar Double-Precision Floating-Point Values
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   867
  void divsd(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   868
  void divsd(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   869
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   870
  // Divide Scalar Single-Precision Floating-Point Values
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   871
  void divss(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   872
  void divss(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   873
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   874
  void emms();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   875
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   876
  void fabs();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   877
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   878
  void fadd(int i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   879
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   880
  void fadd_d(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   881
  void fadd_s(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   882
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   883
  // "Alternate" versions of x87 instructions place result down in FPU
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   884
  // stack instead of on TOS
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   885
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   886
  void fadda(int i); // "alternate" fadd
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   887
  void faddp(int i = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   888
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   889
  void fchs();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   890
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   891
  void fcom(int i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   892
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   893
  void fcomp(int i = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   894
  void fcomp_d(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   895
  void fcomp_s(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   896
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   897
  void fcompp();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   898
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   899
  void fcos();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   900
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   901
  void fdecstp();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   902
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   903
  void fdiv(int i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   904
  void fdiv_d(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   905
  void fdivr_s(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   906
  void fdiva(int i);  // "alternate" fdiv
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   907
  void fdivp(int i = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   908
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   909
  void fdivr(int i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   910
  void fdivr_d(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   911
  void fdiv_s(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   912
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   913
  void fdivra(int i); // "alternate" reversed fdiv
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   914
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   915
  void fdivrp(int i = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   916
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   917
  void ffree(int i = 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   918
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   919
  void fild_d(Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   920
  void fild_s(Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   921
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   922
  void fincstp();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   923
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   924
  void finit();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   925
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   926
  void fist_s (Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   927
  void fistp_d(Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   928
  void fistp_s(Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   929
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   930
  void fld1();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   931
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   932
  void fld_d(Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   933
  void fld_s(Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   934
  void fld_s(int index);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   935
  void fld_x(Address adr);  // extended-precision (80-bit) format
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   936
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   937
  void fldcw(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   938
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   939
  void fldenv(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   940
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   941
  void fldlg2();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   942
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   943
  void fldln2();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   944
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   945
  void fldz();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   946
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   947
  void flog();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   948
  void flog10();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   949
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   950
  void fmul(int i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   951
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   952
  void fmul_d(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   953
  void fmul_s(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   954
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   955
  void fmula(int i);  // "alternate" fmul
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   956
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   957
  void fmulp(int i = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   958
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   959
  void fnsave(Address dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   960
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   961
  void fnstcw(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   962
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   963
  void fnstsw_ax();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   964
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   965
  void fprem();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   966
  void fprem1();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   967
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   968
  void frstor(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   969
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   970
  void fsin();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   971
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   972
  void fsqrt();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   973
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   974
  void fst_d(Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   975
  void fst_s(Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   976
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   977
  void fstp_d(Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   978
  void fstp_d(int index);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   979
  void fstp_s(Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   980
  void fstp_x(Address adr); // extended-precision (80-bit) format
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   981
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   982
  void fsub(int i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   983
  void fsub_d(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   984
  void fsub_s(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   985
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   986
  void fsuba(int i);  // "alternate" fsub
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   987
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   988
  void fsubp(int i = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   989
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   990
  void fsubr(int i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   991
  void fsubr_d(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   992
  void fsubr_s(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   993
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   994
  void fsubra(int i); // "alternate" reversed fsub
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   995
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   996
  void fsubrp(int i = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   997
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   998
  void ftan();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   999
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1000
  void ftst();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1001
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1002
  void fucomi(int i = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1003
  void fucomip(int i = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1004
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1005
  void fwait();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1006
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1007
  void fxch(int i = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1008
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1009
  void fxrstor(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1010
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1011
  void fxsave(Address dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1012
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1013
  void fyl2x();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1014
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1015
  void hlt();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1016
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1017
  void idivl(Register src);
7121
69928525c55c 6997311: SIGFPE in new long division asm code
kvn
parents: 6772
diff changeset
  1018
  void divl(Register src); // Unsigned division
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1019
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1020
  void idivq(Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1021
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1022
  void imull(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1023
  void imull(Register dst, Register src, int value);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1024
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1025
  void imulq(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1026
  void imulq(Register dst, Register src, int value);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1027
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
  // jcc is the generic conditional branch generator to run-
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
  // time routines, jcc is used for branches to labels. jcc
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
  // takes a branch opcode (cc) and a label (L) and generates
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
  // either a backward branch or a forward branch and links it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
  // to the label fixup chain. Usage:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
  // Label L;      // unbound label
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
  // jcc(cc, L);   // forward branch to unbound label
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
  // bind(L);      // bind label to the current pc
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
  // jcc(cc, L);   // backward branch to bound label
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
  // bind(L);      // illegal: a label may be bound only once
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
  // Note: The same Label can be used for forward and backward branches
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
  // but it may be bound only once.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
  void jcc(Condition cc, Label& L,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
           relocInfo::relocType rtype = relocInfo::none);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
  // Conditional jump to a 8-bit offset to L.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
  // WARNING: be very careful using this for forward jumps.  If the label is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
  // not bound within an 8-bit offset of this instruction, a run-time error
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
  // will occur.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
  void jccb(Condition cc, Label& L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1053
  void jmp(Address entry);    // pc <- entry
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1054
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1055
  // Label operations & relative jumps (PPUM Appendix D)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1056
  void jmp(Label& L, relocInfo::relocType rtype = relocInfo::none);   // unconditional jump to L
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1057
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1058
  void jmp(Register entry); // pc <- entry
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1059
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1060
  // Unconditional 8-bit offset jump to L.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1061
  // WARNING: be very careful using this for forward jumps.  If the label is
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1062
  // not bound within an 8-bit offset of this instruction, a run-time error
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1063
  // will occur.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1064
  void jmpb(Label& L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1065
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1066
  void ldmxcsr( Address src );
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1067
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1068
  void leal(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1069
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1070
  void leaq(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1071
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1072
  void lfence() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1073
    emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1074
    emit_byte(0xAE);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1075
    emit_byte(0xE8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1076
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1077
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1078
  void lock();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1079
2862
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  1080
  void lzcntl(Register dst, Register src);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  1081
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  1082
#ifdef _LP64
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  1083
  void lzcntq(Register dst, Register src);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  1084
#endif
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  1085
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1086
  enum Membar_mask_bits {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1087
    StoreStore = 1 << 3,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1088
    LoadStore  = 1 << 2,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1089
    StoreLoad  = 1 << 1,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1090
    LoadLoad   = 1 << 0
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1091
  };
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1092
2338
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1093
  // Serializes memory and blows flags
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1094
  void membar(Membar_mask_bits order_constraint) {
2338
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1095
    if (os::is_MP()) {
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1096
      // We only have to handle StoreLoad
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1097
      if (order_constraint & StoreLoad) {
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1098
        // All usable chips support "locked" instructions which suffice
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1099
        // as barriers, and are much faster than the alternative of
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1100
        // using cpuid instruction. We use here a locked add [esp],0.
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1101
        // This is conveniently otherwise a no-op except for blowing
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1102
        // flags.
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1103
        // Any change to this code may need to revisit other places in
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1104
        // the code where this idiom is used, in particular the
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1105
        // orderAccess code.
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1106
        lock();
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1107
        addl(Address(rsp, 0), 0);// Assert the lock# signal here
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1108
      }
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1109
    }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1110
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1111
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1112
  void mfence();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1113
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1114
  // Moves
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1115
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1116
  void mov64(Register dst, int64_t imm64);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1117
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1118
  void movb(Address dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1119
  void movb(Address dst, int imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1120
  void movb(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1121
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1122
  void movdl(XMMRegister dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1123
  void movdl(Register dst, XMMRegister src);
8494
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1124
  void movdl(XMMRegister dst, Address src);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1125
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1126
  // Move Double Quadword
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1127
  void movdq(XMMRegister dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1128
  void movdq(Register dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1129
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1130
  // Move Aligned Double Quadword
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1131
  void movdqa(Address     dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1132
  void movdqa(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1133
  void movdqa(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1134
1437
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1135
  // Move Unaligned Double Quadword
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1136
  void movdqu(Address     dst, XMMRegister src);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1137
  void movdqu(XMMRegister dst, Address src);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1138
  void movdqu(XMMRegister dst, XMMRegister src);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1139
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1140
  void movl(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1141
  void movl(Address dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1142
  void movl(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1143
  void movl(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1144
  void movl(Address dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1145
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1146
  // These dummies prevent using movl from converting a zero (like NULL) into Register
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1147
  // by giving the compiler two choices it can't resolve
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1148
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1149
  void movl(Address  dst, void* junk);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1150
  void movl(Register dst, void* junk);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1151
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1152
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1153
  void movq(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1154
  void movq(Register dst, Address src);
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
  1155
  void movq(Address  dst, Register src);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1156
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1157
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1158
  void movq(Address     dst, MMXRegister src );
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1159
  void movq(MMXRegister dst, Address src );
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1160
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1161
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1162
  // These dummies prevent using movq from converting a zero (like NULL) into Register
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1163
  // by giving the compiler two choices it can't resolve
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1164
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1165
  void movq(Address  dst, void* dummy);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1166
  void movq(Register dst, void* dummy);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1167
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1168
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1169
  // Move Quadword
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1170
  void movq(Address     dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1171
  void movq(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1172
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1173
  void movsbl(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1174
  void movsbl(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1175
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1176
#ifdef _LP64
2150
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1177
  void movsbq(Register dst, Address src);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1178
  void movsbq(Register dst, Register src);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1179
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1180
  // Move signed 32bit immediate to 64bit extending sign
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
  1181
  void movslq(Address  dst, int32_t imm64);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1182
  void movslq(Register dst, int32_t imm64);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1183
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1184
  void movslq(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1185
  void movslq(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1186
  void movslq(Register dst, void* src); // Dummy declaration to cause NULL to be ambiguous
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1187
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1188
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1189
  void movswl(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1190
  void movswl(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1191
2150
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1192
#ifdef _LP64
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1193
  void movswq(Register dst, Address src);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1194
  void movswq(Register dst, Register src);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1195
#endif
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1196
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1197
  void movw(Address dst, int imm16);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1198
  void movw(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1199
  void movw(Address dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1200
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1201
  void movzbl(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1202
  void movzbl(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1203
2150
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1204
#ifdef _LP64
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1205
  void movzbq(Register dst, Address src);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1206
  void movzbq(Register dst, Register src);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1207
#endif
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1208
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1209
  void movzwl(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1210
  void movzwl(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1211
2150
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1212
#ifdef _LP64
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1213
  void movzwq(Register dst, Address src);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1214
  void movzwq(Register dst, Register src);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1215
#endif
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  1216
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1217
  void mull(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1218
  void mull(Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1219
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1220
  // Multiply Scalar Double-Precision Floating-Point Values
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1221
  void mulsd(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1222
  void mulsd(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1223
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1224
  // Multiply Scalar Single-Precision Floating-Point Values
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1225
  void mulss(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1226
  void mulss(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1227
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1228
  void negl(Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1229
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1230
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1231
  void negq(Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1232
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1233
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1234
  void nop(int i = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1235
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1236
  void notl(Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1237
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1238
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1239
  void notq(Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1240
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1241
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1242
  void orl(Address dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1243
  void orl(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1244
  void orl(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1245
  void orl(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1246
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1247
  void orq(Address dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1248
  void orq(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1249
  void orq(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1250
  void orq(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1251
2348
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  1252
  // SSE4.2 string instructions
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  1253
  void pcmpestri(XMMRegister xmm1, XMMRegister xmm2, int imm8);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  1254
  void pcmpestri(XMMRegister xmm1, Address src, int imm8);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  1255
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3905
diff changeset
  1256
#ifndef _LP64 // no 32bit push/pop on amd64
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1257
  void popl(Address dst);
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3905
diff changeset
  1258
#endif
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1259
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1260
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1261
  void popq(Address dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1262
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1263
2255
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  1264
  void popcntl(Register dst, Address src);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  1265
  void popcntl(Register dst, Register src);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  1266
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  1267
#ifdef _LP64
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  1268
  void popcntq(Register dst, Address src);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  1269
  void popcntq(Register dst, Register src);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  1270
#endif
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  1271
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1272
  // Prefetches (SSE, SSE2, 3DNOW only)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1273
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1274
  void prefetchnta(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1275
  void prefetchr(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1276
  void prefetcht0(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1277
  void prefetcht1(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1278
  void prefetcht2(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1279
  void prefetchw(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1280
8332
3320859e937a 7016474: string compare intrinsic improvements
never
parents: 8328
diff changeset
  1281
  // POR - Bitwise logical OR
3320859e937a 7016474: string compare intrinsic improvements
never
parents: 8328
diff changeset
  1282
  void por(XMMRegister dst, XMMRegister src);
3320859e937a 7016474: string compare intrinsic improvements
never
parents: 8328
diff changeset
  1283
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1284
  // Shuffle Packed Doublewords
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1285
  void pshufd(XMMRegister dst, XMMRegister src, int mode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1286
  void pshufd(XMMRegister dst, Address src,     int mode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1287
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1288
  // Shuffle Packed Low Words
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1289
  void pshuflw(XMMRegister dst, XMMRegister src, int mode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1290
  void pshuflw(XMMRegister dst, Address src,     int mode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1291
8494
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1292
  // Shift Right by bits Logical Quadword Immediate
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1293
  void psrlq(XMMRegister dst, int shift);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1294
8494
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1295
  // Shift Right by bytes Logical DoubleQuadword Immediate
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1296
  void psrldq(XMMRegister dst, int shift);
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1297
2348
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  1298
  // Logical Compare Double Quadword
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  1299
  void ptest(XMMRegister dst, XMMRegister src);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  1300
  void ptest(XMMRegister dst, Address src);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  1301
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1302
  // Interleave Low Bytes
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1303
  void punpcklbw(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1304
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3905
diff changeset
  1305
#ifndef _LP64 // no 32bit push/pop on amd64
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1306
  void pushl(Address src);
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3905
diff changeset
  1307
#endif
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1308
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1309
  void pushq(Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1310
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1311
  // Xor Packed Byte Integer Values
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1312
  void pxor(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1313
  void pxor(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1314
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1315
  void rcll(Register dst, int imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1316
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1317
  void rclq(Register dst, int imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1318
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1319
  void ret(int imm16);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
  void sahf();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1323
  void sarl(Register dst, int imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1324
  void sarl(Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1325
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1326
  void sarq(Register dst, int imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1327
  void sarq(Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1328
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1329
  void sbbl(Address dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1330
  void sbbl(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1331
  void sbbl(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1332
  void sbbl(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1333
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1334
  void sbbq(Address dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1335
  void sbbq(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1336
  void sbbq(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1337
  void sbbq(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1338
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1339
  void setb(Condition cc, Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1340
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1341
  void shldl(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1342
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1343
  void shll(Register dst, int imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1344
  void shll(Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1345
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1346
  void shlq(Register dst, int imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1347
  void shlq(Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1348
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1349
  void shrdl(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1350
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1351
  void shrl(Register dst, int imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1352
  void shrl(Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1353
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1354
  void shrq(Register dst, int imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1355
  void shrq(Register dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1356
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1357
  void smovl(); // QQQ generic?
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1358
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1359
  // Compute Square Root of Scalar Double-Precision Floating-Point Value
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1360
  void sqrtsd(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1361
  void sqrtsd(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1362
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  1363
  // Compute Square Root of Scalar Single-Precision Floating-Point Value
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  1364
  void sqrtss(XMMRegister dst, Address src);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  1365
  void sqrtss(XMMRegister dst, XMMRegister src);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  1366
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1367
  void std() { emit_byte(0xfd); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1368
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1369
  void stmxcsr( Address dst );
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1370
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1371
  void subl(Address dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1372
  void subl(Address dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1373
  void subl(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1374
  void subl(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1375
  void subl(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1376
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1377
  void subq(Address dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1378
  void subq(Address dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1379
  void subq(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1380
  void subq(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1381
  void subq(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1382
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1383
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1384
  // Subtract Scalar Double-Precision Floating-Point Values
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1385
  void subsd(XMMRegister dst, Address src);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
  void subsd(XMMRegister dst, XMMRegister src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1388
  // Subtract Scalar Single-Precision Floating-Point Values
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1389
  void subss(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1390
  void subss(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1391
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1392
  void testb(Register dst, int imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1393
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1394
  void testl(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1395
  void testl(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1396
  void testl(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1397
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1398
  void testq(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1399
  void testq(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1400
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1401
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1402
  // Unordered Compare Scalar Double-Precision Floating-Point Values and set EFLAGS
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1403
  void ucomisd(XMMRegister dst, Address src);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
  void ucomisd(XMMRegister dst, XMMRegister src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1406
  // Unordered Compare Scalar Single-Precision Floating-Point Values and set EFLAGS
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1407
  void ucomiss(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1408
  void ucomiss(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1409
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1410
  void xaddl(Address dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1411
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1412
  void xaddq(Address dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1413
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1414
  void xchgl(Register reg, Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1415
  void xchgl(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1416
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1417
  void xchgq(Register reg, Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1418
  void xchgq(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1419
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1420
  void xorl(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1421
  void xorl(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1422
  void xorl(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1423
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1424
  void xorq(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1425
  void xorq(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1426
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1427
  // Bitwise Logical XOR of Packed Double-Precision Floating-Point Values
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1428
  void xorpd(XMMRegister dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1429
  void xorpd(XMMRegister dst, XMMRegister src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1430
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1431
  // Bitwise Logical XOR of Packed Single-Precision Floating-Point Values
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1432
  void xorps(XMMRegister dst, Address src);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
  void xorps(XMMRegister dst, XMMRegister src);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1434
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1435
  void set_byte_if_not_zero(Register dst); // sets reg to 1 if not zero, otherwise 0
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1436
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
// MacroAssembler extends Assembler by frequently used macros.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
// Instructions for which a 'better' code sequence exists depending
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
// on arguments should also go in here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
class MacroAssembler: public Assembler {
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 244
diff changeset
  1445
  friend class LIR_Assembler;
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 244
diff changeset
  1446
  friend class Runtime1;      // as_Address()
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8494
diff changeset
  1447
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
  Address as_Address(AddressLiteral adr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
  Address as_Address(ArrayAddress adr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
  // Support for VM calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
  // This is the base routine called by the different versions of call_VM_leaf. The interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
  // may customize this version by overriding it for its purposes (e.g., to save/restore
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
  // additional registers when doing a VM call).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
#ifdef CC_INTERP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
  // c++ interpreter never wants to use interp_masm version of call_VM
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
  #define VIRTUAL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
  #define VIRTUAL virtual
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
  VIRTUAL void call_VM_leaf_base(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
    address entry_point,               // the entry point
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
    int     number_of_arguments        // the number of arguments to pop after the call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
  );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
  // This is the base routine called by the different versions of call_VM. The interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
  // may customize this version by overriding it for its purposes (e.g., to save/restore
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
  // additional registers when doing a VM call).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
  // If no java_thread register is specified (noreg) than rdi will be used instead. call_VM_base
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
  // returns the register which contains the thread upon return. If a thread register has been
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
  // specified, the return value will correspond to that register. If no last_java_sp is specified
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
  // (noreg) than rsp will be used instead.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
  VIRTUAL void call_VM_base(           // returns the register containing the thread upon return
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
    Register oop_result,               // where an oop-result ends up if any; use noreg otherwise
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
    Register java_thread,              // the thread if computed before     ; use noreg otherwise
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
    Register last_java_sp,             // to set up last_Java_frame in stubs; use noreg otherwise
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
    address  entry_point,              // the entry point
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
    int      number_of_arguments,      // the number of arguments (w/o thread) to pop after the call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
    bool     check_exceptions          // whether to check for pending exceptions after return
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
  );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
  // These routines should emit JVMTI PopFrame and ForceEarlyReturn handling code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
  // The implementation is only non-empty for the InterpreterMacroAssembler,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
  // as only the interpreter handles PopFrame and ForceEarlyReturn requests.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
  virtual void check_and_handle_popframe(Register java_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
  virtual void check_and_handle_earlyret(Register java_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
  void call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions = true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
  // helpers for FPU flag access
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
  // tmp is a temporary register, if none is available use noreg
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1497
  void save_rax   (Register tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
  void restore_rax(Register tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1500
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1501
  MacroAssembler(CodeBuffer* code) : Assembler(code) {}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1502
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
  // Support for NULL-checks
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1504
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1505
  // Generates code that causes a NULL OS exception if the content of reg is NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
  // If the accessed location is M[reg + offset] and the offset is known, provide the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
  // offset. No explicit code generation is needed if the offset is within a certain
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
  // range (0 <= offset <= page_size).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
  void null_check(Register reg, int offset = -1);
594
9f4474e5dbaf 6705887: Compressed Oops: generate x64 addressing and implicit null checks with narrow oops
kvn
parents: 244
diff changeset
  1511
  static bool needs_explicit_null_check(intptr_t offset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1512
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1513
  // Required platform-specific helpers for Label::patch_instructions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1514
  // They _shadow_ the declarations in AbstractAssembler, which are undefined.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
  void pd_patch_instruction(address branch, address target);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1516
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
  static void pd_print_patched_instruction(address branch);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1518
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
  // The following 4 methods return the offset of the appropriate move instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
  1522
  // Support for fast byte/short loading with zero extension (depending on particular CPU)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1523
  int load_unsigned_byte(Register dst, Address src);
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
  1524
  int load_unsigned_short(Register dst, Address src);
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
  1525
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
  1526
  // Support for fast byte/short loading with sign extension (depending on particular CPU)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1527
  int load_signed_byte(Register dst, Address src);
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
  1528
  int load_signed_short(Register dst, Address src);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1529
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
  // Support for sign-extension (hi:lo = extend_sign(lo))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
  void extend_sign(Register hi, Register lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1532
8328
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  1533
  // Load and store values by size and signed-ness
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  1534
  void load_sized_value(Register dst, Address src, size_t size_in_bytes, bool is_signed, Register dst2 = noreg);
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  1535
  void store_sized_value(Address dst, Register src, size_t size_in_bytes, Register src2 = noreg);
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
  1536
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1537
  // Support for inc/dec with optimal instruction selection depending on value
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1538
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1539
  void increment(Register reg, int value = 1) { LP64_ONLY(incrementq(reg, value)) NOT_LP64(incrementl(reg, value)) ; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1540
  void decrement(Register reg, int value = 1) { LP64_ONLY(decrementq(reg, value)) NOT_LP64(decrementl(reg, value)) ; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1541
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1542
  void decrementl(Address dst, int value = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1543
  void decrementl(Register reg, int value = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1544
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1545
  void decrementq(Register reg, int value = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1546
  void decrementq(Address dst, int value = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1547
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1548
  void incrementl(Address dst, int value = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1549
  void incrementl(Register reg, int value = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1550
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1551
  void incrementq(Register reg, int value = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1552
  void incrementq(Address dst, int value = 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1553
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1554
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1555
  // Support optimal SSE move instructions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1556
  void movflt(XMMRegister dst, XMMRegister src) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1557
    if (UseXmmRegToRegMoveAll) { movaps(dst, src); return; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1558
    else                       { movss (dst, src); return; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1559
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1560
  void movflt(XMMRegister dst, Address src) { movss(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1561
  void movflt(XMMRegister dst, AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1562
  void movflt(Address dst, XMMRegister src) { movss(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
  void movdbl(XMMRegister dst, XMMRegister src) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
    if (UseXmmRegToRegMoveAll) { movapd(dst, src); return; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1566
    else                       { movsd (dst, src); return; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1567
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1568
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1569
  void movdbl(XMMRegister dst, AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1570
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1571
  void movdbl(XMMRegister dst, Address src) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
    if (UseXmmLoadAndClearUpper) { movsd (dst, src); return; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1573
    else                         { movlpd(dst, src); return; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1575
  void movdbl(Address dst, XMMRegister src) { movsd(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1576
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1577
  void incrementl(AddressLiteral dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1578
  void incrementl(ArrayAddress dst);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1579
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1580
  // Alignment
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1581
  void align(int modulus);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1582
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1583
  // Misc
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1584
  void fat_nop(); // 5 byte nop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1585
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1586
  // Stack frame creation/removal
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1587
  void enter();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1588
  void leave();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1589
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1590
  // Support for getting the JavaThread pointer (i.e.; a reference to thread-local information)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1591
  // The pointer will be loaded into the thread register.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1592
  void get_thread(Register thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1593
1394
apetrusenko
parents: 1388 1066
diff changeset
  1594
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1595
  // Support for VM calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1596
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1597
  // It is imperative that all calls into the VM are handled via the call_VM macros.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1598
  // They make sure that the stack linkage is setup correctly. call_VM's correspond
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1599
  // to ENTRY/ENTRY_X entry points while call_VM_leaf's correspond to LEAF entry points.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1600
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1601
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1602
  void call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1603
               address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1604
               bool check_exceptions = true);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1605
  void call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1606
               address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1607
               Register arg_1,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1608
               bool check_exceptions = true);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1609
  void call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1610
               address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1611
               Register arg_1, Register arg_2,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1612
               bool check_exceptions = true);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1613
  void call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1614
               address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1615
               Register arg_1, Register arg_2, Register arg_3,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1616
               bool check_exceptions = true);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1617
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1618
  // Overloadings with last_Java_sp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1619
  void call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1620
               Register last_java_sp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1621
               address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1622
               int number_of_arguments = 0,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1623
               bool check_exceptions = true);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1624
  void call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1625
               Register last_java_sp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1626
               address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1627
               Register arg_1, bool
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1628
               check_exceptions = true);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1629
  void call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1630
               Register last_java_sp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1631
               address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1632
               Register arg_1, Register arg_2,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1633
               bool check_exceptions = true);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1634
  void call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1635
               Register last_java_sp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1636
               address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1637
               Register arg_1, Register arg_2, Register arg_3,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1638
               bool check_exceptions = true);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1639
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1640
  void call_VM_leaf(address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1641
                    int number_of_arguments = 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1642
  void call_VM_leaf(address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1643
                    Register arg_1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1644
  void call_VM_leaf(address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1645
                    Register arg_1, Register arg_2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1646
  void call_VM_leaf(address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1647
                    Register arg_1, Register arg_2, Register arg_3);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1648
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1649
  // last Java Frame (fills frame anchor)
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1650
  void set_last_Java_frame(Register thread,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1651
                           Register last_java_sp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1652
                           Register last_java_fp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1653
                           address last_java_pc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1654
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1655
  // thread in the default location (r15_thread on 64bit)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1656
  void set_last_Java_frame(Register last_java_sp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1657
                           Register last_java_fp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1658
                           address last_java_pc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1659
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1660
  void reset_last_Java_frame(Register thread, bool clear_fp, bool clear_pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1661
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1662
  // thread in the default location (r15_thread on 64bit)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1663
  void reset_last_Java_frame(bool clear_fp, bool clear_pc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1664
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1665
  // Stores
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1666
  void store_check(Register obj);                // store check for obj - register is destroyed afterwards
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1667
  void store_check(Register obj, Address dst);   // same as above, dst is exact store location (reg. is destroyed)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1668
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8494
diff changeset
  1669
#ifndef SERIALGC
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8494
diff changeset
  1670
1394
apetrusenko
parents: 1388 1066
diff changeset
  1671
  void g1_write_barrier_pre(Register obj,
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8494
diff changeset
  1672
                            Register pre_val,
1394
apetrusenko
parents: 1388 1066
diff changeset
  1673
                            Register thread,
apetrusenko
parents: 1388 1066
diff changeset
  1674
                            Register tmp,
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8494
diff changeset
  1675
                            bool tosca_live,
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8494
diff changeset
  1676
                            bool expand_call);
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8494
diff changeset
  1677
1394
apetrusenko
parents: 1388 1066
diff changeset
  1678
  void g1_write_barrier_post(Register store_addr,
apetrusenko
parents: 1388 1066
diff changeset
  1679
                             Register new_val,
apetrusenko
parents: 1388 1066
diff changeset
  1680
                             Register thread,
apetrusenko
parents: 1388 1066
diff changeset
  1681
                             Register tmp,
apetrusenko
parents: 1388 1066
diff changeset
  1682
                             Register tmp2);
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 244
diff changeset
  1683
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8494
diff changeset
  1684
#endif // SERIALGC
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 244
diff changeset
  1685
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1686
  // split store_check(Register obj) to enhance instruction interleaving
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1687
  void store_check_part_1(Register obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1688
  void store_check_part_2(Register obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1689
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1690
  // C 'boolean' to Java boolean: x == 0 ? 0 : 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1691
  void c2bool(Register x);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1692
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1693
  // C++ bool manipulation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1694
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1695
  void movbool(Register dst, Address src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1696
  void movbool(Address dst, bool boolconst);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1697
  void movbool(Address dst, Register src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1698
  void testbool(Register dst);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1699
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1700
  // oop manipulations
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1701
  void load_klass(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1702
  void store_klass(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1703
6772
2563324665d5 6829194: JSR 292 needs to support compressed oops
twisti
parents: 6433
diff changeset
  1704
  void load_heap_oop(Register dst, Address src);
2563324665d5 6829194: JSR 292 needs to support compressed oops
twisti
parents: 6433
diff changeset
  1705
  void store_heap_oop(Address dst, Register src);
2563324665d5 6829194: JSR 292 needs to support compressed oops
twisti
parents: 6433
diff changeset
  1706
2563324665d5 6829194: JSR 292 needs to support compressed oops
twisti
parents: 6433
diff changeset
  1707
  // Used for storing NULL. All other oop constants should be
2563324665d5 6829194: JSR 292 needs to support compressed oops
twisti
parents: 6433
diff changeset
  1708
  // stored using routines that take a jobject.
2563324665d5 6829194: JSR 292 needs to support compressed oops
twisti
parents: 6433
diff changeset
  1709
  void store_heap_oop_null(Address dst);
2563324665d5 6829194: JSR 292 needs to support compressed oops
twisti
parents: 6433
diff changeset
  1710
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1711
  void load_prototype_header(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1712
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1713
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1714
  void store_klass_gap(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1715
4102
11d514e508d9 6889740: G1: OpenDS fails with "unhandled exception in compiled code"
johnc
parents: 3905
diff changeset
  1716
  // This dummy is to prevent a call to store_heap_oop from
11d514e508d9 6889740: G1: OpenDS fails with "unhandled exception in compiled code"
johnc
parents: 3905
diff changeset
  1717
  // converting a zero (like NULL) into a Register by giving
11d514e508d9 6889740: G1: OpenDS fails with "unhandled exception in compiled code"
johnc
parents: 3905
diff changeset
  1718
  // the compiler two choices it can't resolve
11d514e508d9 6889740: G1: OpenDS fails with "unhandled exception in compiled code"
johnc
parents: 3905
diff changeset
  1719
11d514e508d9 6889740: G1: OpenDS fails with "unhandled exception in compiled code"
johnc
parents: 3905
diff changeset
  1720
  void store_heap_oop(Address dst, void* dummy);
11d514e508d9 6889740: G1: OpenDS fails with "unhandled exception in compiled code"
johnc
parents: 3905
diff changeset
  1721
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1722
  void encode_heap_oop(Register r);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1723
  void decode_heap_oop(Register r);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1724
  void encode_heap_oop_not_null(Register r);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1725
  void decode_heap_oop_not_null(Register r);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1726
  void encode_heap_oop_not_null(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1727
  void decode_heap_oop_not_null(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1728
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1729
  void set_narrow_oop(Register dst, jobject obj);
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  1730
  void set_narrow_oop(Address dst, jobject obj);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  1731
  void cmp_narrow_oop(Register dst, jobject obj);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  1732
  void cmp_narrow_oop(Address dst, jobject obj);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1733
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1734
  // if heap base register is used - reinit it with the correct value
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1735
  void reinit_heapbase();
6179
4846648c4b7b 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 5702
diff changeset
  1736
4846648c4b7b 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 5702
diff changeset
  1737
  DEBUG_ONLY(void verify_heapbase(const char* msg);)
4846648c4b7b 6973308: Missing zero length check before repne scas in check_klass_subtype_slow_path()
kvn
parents: 5702
diff changeset
  1738
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1739
#endif // _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1740
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1741
  // Int division/remainder for Java
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1742
  // (as idivl, but checks for special case as described in JVM spec.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1743
  // returns idivl instruction offset for implicit exception handling
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1744
  int corrected_idivl(Register reg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1745
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1746
  // Long division/remainder for Java
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1747
  // (as idivq, but checks for special case as described in JVM spec.)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1748
  // returns idivq instruction offset for implicit exception handling
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1749
  int corrected_idivq(Register reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1750
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1751
  void int3();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1752
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1753
  // Long operation macros for a 32bit cpu
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1754
  // Long negation for Java
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1755
  void lneg(Register hi, Register lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1756
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1757
  // Long multiplication for Java
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1758
  // (destroys contents of eax, ebx, ecx and edx)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1759
  void lmul(int x_rsp_offset, int y_rsp_offset); // rdx:rax = x * y
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1760
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1761
  // Long shifts for Java
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1762
  // (semantics as described in JVM spec.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1763
  void lshl(Register hi, Register lo);                               // hi:lo << (rcx & 0x3f)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1764
  void lshr(Register hi, Register lo, bool sign_extension = false);  // hi:lo >> (rcx & 0x3f)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1765
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1766
  // Long compare for Java
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1767
  // (semantics as described in JVM spec.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1768
  void lcmp2int(Register x_hi, Register x_lo, Register y_hi, Register y_lo); // x_hi = lcmp(x, y)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1769
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1770
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1771
  // misc
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1772
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1773
  // Sign extension
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1774
  void sign_extend_short(Register reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1775
  void sign_extend_byte(Register reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1776
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1777
  // Division by power of 2, rounding towards 0
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1778
  void division_with_shift(Register reg, int shift_value);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1779
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1780
  // Compares the top-most stack entries on the FPU stack and sets the eflags as follows:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1781
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1782
  // CF (corresponds to C0) if x < y
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1783
  // PF (corresponds to C2) if unordered
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1784
  // ZF (corresponds to C3) if x = y
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1785
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1786
  // The arguments are in reversed order on the stack (i.e., top of stack is first argument).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1787
  // tmp is a temporary register, if none is available use noreg (only matters for non-P6 code)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
  void fcmp(Register tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
  // Variant of the above which allows y to be further down the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1790
  // and which only pops x and y if specified. If pop_right is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1791
  // specified then pop_left must also be specified.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1792
  void fcmp(Register tmp, int index, bool pop_left, bool pop_right);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1793
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1794
  // Floating-point comparison for Java
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1795
  // Compares the top-most stack entries on the FPU stack and stores the result in dst.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1796
  // The arguments are in reversed order on the stack (i.e., top of stack is first argument).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1797
  // (semantics as described in JVM spec.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1798
  void fcmp2int(Register dst, bool unordered_is_less);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1799
  // Variant of the above which allows y to be further down the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1800
  // and which only pops x and y if specified. If pop_right is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
  // specified then pop_left must also be specified.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1802
  void fcmp2int(Register dst, bool unordered_is_less, int index, bool pop_left, bool pop_right);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1803
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1804
  // Floating-point remainder for Java (ST0 = ST0 fremr ST1, ST1 is empty afterwards)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1805
  // tmp is a temporary register, if none is available use noreg
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1806
  void fremr(Register tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1807
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1808
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1809
  // same as fcmp2int, but using SSE2
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1810
  void cmpss2int(XMMRegister opr1, XMMRegister opr2, Register dst, bool unordered_is_less);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1811
  void cmpsd2int(XMMRegister opr1, XMMRegister opr2, Register dst, bool unordered_is_less);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1812
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1813
  // Inlined sin/cos generator for Java; must not use CPU instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1814
  // directly on Intel as it does not have high enough precision
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1815
  // outside of the range [-pi/4, pi/4]. Extra argument indicate the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1816
  // number of FPU stack slots in use; all but the topmost will
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1817
  // require saving if a slow case is necessary. Assumes argument is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1818
  // on FP TOS; result is on FP TOS.  No cpu registers are changed by
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1819
  // this code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1820
  void trigfunc(char trig, int num_fpu_regs_in_use = 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1821
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1822
  // branch to L if FPU flag C2 is set/not set
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1823
  // tmp is a temporary register, if none is available use noreg
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1824
  void jC2 (Register tmp, Label& L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1825
  void jnC2(Register tmp, Label& L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1826
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1827
  // Pop ST (ffree & fincstp combined)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1828
  void fpop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1829
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1830
  // pushes double TOS element of FPU stack on CPU stack; pops from FPU stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1831
  void push_fTOS();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1832
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1833
  // pops double TOS element from CPU stack and pushes on FPU stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1834
  void pop_fTOS();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1835
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1836
  void empty_FPU_stack();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1837
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1838
  void push_IU_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1839
  void pop_IU_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1840
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1841
  void push_FPU_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1842
  void pop_FPU_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1843
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1844
  void push_CPU_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1845
  void pop_CPU_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1846
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1847
  // Round up to a power of two
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1848
  void round_to(Register reg, int modulus);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1849
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1850
  // Callee saved registers handling
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1851
  void push_callee_saved_registers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1852
  void pop_callee_saved_registers();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1853
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1854
  // allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1855
  void eden_allocate(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1856
    Register obj,                      // result: pointer to object after successful allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1857
    Register var_size_in_bytes,        // object size in bytes if unknown at compile time; invalid otherwise
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1858
    int      con_size_in_bytes,        // object size in bytes if   known at compile time
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1859
    Register t1,                       // temp register
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1860
    Label&   slow_case                 // continuation point if fast allocation fails
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1861
  );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1862
  void tlab_allocate(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1863
    Register obj,                      // result: pointer to object after successful allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1864
    Register var_size_in_bytes,        // object size in bytes if unknown at compile time; invalid otherwise
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1865
    int      con_size_in_bytes,        // object size in bytes if   known at compile time
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1866
    Register t1,                       // temp register
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1867
    Register t2,                       // temp register
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1868
    Label&   slow_case                 // continuation point if fast allocation fails
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1869
  );
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
  1870
  Register tlab_refill(Label& retry_tlab, Label& try_eden, Label& slow_case); // returns TLS address
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
  1871
  void incr_allocated_bytes(Register thread,
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
  1872
                            Register var_size_in_bytes, int con_size_in_bytes,
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
  1873
                            Register t1 = noreg);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1874
2149
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  1875
  // interface method calling
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  1876
  void lookup_interface_method(Register recv_klass,
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  1877
                               Register intf_klass,
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2256
diff changeset
  1878
                               RegisterOrConstant itable_index,
2149
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  1879
                               Register method_result,
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  1880
                               Register scan_temp,
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  1881
                               Label& no_such_interface);
3d362637b307 6812831: factor duplicated assembly code for megamorphic invokeinterface (for 6655638)
jrose
parents: 2148
diff changeset
  1882
2256
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1883
  // Test sub_klass against super_klass, with fast and slow paths.
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1884
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1885
  // The fast path produces a tri-state answer: yes / no / maybe-slow.
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1886
  // One of the three labels can be NULL, meaning take the fall-through.
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1887
  // If super_check_offset is -1, the value is loaded up from super_klass.
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1888
  // No registers are killed, except temp_reg.
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1889
  void check_klass_subtype_fast_path(Register sub_klass,
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1890
                                     Register super_klass,
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1891
                                     Register temp_reg,
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1892
                                     Label* L_success,
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1893
                                     Label* L_failure,
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1894
                                     Label* L_slow_path,
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2256
diff changeset
  1895
                RegisterOrConstant super_check_offset = RegisterOrConstant(-1));
2256
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1896
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1897
  // The rest of the type check; must be wired to a corresponding fast path.
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1898
  // It does not repeat the fast path logic, so don't use it standalone.
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1899
  // The temp_reg and temp2_reg can be noreg, if no temps are available.
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1900
  // Updates the sub's secondary super cache as necessary.
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1901
  // If set_cond_codes, condition codes will be Z on success, NZ on failure.
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1902
  void check_klass_subtype_slow_path(Register sub_klass,
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1903
                                     Register super_klass,
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1904
                                     Register temp_reg,
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1905
                                     Register temp2_reg,
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1906
                                     Label* L_success,
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1907
                                     Label* L_failure,
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1908
                                     bool set_cond_codes = false);
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1909
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1910
  // Simplified, combined version, good for typical uses.
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1911
  // Falls through on failure.
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1912
  void check_klass_subtype(Register sub_klass,
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1913
                           Register super_klass,
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1914
                           Register temp_reg,
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1915
                           Label& L_success);
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2255
diff changeset
  1916
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2348
diff changeset
  1917
  // method handles (JSR 292)
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2348
diff changeset
  1918
  void check_method_handle_type(Register mtype_reg, Register mh_reg,
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2348
diff changeset
  1919
                                Register temp_reg,
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2348
diff changeset
  1920
                                Label& wrong_method_type);
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2348
diff changeset
  1921
  void load_method_handle_vmslots(Register vmslots_reg, Register mh_reg,
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2348
diff changeset
  1922
                                  Register temp_reg);
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2348
diff changeset
  1923
  void jump_to_method_handle_entry(Register mh_reg, Register temp_reg);
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2348
diff changeset
  1924
  Address argument_address(RegisterOrConstant arg_slot, int extra_slot_offset = 0);
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2348
diff changeset
  1925
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 2348
diff changeset
  1926
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1927
  //----
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1928
  void set_word_if_not_zero(Register reg); // sets reg to 1 if not zero, otherwise 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1929
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1930
  // Debugging
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1931
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1932
  // only if +VerifyOops
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1933
  void verify_oop(Register reg, const char* s = "broken oop");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1934
  void verify_oop_addr(Address addr, const char * s = "broken oop addr");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1935
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1936
  // only if +VerifyFPU
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1937
  void verify_FPU(int stack_depth, const char* s = "illegal FPU state");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1938
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1939
  // prints msg, dumps registers and stops execution
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1940
  void stop(const char* msg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1941
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1942
  // prints msg and continues
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1943
  void warn(const char* msg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1944
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1945
  static void debug32(int rdi, int rsi, int rbp, int rsp, int rbx, int rdx, int rcx, int rax, int eip, char* msg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1946
  static void debug64(char* msg, int64_t pc, int64_t regs[]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1947
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1948
  void os_breakpoint();
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1949
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1950
  void untested()                                { stop("untested"); }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1951
6772
2563324665d5 6829194: JSR 292 needs to support compressed oops
twisti
parents: 6433
diff changeset
  1952
  void unimplemented(const char* what = "")      { char* b = new char[1024];  jio_snprintf(b, 1024, "unimplemented: %s", what);  stop(b); }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1953
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1954
  void should_not_reach_here()                   { stop("should not reach here"); }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1955
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1956
  void print_CPU_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1957
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1958
  // Stack overflow checking
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1959
  void bang_stack_with_offset(int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1960
    // stack grows down, caller passes positive offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1961
    assert(offset > 0, "must bang with negative offset");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1962
    movl(Address(rsp, (-offset)), rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1963
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1964
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1965
  // Writes to stack successive pages until offset reached to check for
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1966
  // stack overflow + shadow pages.  Also, clobbers tmp
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1967
  void bang_stack_size(Register size, Register tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1968
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2256
diff changeset
  1969
  virtual RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr,
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2256
diff changeset
  1970
                                                Register tmp,
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2256
diff changeset
  1971
                                                int offset);
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1500
diff changeset
  1972
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1973
  // Support for serializing memory accesses between threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1974
  void serialize_memory(Register thread, Register tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1975
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1976
  void verify_tlab();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1977
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1978
  // Biased locking support
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1979
  // lock_reg and obj_reg must be loaded up with the appropriate values.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1980
  // swap_reg must be rax, and is killed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1981
  // tmp_reg is optional. If it is supplied (i.e., != noreg) it will
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1982
  // be killed; if not supplied, push/pop will be used internally to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1983
  // allocate a temporary (inefficient, avoid if possible).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1984
  // Optional slow case is for implementations (interpreter and C1) which branch to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1985
  // slow case directly. Leaves condition codes set for C2's Fast_Lock node.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1986
  // Returns offset of first potentially-faulting instruction for null
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1987
  // check info (currently consumed only by C1). If
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1988
  // swap_reg_contains_mark is true then returns -1 as it is assumed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1989
  // the calling code has already passed any potential faults.
1500
bea9a90f3e8f 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 1437
diff changeset
  1990
  int biased_locking_enter(Register lock_reg, Register obj_reg,
bea9a90f3e8f 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 1437
diff changeset
  1991
                           Register swap_reg, Register tmp_reg,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1992
                           bool swap_reg_contains_mark,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1993
                           Label& done, Label* slow_case = NULL,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1994
                           BiasedLockingCounters* counters = NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1995
  void biased_locking_exit (Register obj_reg, Register temp_reg, Label& done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1996
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1998
  Condition negate_condition(Condition cond);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1999
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2000
  // Instructions that use AddressLiteral operands. These instruction can handle 32bit/64bit
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2001
  // operands. In general the names are modified to avoid hiding the instruction in Assembler
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2002
  // so that we don't need to implement all the varieties in the Assembler with trivial wrappers
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2003
  // here in MacroAssembler. The major exception to this rule is call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2004
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2005
  // Arithmetics
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2006
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2007
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2008
  void addptr(Address dst, int32_t src) { LP64_ONLY(addq(dst, src)) NOT_LP64(addl(dst, src)) ; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2009
  void addptr(Address dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2010
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2011
  void addptr(Register dst, Address src) { LP64_ONLY(addq(dst, src)) NOT_LP64(addl(dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2012
  void addptr(Register dst, int32_t src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2013
  void addptr(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2014
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2015
  void andptr(Register dst, int32_t src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2016
  void andptr(Register src1, Register src2) { LP64_ONLY(andq(src1, src2)) NOT_LP64(andl(src1, src2)) ; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2017
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2018
  void cmp8(AddressLiteral src1, int imm);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2019
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2020
  // renamed to drag out the casting of address to int32_t/intptr_t
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2021
  void cmp32(Register src1, int32_t imm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2022
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2023
  void cmp32(AddressLiteral src1, int32_t imm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2024
  // compare reg - mem, or reg - &mem
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2025
  void cmp32(Register src1, AddressLiteral src2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2026
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2027
  void cmp32(Register src1, Address src2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2028
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2029
#ifndef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2030
  void cmpoop(Address dst, jobject obj);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2031
  void cmpoop(Register dst, jobject obj);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2032
#endif // _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2033
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
  // NOTE src2 must be the lval. This is NOT an mem-mem compare
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
  void cmpptr(Address src1, AddressLiteral src2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2037
  void cmpptr(Register src1, AddressLiteral src2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2038
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2039
  void cmpptr(Register src1, Register src2) { LP64_ONLY(cmpq(src1, src2)) NOT_LP64(cmpl(src1, src2)) ; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2040
  void cmpptr(Register src1, Address src2) { LP64_ONLY(cmpq(src1, src2)) NOT_LP64(cmpl(src1, src2)) ; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2041
  // void cmpptr(Address src1, Register src2) { LP64_ONLY(cmpq(src1, src2)) NOT_LP64(cmpl(src1, src2)) ; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2042
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2043
  void cmpptr(Register src1, int32_t src2) { LP64_ONLY(cmpq(src1, src2)) NOT_LP64(cmpl(src1, src2)) ; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2044
  void cmpptr(Address src1, int32_t src2) { LP64_ONLY(cmpq(src1, src2)) NOT_LP64(cmpl(src1, src2)) ; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2045
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2046
  // cmp64 to avoild hiding cmpq
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2047
  void cmp64(Register src1, AddressLiteral src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2048
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2049
  void cmpxchgptr(Register reg, Address adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2050
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2051
  void locked_cmpxchgptr(Register reg, AddressLiteral adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2052
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2053
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2054
  void imulptr(Register dst, Register src) { LP64_ONLY(imulq(dst, src)) NOT_LP64(imull(dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2055
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2056
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2057
  void negptr(Register dst) { LP64_ONLY(negq(dst)) NOT_LP64(negl(dst)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2058
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2059
  void notptr(Register dst) { LP64_ONLY(notq(dst)) NOT_LP64(notl(dst)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2060
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2061
  void shlptr(Register dst, int32_t shift);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2062
  void shlptr(Register dst) { LP64_ONLY(shlq(dst)) NOT_LP64(shll(dst)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2063
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2064
  void shrptr(Register dst, int32_t shift);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2065
  void shrptr(Register dst) { LP64_ONLY(shrq(dst)) NOT_LP64(shrl(dst)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2067
  void sarptr(Register dst) { LP64_ONLY(sarq(dst)) NOT_LP64(sarl(dst)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2068
  void sarptr(Register dst, int32_t src) { LP64_ONLY(sarq(dst, src)) NOT_LP64(sarl(dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2069
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2070
  void subptr(Address dst, int32_t src) { LP64_ONLY(subq(dst, src)) NOT_LP64(subl(dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2071
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2072
  void subptr(Register dst, Address src) { LP64_ONLY(subq(dst, src)) NOT_LP64(subl(dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2073
  void subptr(Register dst, int32_t src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2074
  void subptr(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2075
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2076
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2077
  void sbbptr(Address dst, int32_t src) { LP64_ONLY(sbbq(dst, src)) NOT_LP64(sbbl(dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2078
  void sbbptr(Register dst, int32_t src) { LP64_ONLY(sbbq(dst, src)) NOT_LP64(sbbl(dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2079
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2080
  void xchgptr(Register src1, Register src2) { LP64_ONLY(xchgq(src1, src2)) NOT_LP64(xchgl(src1, src2)) ; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2081
  void xchgptr(Register src1, Address src2) { LP64_ONLY(xchgq(src1, src2)) NOT_LP64(xchgl(src1, src2)) ; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2082
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2083
  void xaddptr(Address src1, Register src2) { LP64_ONLY(xaddq(src1, src2)) NOT_LP64(xaddl(src1, src2)) ; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2084
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2085
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2086
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2087
  // Helper functions for statistics gathering.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2088
  // Conditionally (atomically, on MPs) increments passed counter address, preserving condition codes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2089
  void cond_inc32(Condition cond, AddressLiteral counter_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2090
  // Unconditional atomic increment.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2091
  void atomic_incl(AddressLiteral counter_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2092
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2093
  void lea(Register dst, AddressLiteral adr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2094
  void lea(Address dst, AddressLiteral adr);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2095
  void lea(Register dst, Address adr) { Assembler::lea(dst, adr); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2096
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2097
  void leal32(Register dst, Address src) { leal(dst, src); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2098
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2099
  void test32(Register src1, AddressLiteral src2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2100
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2101
  void orptr(Register dst, Address src) { LP64_ONLY(orq(dst, src)) NOT_LP64(orl(dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2102
  void orptr(Register dst, Register src) { LP64_ONLY(orq(dst, src)) NOT_LP64(orl(dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2103
  void orptr(Register dst, int32_t src) { LP64_ONLY(orq(dst, src)) NOT_LP64(orl(dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2104
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2105
  void testptr(Register src, int32_t imm32) {  LP64_ONLY(testq(src, imm32)) NOT_LP64(testl(src, imm32)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2106
  void testptr(Register src1, Register src2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2107
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2108
  void xorptr(Register dst, Register src) { LP64_ONLY(xorq(dst, src)) NOT_LP64(xorl(dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2109
  void xorptr(Register dst, Address src) { LP64_ONLY(xorq(dst, src)) NOT_LP64(xorl(dst, src)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2110
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2111
  // Calls
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2112
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2113
  void call(Label& L, relocInfo::relocType rtype);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2114
  void call(Register entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2115
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2116
  // NOTE: this call tranfers to the effective address of entry NOT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2117
  // the address contained by entry. This is because this is more natural
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2118
  // for jumps/calls.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2119
  void call(AddressLiteral entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2120
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2121
  // Jumps
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2122
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2123
  // NOTE: these jumps tranfer to the effective address of dst NOT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2124
  // the address contained by dst. This is because this is more natural
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2125
  // for jumps/calls.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2126
  void jump(AddressLiteral dst);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2127
  void jump_cc(Condition cc, AddressLiteral dst);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2128
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2129
  // 32bit can do a case table jump in one instruction but we no longer allow the base
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2130
  // to be installed in the Address class. This jump will tranfers to the address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2131
  // contained in the location described by entry (not the address of entry)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2132
  void jump(ArrayAddress entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2133
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2134
  // Floating
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2135
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2136
  void andpd(XMMRegister dst, Address src) { Assembler::andpd(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2137
  void andpd(XMMRegister dst, AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2138
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2139
  void comiss(XMMRegister dst, Address src) { Assembler::comiss(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2140
  void comiss(XMMRegister dst, AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2141
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2142
  void comisd(XMMRegister dst, Address src) { Assembler::comisd(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2143
  void comisd(XMMRegister dst, AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2144
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2145
  void fadd_s(Address src)        { Assembler::fadd_s(src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2146
  void fadd_s(AddressLiteral src) { Assembler::fadd_s(as_Address(src)); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2147
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2148
  void fldcw(Address src) { Assembler::fldcw(src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2149
  void fldcw(AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2150
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2151
  void fld_s(int index)   { Assembler::fld_s(index); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2152
  void fld_s(Address src) { Assembler::fld_s(src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2153
  void fld_s(AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2154
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2155
  void fld_d(Address src) { Assembler::fld_d(src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2156
  void fld_d(AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2157
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2158
  void fld_x(Address src) { Assembler::fld_x(src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2159
  void fld_x(AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2160
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2161
  void fmul_s(Address src)        { Assembler::fmul_s(src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2162
  void fmul_s(AddressLiteral src) { Assembler::fmul_s(as_Address(src)); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2163
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2164
  void ldmxcsr(Address src) { Assembler::ldmxcsr(src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2165
  void ldmxcsr(AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2166
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2167
private:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2168
  // these are private because users should be doing movflt/movdbl
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2169
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2170
  void movss(Address dst, XMMRegister src)     { Assembler::movss(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2171
  void movss(XMMRegister dst, XMMRegister src) { Assembler::movss(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2172
  void movss(XMMRegister dst, Address src)     { Assembler::movss(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2173
  void movss(XMMRegister dst, AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2174
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2175
  void movlpd(XMMRegister dst, Address src)      {Assembler::movlpd(dst, src); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2176
  void movlpd(XMMRegister dst, AddressLiteral src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2177
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2178
public:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2179
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2180
  void addsd(XMMRegister dst, XMMRegister src)    { Assembler::addsd(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2181
  void addsd(XMMRegister dst, Address src)        { Assembler::addsd(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2182
  void addsd(XMMRegister dst, AddressLiteral src) { Assembler::addsd(dst, as_Address(src)); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2183
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2184
  void addss(XMMRegister dst, XMMRegister src)    { Assembler::addss(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2185
  void addss(XMMRegister dst, Address src)        { Assembler::addss(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2186
  void addss(XMMRegister dst, AddressLiteral src) { Assembler::addss(dst, as_Address(src)); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2187
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2188
  void divsd(XMMRegister dst, XMMRegister src)    { Assembler::divsd(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2189
  void divsd(XMMRegister dst, Address src)        { Assembler::divsd(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2190
  void divsd(XMMRegister dst, AddressLiteral src) { Assembler::divsd(dst, as_Address(src)); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2191
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2192
  void divss(XMMRegister dst, XMMRegister src)    { Assembler::divss(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2193
  void divss(XMMRegister dst, Address src)        { Assembler::divss(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2194
  void divss(XMMRegister dst, AddressLiteral src) { Assembler::divss(dst, as_Address(src)); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2195
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
  2196
  void movsd(XMMRegister dst, XMMRegister src) { Assembler::movsd(dst, src); }
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
  2197
  void movsd(Address dst, XMMRegister src)     { Assembler::movsd(dst, src); }
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7433
diff changeset
  2198
  void movsd(XMMRegister dst, Address src)     { Assembler::movsd(dst, src); }
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2199
  void movsd(XMMRegister dst, AddressLiteral src) { Assembler::movsd(dst, as_Address(src)); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2200
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2201
  void mulsd(XMMRegister dst, XMMRegister src)    { Assembler::mulsd(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2202
  void mulsd(XMMRegister dst, Address src)        { Assembler::mulsd(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2203
  void mulsd(XMMRegister dst, AddressLiteral src) { Assembler::mulsd(dst, as_Address(src)); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2204
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2205
  void mulss(XMMRegister dst, XMMRegister src)    { Assembler::mulss(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2206
  void mulss(XMMRegister dst, Address src)        { Assembler::mulss(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2207
  void mulss(XMMRegister dst, AddressLiteral src) { Assembler::mulss(dst, as_Address(src)); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2208
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2209
  void sqrtsd(XMMRegister dst, XMMRegister src)    { Assembler::sqrtsd(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2210
  void sqrtsd(XMMRegister dst, Address src)        { Assembler::sqrtsd(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2211
  void sqrtsd(XMMRegister dst, AddressLiteral src) { Assembler::sqrtsd(dst, as_Address(src)); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2212
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2213
  void sqrtss(XMMRegister dst, XMMRegister src)    { Assembler::sqrtss(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2214
  void sqrtss(XMMRegister dst, Address src)        { Assembler::sqrtss(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2215
  void sqrtss(XMMRegister dst, AddressLiteral src) { Assembler::sqrtss(dst, as_Address(src)); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2216
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2217
  void subsd(XMMRegister dst, XMMRegister src)    { Assembler::subsd(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2218
  void subsd(XMMRegister dst, Address src)        { Assembler::subsd(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2219
  void subsd(XMMRegister dst, AddressLiteral src) { Assembler::subsd(dst, as_Address(src)); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2220
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2221
  void subss(XMMRegister dst, XMMRegister src)    { Assembler::subss(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2222
  void subss(XMMRegister dst, Address src)        { Assembler::subss(dst, src); }
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  2223
  void subss(XMMRegister dst, AddressLiteral src) { Assembler::subss(dst, as_Address(src)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2224
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2225
  void ucomiss(XMMRegister dst, XMMRegister src) { Assembler::ucomiss(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2226
  void ucomiss(XMMRegister dst, Address src) { Assembler::ucomiss(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2227
  void ucomiss(XMMRegister dst, AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2228
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2229
  void ucomisd(XMMRegister dst, XMMRegister src) { Assembler::ucomisd(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2230
  void ucomisd(XMMRegister dst, Address src) { Assembler::ucomisd(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2231
  void ucomisd(XMMRegister dst, AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2232
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2233
  // Bitwise Logical XOR of Packed Double-Precision Floating-Point Values
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2234
  void xorpd(XMMRegister dst, XMMRegister src) { Assembler::xorpd(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2235
  void xorpd(XMMRegister dst, Address src)     { Assembler::xorpd(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2236
  void xorpd(XMMRegister dst, AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2237
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2238
  // Bitwise Logical XOR of Packed Single-Precision Floating-Point Values
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2239
  void xorps(XMMRegister dst, XMMRegister src) { Assembler::xorps(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2240
  void xorps(XMMRegister dst, Address src)     { Assembler::xorps(dst, src); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2241
  void xorps(XMMRegister dst, AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2242
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2243
  // Data
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2244
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2245
  void cmov(Condition cc, Register dst, Register src) { LP64_ONLY(cmovq(cc, dst, src)) NOT_LP64(cmovl(cc, dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2246
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2247
  void cmovptr(Condition cc, Register dst, Address src) { LP64_ONLY(cmovq(cc, dst, src)) NOT_LP64(cmovl(cc, dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2248
  void cmovptr(Condition cc, Register dst, Register src) { LP64_ONLY(cmovq(cc, dst, src)) NOT_LP64(cmovl(cc, dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2249
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2250
  void movoop(Register dst, jobject obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2251
  void movoop(Address dst, jobject obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2252
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2253
  void movptr(ArrayAddress dst, Register src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2254
  // can this do an lea?
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2255
  void movptr(Register dst, ArrayAddress src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2256
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2257
  void movptr(Register dst, Address src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2258
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2259
  void movptr(Register dst, AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2260
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2261
  void movptr(Register dst, intptr_t src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2262
  void movptr(Register dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2263
  void movptr(Address dst, intptr_t src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2264
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2265
  void movptr(Address dst, Register src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2266
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2267
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2268
  // Generally the next two are only used for moving NULL
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2269
  // Although there are situations in initializing the mark word where
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2270
  // they could be used. They are dangerous.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2271
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2272
  // They only exist on LP64 so that int32_t and intptr_t are not the same
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2273
  // and we have ambiguous declarations.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2274
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2275
  void movptr(Address dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2276
  void movptr(Register dst, int32_t imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2277
#endif // _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2278
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2279
  // to avoid hiding movl
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2280
  void mov32(AddressLiteral dst, Register src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2281
  void mov32(Register dst, AddressLiteral src);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2282
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2283
  // to avoid hiding movb
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
  void movbyte(ArrayAddress dst, int src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2285
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2286
  // Can push value or effective address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2287
  void pushptr(AddressLiteral src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2288
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2289
  void pushptr(Address src) { LP64_ONLY(pushq(src)) NOT_LP64(pushl(src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2290
  void popptr(Address src) { LP64_ONLY(popq(src)) NOT_LP64(popl(src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2291
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2292
  void pushoop(jobject obj);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2293
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2294
  // sign extend as need a l to ptr sized element
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2295
  void movl2ptr(Register dst, Address src) { LP64_ONLY(movslq(dst, src)) NOT_LP64(movl(dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2296
  void movl2ptr(Register dst, Register src) { LP64_ONLY(movslq(dst, src)) NOT_LP64(if (dst != src) movl(dst, src)); }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2297
3905
7d725029ac85 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 2862
diff changeset
  2298
  // IndexOf strings.
8494
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2299
  // Small strings are loaded through stack if they cross page boundary.
3905
7d725029ac85 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 2862
diff changeset
  2300
  void string_indexof(Register str1, Register str2,
8494
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2301
                      Register cnt1, Register cnt2,
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2302
                      int int_cnt2,  Register result,
3905
7d725029ac85 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 2862
diff changeset
  2303
                      XMMRegister vec, Register tmp);
7d725029ac85 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 2862
diff changeset
  2304
8494
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2305
  // IndexOf for constant substrings with size >= 8 elements
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2306
  // which don't need to be loaded through stack.
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2307
  void string_indexofC8(Register str1, Register str2,
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2308
                      Register cnt1, Register cnt2,
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2309
                      int int_cnt2,  Register result,
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2310
                      XMMRegister vec, Register tmp);
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2311
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2312
    // Smallest code: we don't need to load through stack,
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2313
    // check string tail.
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2314
3905
7d725029ac85 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 2862
diff changeset
  2315
  // Compare strings.
7d725029ac85 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 2862
diff changeset
  2316
  void string_compare(Register str1, Register str2,
7d725029ac85 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 2862
diff changeset
  2317
                      Register cnt1, Register cnt2, Register result,
8332
3320859e937a 7016474: string compare intrinsic improvements
never
parents: 8328
diff changeset
  2318
                      XMMRegister vec1);
3905
7d725029ac85 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 2862
diff changeset
  2319
7d725029ac85 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 2862
diff changeset
  2320
  // Compare char[] arrays.
7d725029ac85 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 2862
diff changeset
  2321
  void char_arrays_equals(bool is_array_equ, Register ary1, Register ary2,
7d725029ac85 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 2862
diff changeset
  2322
                          Register limit, Register result, Register chr,
7d725029ac85 6827605: new String intrinsics may prevent EA scalar replacement
kvn
parents: 2862
diff changeset
  2323
                          XMMRegister vec1, XMMRegister vec2);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2324
6433
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 6179
diff changeset
  2325
  // Fill primitive arrays
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 6179
diff changeset
  2326
  void generate_fill(BasicType t, bool aligned,
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 6179
diff changeset
  2327
                     Register to, Register value, Register count,
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 6179
diff changeset
  2328
                     Register rtmp, XMMRegister xtmp);
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 6179
diff changeset
  2329
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2330
#undef VIRTUAL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2331
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2332
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2333
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2334
/**
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2335
 * class SkipIfEqual:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2336
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2337
 * Instantiating this class will result in assembly code being output that will
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2338
 * jump around any code emitted between the creation of the instance and it's
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2339
 * automatic destruction at the end of a scope block, depending on the value of
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2340
 * the flag passed to the constructor, which will be checked at run-time.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2341
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2342
class SkipIfEqual {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2343
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2344
  MacroAssembler* _masm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2345
  Label _label;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2346
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2347
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2348
   SkipIfEqual(MacroAssembler*, const bool* flag_addr, bool value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2349
   ~SkipIfEqual();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2350
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2351
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2352
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2353
inline bool AbstractAssembler::pd_check_instruction_mark() { return true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2354
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
  2355
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
  2356
#endif // CPU_X86_VM_ASSEMBLER_X86_HPP