hotspot/src/cpu/x86/vm/assembler_x86.cpp
author johnc
Thu, 07 Apr 2011 09:53:20 -0700
changeset 9176 42d9d1010f38
parent 8676 9098d4e927e1
child 9179 6db9c9dffe1f
permissions -rw-r--r--
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer. Reviewed-by: kvn, iveresov, never, tonyp, dholmes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
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: 5426
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5426
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: 5426
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
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    26
#include "assembler_x86.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    27
#include "gc_interface/collectedHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    28
#include "interpreter/interpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    29
#include "memory/cardTableModRefBS.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    30
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    31
#include "prims/methodHandles.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    32
#include "runtime/biasedLocking.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    33
#include "runtime/interfaceSupport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    34
#include "runtime/objectMonitor.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    35
#include "runtime/os.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    36
#include "runtime/sharedRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    37
#include "runtime/stubRoutines.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    38
#ifndef SERIALGC
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    39
#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    40
#include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    41
#include "gc_implementation/g1/heapRegion.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7121
diff changeset
    42
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
// Implementation of AddressLiteral
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
AddressLiteral::AddressLiteral(address target, relocInfo::relocType rtype) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  _is_lval = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  _target = target;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  switch (rtype) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  case relocInfo::oop_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
    // Oops are a special case. Normally they would be their own section
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
    // but in cases like icBuffer they are literals in the code stream that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
    // we don't have a section for. We use none so that we get a literal address
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
    // which is always patchable.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  case relocInfo::external_word_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
    _rspec = external_word_Relocation::spec(target);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  case relocInfo::internal_word_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
    _rspec = internal_word_Relocation::spec(target);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  case relocInfo::opt_virtual_call_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
    _rspec = opt_virtual_call_Relocation::spec();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  case relocInfo::static_call_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
    _rspec = static_call_Relocation::spec();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  case relocInfo::runtime_call_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
    _rspec = runtime_call_Relocation::spec();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  case relocInfo::poll_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  case relocInfo::poll_return_type:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
    _rspec = Relocation::spec_simple(rtype);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  case relocInfo::none:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
// Implementation of Address
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    85
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    86
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
Address Address::make_array(ArrayAddress adr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  // Not implementable on 64bit machines
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  // Should have been handled higher up the call chain.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  ShouldNotReachHere();
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    91
  return Address();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    92
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    93
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    94
// exceedingly dangerous constructor
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    95
Address::Address(int disp, address loc, relocInfo::relocType rtype) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    96
  _base  = noreg;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    97
  _index = noreg;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    98
  _scale = no_scale;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
    99
  _disp  = disp;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   100
  switch (rtype) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   101
    case relocInfo::external_word_type:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   102
      _rspec = external_word_Relocation::spec(loc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   103
      break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   104
    case relocInfo::internal_word_type:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   105
      _rspec = internal_word_Relocation::spec(loc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   106
      break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   107
    case relocInfo::runtime_call_type:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   108
      // HMM
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   109
      _rspec = runtime_call_Relocation::spec();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   110
      break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   111
    case relocInfo::poll_type:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   112
    case relocInfo::poll_return_type:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   113
      _rspec = Relocation::spec_simple(rtype);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   114
      break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   115
    case relocInfo::none:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   116
      break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   117
    default:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   118
      ShouldNotReachHere();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   119
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   120
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   121
#else // LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   122
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   123
Address Address::make_array(ArrayAddress adr) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  AddressLiteral base = adr.base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  Address index = adr.index();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  assert(index._disp == 0, "must not have disp"); // maybe it can?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  Address array(index._base, index._index, index._scale, (intptr_t) base.target());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  array._rspec = base._rspec;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  return array;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   130
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
// exceedingly dangerous constructor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
Address::Address(address loc, RelocationHolder spec) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  _base  = noreg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  _index = noreg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  _scale = no_scale;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  _disp  = (intptr_t) loc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  _rspec = spec;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
}
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   140
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
#endif // _LP64
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   143
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   144
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
// Convert the raw encoding form into the form expected by the constructor for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
// Address.  An index of 4 (rsp) corresponds to having no index, so convert
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
// that to noreg for the Address constructor.
2150
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
   148
Address Address::make_raw(int base, int index, int scale, int disp, bool disp_is_oop) {
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
   149
  RelocationHolder rspec;
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
   150
  if (disp_is_oop) {
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
   151
    rspec = Relocation::spec_simple(relocInfo::oop_type);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
   152
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  bool valid_index = index != rsp->encoding();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  if (valid_index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
    Address madr(as_Register(base), as_Register(index), (Address::ScaleFactor)scale, in_ByteSize(disp));
2150
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
   156
    madr._rspec = rspec;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    return madr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
    Address madr(as_Register(base), noreg, Address::no_scale, in_ByteSize(disp));
2150
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
   160
    madr._rspec = rspec;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
    return madr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
// Implementation of Assembler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
int AbstractAssembler::code_fill_byte() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  return (u_char)'\xF4'; // hlt
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
// make this go away someday
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
void Assembler::emit_data(jint data, relocInfo::relocType rtype, int format) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  if (rtype == relocInfo::none)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
        emit_long(data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  else  emit_data(data, Relocation::spec_simple(rtype), format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
void Assembler::emit_data(jint data, RelocationHolder const& rspec, int format) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   179
  assert(imm_operand == 0, "default format must be immediate in this file");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  assert(inst_mark() != NULL, "must be inside InstructionMark");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  if (rspec.type() !=  relocInfo::none) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
    #ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
      check_relocation(rspec, format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
    #endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
    // Do not use AbstractAssembler::relocate, which is not intended for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
    // embedded words.  Instead, relocate to the enclosing instruction.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
    // hack. call32 is too wide for mask so use disp32
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
    if (format == call32_operand)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
      code_section()->relocate(inst_mark(), rspec, disp32_operand);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
    else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
      code_section()->relocate(inst_mark(), rspec, format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  emit_long(data);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   197
static int encode(Register r) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   198
  int enc = r->encoding();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   199
  if (enc >= 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   200
    enc -= 8;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   201
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   202
  return enc;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   203
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   204
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   205
static int encode(XMMRegister r) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   206
  int enc = r->encoding();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   207
  if (enc >= 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   208
    enc -= 8;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   209
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   210
  return enc;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   211
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
void Assembler::emit_arith_b(int op1, int op2, Register dst, int imm8) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  assert(dst->has_byte_register(), "must have byte register");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  assert(isByte(op1) && isByte(op2), "wrong opcode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  assert(isByte(imm8), "not a byte");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  assert((op1 & 0x01) == 0, "should be 8bit operation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  emit_byte(op1);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   219
  emit_byte(op2 | encode(dst));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  emit_byte(imm8);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   224
void Assembler::emit_arith(int op1, int op2, Register dst, int32_t imm32) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  assert(isByte(op1) && isByte(op2), "wrong opcode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  assert((op1 & 0x01) == 1, "should be 32bit operation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  assert((op1 & 0x02) == 0, "sign-extension bit should not be set");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  if (is8bit(imm32)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
    emit_byte(op1 | 0x02); // set sign bit
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   230
    emit_byte(op2 | encode(dst));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
    emit_byte(imm32 & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
    emit_byte(op1);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   234
    emit_byte(op2 | encode(dst));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
    emit_long(imm32);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
// immediate-to-memory forms
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   240
void Assembler::emit_arith_operand(int op1, Register rm, Address adr, int32_t imm32) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  assert((op1 & 0x01) == 1, "should be 32bit operation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  assert((op1 & 0x02) == 0, "sign-extension bit should not be set");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  if (is8bit(imm32)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
    emit_byte(op1 | 0x02); // set sign bit
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   245
    emit_operand(rm, adr, 1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
    emit_byte(imm32 & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
    emit_byte(op1);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   249
    emit_operand(rm, adr, 4);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
    emit_long(imm32);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
void Assembler::emit_arith(int op1, int op2, Register dst, jobject obj) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   255
  LP64_ONLY(ShouldNotReachHere());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  assert(isByte(op1) && isByte(op2), "wrong opcode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  assert((op1 & 0x01) == 1, "should be 32bit operation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  assert((op1 & 0x02) == 0, "sign-extension bit should not be set");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  InstructionMark im(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  emit_byte(op1);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   261
  emit_byte(op2 | encode(dst));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   262
  emit_data((intptr_t)obj, relocInfo::oop_type, 0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
void Assembler::emit_arith(int op1, int op2, Register dst, Register src) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  assert(isByte(op1) && isByte(op2), "wrong opcode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  emit_byte(op1);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   269
  emit_byte(op2 | encode(dst) << 3 | encode(src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   270
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   271
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   272
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   273
void Assembler::emit_operand(Register reg, Register base, Register index,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   274
                             Address::ScaleFactor scale, int disp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   275
                             RelocationHolder const& rspec,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   276
                             int rip_relative_correction) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  relocInfo::relocType rtype = (relocInfo::relocType) rspec.type();
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   278
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   279
  // Encode the registers as needed in the fields they are used in
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   280
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   281
  int regenc = encode(reg) << 3;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   282
  int indexenc = index->is_valid() ? encode(index) << 3 : 0;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   283
  int baseenc = base->is_valid() ? encode(base) : 0;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   284
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  if (base->is_valid()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
    if (index->is_valid()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
      assert(scale != Address::no_scale, "inconsistent address");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
      // [base + index*scale + disp]
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   289
      if (disp == 0 && rtype == relocInfo::none  &&
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   290
          base != rbp LP64_ONLY(&& base != r13)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
        // [base + index*scale]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
        // [00 reg 100][ss index base]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
        assert(index != rsp, "illegal addressing mode");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   294
        emit_byte(0x04 | regenc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   295
        emit_byte(scale << 6 | indexenc | baseenc);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
      } else if (is8bit(disp) && rtype == relocInfo::none) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
        // [base + index*scale + imm8]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
        // [01 reg 100][ss index base] imm8
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
        assert(index != rsp, "illegal addressing mode");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   300
        emit_byte(0x44 | regenc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   301
        emit_byte(scale << 6 | indexenc | baseenc);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
        emit_byte(disp & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
      } else {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   304
        // [base + index*scale + disp32]
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   305
        // [10 reg 100][ss index base] disp32
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
        assert(index != rsp, "illegal addressing mode");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   307
        emit_byte(0x84 | regenc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   308
        emit_byte(scale << 6 | indexenc | baseenc);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
        emit_data(disp, rspec, disp32_operand);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
      }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   311
    } else if (base == rsp LP64_ONLY(|| base == r12)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   312
      // [rsp + disp]
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
      if (disp == 0 && rtype == relocInfo::none) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   314
        // [rsp]
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
        // [00 reg 100][00 100 100]
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   316
        emit_byte(0x04 | regenc);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
        emit_byte(0x24);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
      } else if (is8bit(disp) && rtype == relocInfo::none) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   319
        // [rsp + imm8]
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   320
        // [01 reg 100][00 100 100] disp8
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   321
        emit_byte(0x44 | regenc);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
        emit_byte(0x24);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
        emit_byte(disp & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
      } else {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   325
        // [rsp + imm32]
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   326
        // [10 reg 100][00 100 100] disp32
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   327
        emit_byte(0x84 | regenc);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
        emit_byte(0x24);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
        emit_data(disp, rspec, disp32_operand);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
      // [base + disp]
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   333
      assert(base != rsp LP64_ONLY(&& base != r12), "illegal addressing mode");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   334
      if (disp == 0 && rtype == relocInfo::none &&
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   335
          base != rbp LP64_ONLY(&& base != r13)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
        // [base]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
        // [00 reg base]
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   338
        emit_byte(0x00 | regenc | baseenc);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
      } else if (is8bit(disp) && rtype == relocInfo::none) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   340
        // [base + disp8]
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   341
        // [01 reg base] disp8
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   342
        emit_byte(0x40 | regenc | baseenc);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
        emit_byte(disp & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
      } else {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   345
        // [base + disp32]
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   346
        // [10 reg base] disp32
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   347
        emit_byte(0x80 | regenc | baseenc);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
        emit_data(disp, rspec, disp32_operand);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
    if (index->is_valid()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
      assert(scale != Address::no_scale, "inconsistent address");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
      // [index*scale + disp]
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   355
      // [00 reg 100][ss index 101] disp32
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
      assert(index != rsp, "illegal addressing mode");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   357
      emit_byte(0x04 | regenc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   358
      emit_byte(scale << 6 | indexenc | 0x05);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
      emit_data(disp, rspec, disp32_operand);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   360
    } else if (rtype != relocInfo::none ) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   361
      // [disp] (64bit) RIP-RELATIVE (32bit) abs
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   362
      // [00 000 101] disp32
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   363
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   364
      emit_byte(0x05 | regenc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   365
      // Note that the RIP-rel. correction applies to the generated
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   366
      // disp field, but _not_ to the target address in the rspec.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   367
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   368
      // disp was created by converting the target address minus the pc
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   369
      // at the start of the instruction. That needs more correction here.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   370
      // intptr_t disp = target - next_ip;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   371
      assert(inst_mark() != NULL, "must be inside InstructionMark");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   372
      address next_ip = pc() + sizeof(int32_t) + rip_relative_correction;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   373
      int64_t adjusted = disp;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   374
      // Do rip-rel adjustment for 64bit
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   375
      LP64_ONLY(adjusted -=  (next_ip - inst_mark()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   376
      assert(is_simm32(adjusted),
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   377
             "must be 32bit offset (RIP relative address)");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   378
      emit_data((int32_t) adjusted, rspec, disp32_operand);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   379
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
    } else {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   381
      // 32bit never did this, did everything as the rip-rel/disp code above
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   382
      // [disp] ABSOLUTE
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   383
      // [00 reg 100][00 100 101] disp32
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   384
      emit_byte(0x04 | regenc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   385
      emit_byte(0x25);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
      emit_data(disp, rspec, disp32_operand);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   391
void Assembler::emit_operand(XMMRegister reg, Register base, Register index,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   392
                             Address::ScaleFactor scale, int disp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   393
                             RelocationHolder const& rspec) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   394
  emit_operand((Register)reg, base, index, scale, disp, rspec);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   395
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   396
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
// Secret local extension to Assembler::WhichOperand:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
#define end_pc_operand (_WhichOperand_limit)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
address Assembler::locate_operand(address inst, WhichOperand which) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  // Decode the given instruction, and return the address of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  // an embedded 32-bit operand word.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  // If "which" is disp32_operand, selects the displacement portion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  // of an effective address specifier.
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   406
  // If "which" is imm64_operand, selects the trailing immediate constant.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  // If "which" is call32_operand, selects the displacement of a call or jump.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  // Caller is responsible for ensuring that there is such an operand,
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   409
  // and that it is 32/64 bits wide.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
  // If "which" is end_pc_operand, find the end of the instruction.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  address ip = inst;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   414
  bool is_64bit = false;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   415
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   416
  debug_only(bool has_disp32 = false);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   417
  int tail_size = 0; // other random bytes (#32, #16, etc.) at end of insn
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   418
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   419
  again_after_prefix:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  switch (0xFF & *ip++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  // These convenience macros generate groups of "case" labels for the switch.
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   423
#define REP4(x) (x)+0: case (x)+1: case (x)+2: case (x)+3
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   424
#define REP8(x) (x)+0: case (x)+1: case (x)+2: case (x)+3: \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
             case (x)+4: case (x)+5: case (x)+6: case (x)+7
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   426
#define REP16(x) REP8((x)+0): \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
              case REP8((x)+8)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  case CS_segment:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  case SS_segment:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  case DS_segment:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  case ES_segment:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  case FS_segment:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  case GS_segment:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   435
    // Seems dubious
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   436
    LP64_ONLY(assert(false, "shouldn't have that prefix"));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
    assert(ip == inst+1, "only one prefix allowed");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
    goto again_after_prefix;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   440
  case 0x67:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   441
  case REX:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   442
  case REX_B:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   443
  case REX_X:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   444
  case REX_XB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   445
  case REX_R:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   446
  case REX_RB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   447
  case REX_RX:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   448
  case REX_RXB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   449
    NOT_LP64(assert(false, "64bit prefixes"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   450
    goto again_after_prefix;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   451
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   452
  case REX_W:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   453
  case REX_WB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   454
  case REX_WX:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   455
  case REX_WXB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   456
  case REX_WR:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   457
  case REX_WRB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   458
  case REX_WRX:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   459
  case REX_WRXB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   460
    NOT_LP64(assert(false, "64bit prefixes"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   461
    is_64bit = true;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   462
    goto again_after_prefix;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   463
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   464
  case 0xFF: // pushq a; decl a; incl a; call a; jmp a
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  case 0x88: // movb a, r
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  case 0x89: // movl a, r
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  case 0x8A: // movb r, a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  case 0x8B: // movl r, a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  case 0x8F: // popl a
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   470
    debug_only(has_disp32 = true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   473
  case 0x68: // pushq #32
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   474
    if (which == end_pc_operand) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   475
      return ip + 4;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   476
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   477
    assert(which == imm_operand && !is_64bit, "pushl has no disp32 or 64bit immediate");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
    return ip;                  // not produced by emit_operand
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
  case 0x66: // movw ... (size prefix)
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   481
    again_after_size_prefix2:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
    switch (0xFF & *ip++) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   483
    case REX:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   484
    case REX_B:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   485
    case REX_X:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   486
    case REX_XB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   487
    case REX_R:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   488
    case REX_RB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   489
    case REX_RX:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   490
    case REX_RXB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   491
    case REX_W:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   492
    case REX_WB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   493
    case REX_WX:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   494
    case REX_WXB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   495
    case REX_WR:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   496
    case REX_WRB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   497
    case REX_WRX:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   498
    case REX_WRXB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   499
      NOT_LP64(assert(false, "64bit prefix found"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   500
      goto again_after_size_prefix2;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
    case 0x8B: // movw r, a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
    case 0x89: // movw a, r
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   503
      debug_only(has_disp32 = true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
    case 0xC7: // movw a, #16
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   506
      debug_only(has_disp32 = true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
      tail_size = 2;  // the imm16
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
    case 0x0F: // several SSE/SSE2 variants
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
      ip--;    // reparse the 0x0F
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
      goto again_after_prefix;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   517
  case REP8(0xB8): // movl/q r, #32/#64(oop?)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   518
    if (which == end_pc_operand)  return ip + (is_64bit ? 8 : 4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   519
    // these asserts are somewhat nonsensical
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   520
#ifndef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   521
    assert(which == imm_operand || which == disp32_operand, "");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   522
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   523
    assert((which == call32_operand || which == imm_operand) && is_64bit ||
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   524
           which == narrow_oop_operand && !is_64bit, "");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   525
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
    return ip;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  case 0x69: // imul r, a, #32
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  case 0xC7: // movl a, #32(oop?)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
    tail_size = 4;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   531
    debug_only(has_disp32 = true); // has both kinds of operands!
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  case 0x0F: // movx..., etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
    switch (0xFF & *ip++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
    case 0x12: // movlps
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
    case 0x28: // movaps
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
    case 0x2E: // ucomiss
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
    case 0x2F: // comiss
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
    case 0x54: // andps
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
    case 0x55: // andnps
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
    case 0x56: // orps
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
    case 0x57: // xorps
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
    case 0x6E: // movd
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
    case 0x7E: // movd
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
    case 0xAE: // ldmxcsr   a
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   547
      // 64bit side says it these have both operands but that doesn't
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   548
      // appear to be true
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   549
      debug_only(has_disp32 = true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
    case 0xAD: // shrd r, a, %cl
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
    case 0xAF: // imul r, a
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   554
    case 0xBE: // movsbl r, a (movsxb)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   555
    case 0xBF: // movswl r, a (movsxw)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   556
    case 0xB6: // movzbl r, a (movzxb)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   557
    case 0xB7: // movzwl r, a (movzxw)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
    case REP16(0x40): // cmovl cc, r, a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
    case 0xB0: // cmpxchgb
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
    case 0xB1: // cmpxchg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
    case 0xC1: // xaddl
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
    case 0xC7: // cmpxchg8
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
    case REP16(0x90): // setcc a
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   564
      debug_only(has_disp32 = true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
      // fall out of the switch to decode the address
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
      break;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   567
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
    case 0xAC: // shrd r, a, #8
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   569
      debug_only(has_disp32 = true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
      tail_size = 1;  // the imm8
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
      break;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   572
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
    case REP16(0x80): // jcc rdisp32
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
      if (which == end_pc_operand)  return ip + 4;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   575
      assert(which == call32_operand, "jcc has no disp32 or imm");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
      return ip;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  case 0x81: // addl a, #32; addl r, #32
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
    // also: orl, adcl, sbbl, andl, subl, xorl, cmpl
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   584
    // on 32bit in the case of cmpl, the imm might be an oop
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
    tail_size = 4;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   586
    debug_only(has_disp32 = true); // has both kinds of operands!
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  case 0x83: // addl a, #8; addl r, #8
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
    // also: orl, adcl, sbbl, andl, subl, xorl, cmpl
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   591
    debug_only(has_disp32 = true); // has both kinds of operands!
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
    tail_size = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  case 0x9B:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
    switch (0xFF & *ip++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
    case 0xD9: // fnstcw a
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   598
      debug_only(has_disp32 = true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
  case REP4(0x00): // addb a, r; addl a, r; addb r, a; addl r, a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  case REP4(0x10): // adc...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
  case REP4(0x20): // and...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  case REP4(0x30): // xor...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
  case REP4(0x08): // or...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
  case REP4(0x18): // sbb...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
  case REP4(0x28): // sub...
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   612
  case 0xF7: // mull a
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   613
  case 0x8D: // lea r, a
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   614
  case 0x87: // xchg r, a
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  case REP4(0x38): // cmp...
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   616
  case 0x85: // test r, a
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   617
    debug_only(has_disp32 = true); // has both kinds of operands!
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
  case 0xC1: // sal a, #8; sar a, #8; shl a, #8; shr a, #8
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
  case 0xC6: // movb a, #8
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
  case 0x80: // cmpb a, #8
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  case 0x6B: // imul r, a, #8
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   624
    debug_only(has_disp32 = true); // has both kinds of operands!
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
    tail_size = 1; // the imm8
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
  case 0xE8: // call rdisp32
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
  case 0xE9: // jmp  rdisp32
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
    if (which == end_pc_operand)  return ip + 4;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   631
    assert(which == call32_operand, "call has no disp32 or imm");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
    return ip;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
  case 0xD1: // sal a, 1; sar a, 1; shl a, 1; shr a, 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
  case 0xD3: // sal a, %cl; sar a, %cl; shl a, %cl; shr a, %cl
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
  case 0xD9: // fld_s a; fst_s a; fstp_s a; fldcw a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
  case 0xDD: // fld_d a; fst_d a; fstp_d a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
  case 0xDB: // fild_s a; fistp_s a; fld_x a; fstp_x a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  case 0xDF: // fild_d a; fistp_d a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
  case 0xD8: // fadd_s a; fsubr_s a; fmul_s a; fdivr_s a; fcomp_s a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  case 0xDC: // fadd_d a; fsubr_d a; fmul_d a; fdivr_d a; fcomp_d a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
  case 0xDE: // faddp_d a; fsubrp_d a; fmulp_d a; fdivrp_d a; fcompp_d a
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   643
    debug_only(has_disp32 = true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
1500
bea9a90f3e8f 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 1437
diff changeset
   646
  case 0xF0:                    // Lock
bea9a90f3e8f 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 1437
diff changeset
   647
    assert(os::is_MP(), "only on MP");
bea9a90f3e8f 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 1437
diff changeset
   648
    goto again_after_prefix;
bea9a90f3e8f 6462850: generate biased locking code in C2 ideal graph
kvn
parents: 1437
diff changeset
   649
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  case 0xF3:                    // For SSE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
  case 0xF2:                    // For SSE2
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   652
    switch (0xFF & *ip++) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   653
    case REX:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   654
    case REX_B:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   655
    case REX_X:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   656
    case REX_XB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   657
    case REX_R:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   658
    case REX_RB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   659
    case REX_RX:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   660
    case REX_RXB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   661
    case REX_W:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   662
    case REX_WB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   663
    case REX_WX:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   664
    case REX_WXB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   665
    case REX_WR:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   666
    case REX_WRB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   667
    case REX_WRX:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   668
    case REX_WRXB:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   669
      NOT_LP64(assert(false, "found 64bit prefix"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   670
      ip++;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   671
    default:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   672
      ip++;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   673
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   674
    debug_only(has_disp32 = true); // has both kinds of operands!
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   680
#undef REP8
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   681
#undef REP16
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
  assert(which != call32_operand, "instruction is not a call, jmp, or jcc");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   685
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   686
  assert(which != imm_operand, "instruction is not a movq reg, imm64");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   687
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   688
  // assert(which != imm_operand || has_imm32, "instruction has no imm32 field");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   689
  assert(which != imm_operand || has_disp32, "instruction has no imm32 field");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   690
#endif // LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   691
  assert(which != disp32_operand || has_disp32, "instruction has no disp32 field");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
  // parse the output of emit_operand
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
  int op2 = 0xFF & *ip++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
  int base = op2 & 0x07;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  int op3 = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
  const int b100 = 4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  const int b101 = 5;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
  if (base == b100 && (op2 >> 6) != 3) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
    op3 = 0xFF & *ip++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
    base = op3 & 0x07;   // refetch the base
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
  // now ip points at the disp (if any)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
  switch (op2 >> 6) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
  case 0:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
    // [00 reg  100][ss index base]
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   708
    // [00 reg  100][00   100  esp]
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
    // [00 reg base]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
    // [00 reg  100][ss index  101][disp32]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
    // [00 reg  101]               [disp32]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
    if (base == b101) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
      if (which == disp32_operand)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
        return ip;              // caller wants the disp32
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
      ip += 4;                  // skip the disp32
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
  case 1:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
    // [01 reg  100][ss index base][disp8]
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   722
    // [01 reg  100][00   100  esp][disp8]
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
    // [01 reg base]               [disp8]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
    ip += 1;                    // skip the disp8
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
  case 2:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
    // [10 reg  100][ss index base][disp32]
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   729
    // [10 reg  100][00   100  esp][disp32]
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
    // [10 reg base]               [disp32]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
    if (which == disp32_operand)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
      return ip;                // caller wants the disp32
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
    ip += 4;                    // skip the disp32
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
  case 3:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
    // [11 reg base]  (not a memory addressing mode)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
  if (which == end_pc_operand) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
    return ip + tail_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   745
#ifdef _LP64
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
   746
  assert(which == narrow_oop_operand && !is_64bit, "instruction is not a movl adr, imm32");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   747
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   748
  assert(which == imm_operand, "instruction has only an imm field");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   749
#endif // LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
  return ip;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
address Assembler::locate_next_instruction(address inst) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
  // Secretly share code with locate_operand:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
  return locate_operand(inst, end_pc_operand);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
void Assembler::check_relocation(RelocationHolder const& rspec, int format) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
  address inst = inst_mark();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
  assert(inst != NULL && inst < pc(), "must point to beginning of instruction");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
  address opnd;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
  Relocation* r = rspec.reloc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
  if (r->type() == relocInfo::none) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  } else if (r->is_call() || format == call32_operand) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
    // assert(format == imm32_operand, "cannot specify a nonzero format");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
    opnd = locate_operand(inst, call32_operand);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
  } else if (r->is_data()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   772
    assert(format == imm_operand || format == disp32_operand
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   773
           LP64_ONLY(|| format == narrow_oop_operand), "format ok");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
    opnd = locate_operand(inst, (WhichOperand)format);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
  } else {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   776
    assert(format == imm_operand, "cannot specify a format");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  assert(opnd == pc(), "must put operand where relocs can find it");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
}
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   781
#endif // ASSERT
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   782
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   783
void Assembler::emit_operand32(Register reg, Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   784
  assert(reg->encoding() < 8, "no extended registers");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   785
  assert(!adr.base_needs_rex() && !adr.index_needs_rex(), "no extended registers");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   786
  emit_operand(reg, adr._base, adr._index, adr._scale, adr._disp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   787
               adr._rspec);
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
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   790
void Assembler::emit_operand(Register reg, Address adr,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   791
                             int rip_relative_correction) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   792
  emit_operand(reg, adr._base, adr._index, adr._scale, adr._disp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   793
               adr._rspec,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   794
               rip_relative_correction);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   795
}
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
void Assembler::emit_operand(XMMRegister reg, Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   798
  emit_operand(reg, adr._base, adr._index, adr._scale, adr._disp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   799
               adr._rspec);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   800
}
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
// MMX operations
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   803
void Assembler::emit_operand(MMXRegister reg, Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   804
  assert(!adr.base_needs_rex() && !adr.index_needs_rex(), "no extended registers");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   805
  emit_operand((Register)reg, adr._base, adr._index, adr._scale, adr._disp, adr._rspec);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   806
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   807
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   808
// work around gcc (3.2.1-7a) bug
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   809
void Assembler::emit_operand(Address adr, MMXRegister reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   810
  assert(!adr.base_needs_rex() && !adr.index_needs_rex(), "no extended registers");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   811
  emit_operand((Register)reg, adr._base, adr._index, adr._scale, adr._disp, adr._rspec);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
void Assembler::emit_farith(int b1, int b2, int i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
  assert(isByte(b1) && isByte(b2), "wrong opcode");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  assert(0 <= i &&  i < 8, "illegal stack offset");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  emit_byte(b1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  emit_byte(b2 + i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   823
// Now the Assembler instructions (identical for 32/64 bits)
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   824
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   825
void Assembler::adcl(Address dst, int32_t imm32) {
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   826
  InstructionMark im(this);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   827
  prefix(dst);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   828
  emit_arith_operand(0x81, rdx, dst, imm32);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   829
}
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   830
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   831
void Assembler::adcl(Address dst, Register src) {
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   832
  InstructionMark im(this);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   833
  prefix(dst, src);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   834
  emit_byte(0x11);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   835
  emit_operand(src, dst);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
   836
}
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   837
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   838
void Assembler::adcl(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   839
  prefix(dst);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
  emit_arith(0x81, 0xD0, dst, imm32);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
void Assembler::adcl(Register dst, Address src) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
  InstructionMark im(this);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   845
  prefix(src, dst);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
  emit_byte(0x13);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  emit_operand(dst, src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
void Assembler::adcl(Register dst, Register src) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   851
  (void) prefix_and_encode(dst->encoding(), src->encoding());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
  emit_arith(0x13, 0xC0, dst, src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   855
void Assembler::addl(Address dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   856
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   857
  prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   858
  emit_arith_operand(0x81, rax, dst, imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   859
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
void Assembler::addl(Address dst, Register src) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
  InstructionMark im(this);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   863
  prefix(dst, src);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
  emit_byte(0x01);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
  emit_operand(src, dst);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   868
void Assembler::addl(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   869
  prefix(dst);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
  emit_arith(0x81, 0xC0, dst, imm32);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
void Assembler::addl(Register dst, Address src) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
  InstructionMark im(this);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   875
  prefix(src, dst);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
  emit_byte(0x03);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
  emit_operand(dst, src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
void Assembler::addl(Register dst, Register src) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   881
  (void) prefix_and_encode(dst->encoding(), src->encoding());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
  emit_arith(0x03, 0xC0, dst, src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
void Assembler::addr_nop_4() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
  // 4 bytes: NOP DWORD PTR [EAX+0]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
  emit_byte(0x0F);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
  emit_byte(0x1F);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
  emit_byte(0x40); // emit_rm(cbuf, 0x1, EAX_enc, EAX_enc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
  emit_byte(0);    // 8-bits offset (1 byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
void Assembler::addr_nop_5() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  // 5 bytes: NOP DWORD PTR [EAX+EAX*0+0] 8-bits offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
  emit_byte(0x0F);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
  emit_byte(0x1F);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
  emit_byte(0x44); // emit_rm(cbuf, 0x1, EAX_enc, 0x4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
  emit_byte(0x00); // emit_rm(cbuf, 0x0, EAX_enc, EAX_enc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
  emit_byte(0);    // 8-bits offset (1 byte)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
void Assembler::addr_nop_7() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  // 7 bytes: NOP DWORD PTR [EAX+0] 32-bits offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
  emit_byte(0x0F);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
  emit_byte(0x1F);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
  emit_byte(0x80); // emit_rm(cbuf, 0x2, EAX_enc, EAX_enc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
  emit_long(0);    // 32-bits offset (4 bytes)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
void Assembler::addr_nop_8() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
  // 8 bytes: NOP DWORD PTR [EAX+EAX*0+0] 32-bits offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
  emit_byte(0x0F);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
  emit_byte(0x1F);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
  emit_byte(0x84); // emit_rm(cbuf, 0x2, EAX_enc, 0x4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
  emit_byte(0x00); // emit_rm(cbuf, 0x0, EAX_enc, EAX_enc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
  emit_long(0);    // 32-bits offset (4 bytes)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   919
void Assembler::addsd(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   920
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   921
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   922
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   923
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   924
  emit_byte(0x58);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   925
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   926
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   927
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   928
void Assembler::addsd(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   929
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   930
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   931
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   932
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   933
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   934
  emit_byte(0x58);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   935
  emit_operand(dst, src);
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
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   938
void Assembler::addss(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   939
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   940
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   941
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   942
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   943
  emit_byte(0x58);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   944
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   945
}
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 Assembler::addss(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   948
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   949
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   950
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   951
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   952
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   953
  emit_byte(0x58);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   954
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   955
}
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 Assembler::andl(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   958
  prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   959
  emit_arith(0x81, 0xE0, dst, imm32);
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
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   962
void Assembler::andl(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   963
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   964
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   965
  emit_byte(0x23);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   966
  emit_operand(dst, src);
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
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   969
void Assembler::andl(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   970
  (void) prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   971
  emit_arith(0x23, 0xC0, dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   972
}
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 Assembler::andpd(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   975
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   976
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   977
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   978
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   979
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   980
  emit_byte(0x54);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   981
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   982
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   983
2862
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   984
void Assembler::bsfl(Register dst, Register src) {
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   985
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   986
  emit_byte(0x0F);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   987
  emit_byte(0xBC);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   988
  emit_byte(0xC0 | encode);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   989
}
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   990
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   991
void Assembler::bsrl(Register dst, Register src) {
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   992
  assert(!VM_Version::supports_lzcnt(), "encoding is treated as LZCNT");
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   993
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   994
  emit_byte(0x0F);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   995
  emit_byte(0xBD);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   996
  emit_byte(0xC0 | encode);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   997
}
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
   998
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   999
void Assembler::bswapl(Register reg) { // bswap
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1000
  int encode = prefix_and_encode(reg->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1001
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1002
  emit_byte(0xC8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1003
}
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 Assembler::call(Label& L, relocInfo::relocType rtype) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1006
  // suspect disp32 is always good
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1007
  int operand = LP64_ONLY(disp32_operand) NOT_LP64(imm_operand);
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
  if (L.is_bound()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1010
    const int long_size = 5;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1011
    int offs = (int)( target(L) - pc() );
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1012
    assert(offs <= 0, "assembler error");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1013
    InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1014
    // 1110 1000 #32-bit disp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1015
    emit_byte(0xE8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1016
    emit_data(offs - long_size, rtype, operand);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1017
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1018
    InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1019
    // 1110 1000 #32-bit disp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1020
    L.add_patch_at(code(), locator());
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
    emit_byte(0xE8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1023
    emit_data(int(0), rtype, operand);
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
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1026
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1027
void Assembler::call(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1028
  // This was originally using a 32bit register encoding
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1029
  // and surely we want 64bit!
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1030
  // this is a 32bit encoding but in 64bit mode the default
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1031
  // operand size is 64bit so there is no need for the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1032
  // wide prefix. So prefix only happens if we use the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1033
  // new registers. Much like push/pop.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1034
  int x = offset();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1035
  // this may be true but dbx disassembles it as if it
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1036
  // were 32bits...
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1037
  // int encode = prefix_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1038
  // if (offset() != x) assert(dst->encoding() >= 8, "what?");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1039
  int encode = prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1040
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1041
  emit_byte(0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1042
  emit_byte(0xD0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1043
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1044
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1045
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1046
void Assembler::call(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1047
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1048
  prefix(adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1049
  emit_byte(0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1050
  emit_operand(rdx, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1051
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1052
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1053
void Assembler::call_literal(address entry, RelocationHolder const& rspec) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1054
  assert(entry != NULL, "call most probably wrong");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1055
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1056
  emit_byte(0xE8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1057
  intptr_t disp = entry - (_code_pos + sizeof(int32_t));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1058
  assert(is_simm32(disp), "must be 32bit offset (call2)");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1059
  // Technically, should use call32_operand, but this format is
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1060
  // implied by the fact that we're emitting a call instruction.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1061
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1062
  int operand = LP64_ONLY(disp32_operand) NOT_LP64(call32_operand);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1063
  emit_data((int) disp, rspec, operand);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1064
}
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 Assembler::cdql() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1067
  emit_byte(0x99);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1068
}
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 Assembler::cmovl(Condition cc, Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1071
  NOT_LP64(guarantee(VM_Version::supports_cmov(), "illegal instruction"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1072
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
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(0x40 | cc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1075
  emit_byte(0xC0 | encode);
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
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1079
void Assembler::cmovl(Condition cc, Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1080
  NOT_LP64(guarantee(VM_Version::supports_cmov(), "illegal instruction"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1081
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1082
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1083
  emit_byte(0x40 | cc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1084
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1085
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1086
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1087
void Assembler::cmpb(Address dst, int imm8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1088
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1089
  prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1090
  emit_byte(0x80);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1091
  emit_operand(rdi, dst, 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1092
  emit_byte(imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1093
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1094
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1095
void Assembler::cmpl(Address dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1096
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1097
  prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1098
  emit_byte(0x81);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1099
  emit_operand(rdi, dst, 4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1100
  emit_long(imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1101
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1102
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1103
void Assembler::cmpl(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1104
  prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1105
  emit_arith(0x81, 0xF8, dst, imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1106
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1107
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1108
void Assembler::cmpl(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1109
  (void) prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1110
  emit_arith(0x3B, 0xC0, dst, src);
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
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
void Assembler::cmpl(Register dst, Address  src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1115
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1116
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1117
  emit_byte(0x3B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1118
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1119
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1120
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1121
void Assembler::cmpw(Address dst, int imm16) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1122
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1123
  assert(!dst.base_needs_rex() && !dst.index_needs_rex(), "no extended registers");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1124
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1125
  emit_byte(0x81);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1126
  emit_operand(rdi, dst, 2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1127
  emit_word(imm16);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1128
}
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
// The 32-bit cmpxchg compares the value at adr with the contents of rax,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1131
// and stores reg into adr if so; otherwise, the value at adr is loaded into rax,.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1132
// The ZF is set if the compared values were equal, and cleared otherwise.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1133
void Assembler::cmpxchgl(Register reg, Address adr) { // cmpxchg
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1134
  if (Atomics & 2) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1135
     // caveat: no instructionmark, so this isn't relocatable.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1136
     // Emit a synthetic, non-atomic, CAS equivalent.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1137
     // Beware.  The synthetic form sets all ICCs, not just ZF.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1138
     // cmpxchg r,[m] is equivalent to rax, = CAS (m, rax, r)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1139
     cmpl(rax, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1140
     movl(rax, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1141
     if (reg != rax) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1142
        Label L ;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1143
        jcc(Assembler::notEqual, L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1144
        movl(adr, reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1145
        bind(L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1146
     }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1147
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1148
     InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1149
     prefix(adr, reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1150
     emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1151
     emit_byte(0xB1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1152
     emit_operand(reg, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1153
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1154
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1155
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1156
void Assembler::comisd(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1157
  // NOTE: dbx seems to decode this as comiss even though the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1158
  // 0x66 is there. Strangly ucomisd comes out correct
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1159
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1160
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1161
  comiss(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1162
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1163
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1164
void Assembler::comiss(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1165
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1166
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1167
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1168
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1169
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1170
  emit_byte(0x2F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1171
  emit_operand(dst, 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
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1174
void Assembler::cvtdq2pd(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1175
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1176
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1177
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1178
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1179
  emit_byte(0xE6);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1180
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1181
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1182
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1183
void Assembler::cvtdq2ps(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1184
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1185
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1186
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1187
  emit_byte(0x5B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1188
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1189
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1190
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1191
void Assembler::cvtsd2ss(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1192
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1193
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1194
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1195
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1196
  emit_byte(0x5A);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1197
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1198
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1199
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1200
void Assembler::cvtsi2sdl(XMMRegister dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1201
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1202
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1203
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1204
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1205
  emit_byte(0x2A);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1206
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1207
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1208
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1209
void Assembler::cvtsi2ssl(XMMRegister dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1210
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1211
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1212
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1213
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1214
  emit_byte(0x2A);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1215
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1216
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1217
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1218
void Assembler::cvtss2sd(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1219
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1220
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1221
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1222
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1223
  emit_byte(0x5A);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1224
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1225
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1226
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1227
void Assembler::cvttsd2sil(Register dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1228
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1229
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1230
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1231
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1232
  emit_byte(0x2C);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1233
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1234
}
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 Assembler::cvttss2sil(Register dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1237
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1238
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1239
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1240
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1241
  emit_byte(0x2C);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1242
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1243
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1244
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1245
void Assembler::decl(Address dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1246
  // Don't use it directly. Use MacroAssembler::decrement() instead.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1247
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1248
  prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1249
  emit_byte(0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1250
  emit_operand(rcx, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1251
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1252
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1253
void Assembler::divsd(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1254
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1255
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1256
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1257
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1258
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1259
  emit_byte(0x5E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1260
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1261
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1262
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1263
void Assembler::divsd(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1264
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1265
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1266
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1267
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1268
  emit_byte(0x5E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1269
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1270
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1271
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1272
void Assembler::divss(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1273
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1274
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1275
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1276
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1277
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1278
  emit_byte(0x5E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1279
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1280
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1281
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1282
void Assembler::divss(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1283
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1284
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1285
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1286
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1287
  emit_byte(0x5E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1288
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1289
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1290
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1291
void Assembler::emms() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1292
  NOT_LP64(assert(VM_Version::supports_mmx(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1293
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1294
  emit_byte(0x77);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1295
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1296
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1297
void Assembler::hlt() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1298
  emit_byte(0xF4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1299
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1300
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1301
void Assembler::idivl(Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1302
  int encode = prefix_and_encode(src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1303
  emit_byte(0xF7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1304
  emit_byte(0xF8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1305
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1306
7121
69928525c55c 6997311: SIGFPE in new long division asm code
kvn
parents: 7115
diff changeset
  1307
void Assembler::divl(Register src) { // Unsigned
69928525c55c 6997311: SIGFPE in new long division asm code
kvn
parents: 7115
diff changeset
  1308
  int encode = prefix_and_encode(src->encoding());
69928525c55c 6997311: SIGFPE in new long division asm code
kvn
parents: 7115
diff changeset
  1309
  emit_byte(0xF7);
69928525c55c 6997311: SIGFPE in new long division asm code
kvn
parents: 7115
diff changeset
  1310
  emit_byte(0xF0 | encode);
69928525c55c 6997311: SIGFPE in new long division asm code
kvn
parents: 7115
diff changeset
  1311
}
69928525c55c 6997311: SIGFPE in new long division asm code
kvn
parents: 7115
diff changeset
  1312
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1313
void Assembler::imull(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1314
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1315
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1316
  emit_byte(0xAF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1317
  emit_byte(0xC0 | encode);
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
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1320
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1321
void Assembler::imull(Register dst, Register src, int value) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1322
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1323
  if (is8bit(value)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1324
    emit_byte(0x6B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1325
    emit_byte(0xC0 | encode);
7115
32300e243300 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 6772
diff changeset
  1326
    emit_byte(value & 0xFF);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1327
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1328
    emit_byte(0x69);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1329
    emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1330
    emit_long(value);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1331
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1332
}
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 Assembler::incl(Address dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1335
  // Don't use it directly. Use MacroAssembler::increment() instead.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1336
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1337
  prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1338
  emit_byte(0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1339
  emit_operand(rax, 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
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1342
void Assembler::jcc(Condition cc, Label& L, relocInfo::relocType rtype) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1343
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1344
  relocate(rtype);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1345
  assert((0 <= cc) && (cc < 16), "illegal cc");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1346
  if (L.is_bound()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1347
    address dst = target(L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1348
    assert(dst != NULL, "jcc most probably wrong");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1349
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1350
    const int short_size = 2;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1351
    const int long_size = 6;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1352
    intptr_t offs = (intptr_t)dst - (intptr_t)_code_pos;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1353
    if (rtype == relocInfo::none && is8bit(offs - short_size)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1354
      // 0111 tttn #8-bit disp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1355
      emit_byte(0x70 | cc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1356
      emit_byte((offs - short_size) & 0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1357
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1358
      // 0000 1111 1000 tttn #32-bit disp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1359
      assert(is_simm32(offs - long_size),
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1360
             "must be 32bit offset (call4)");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1361
      emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1362
      emit_byte(0x80 | cc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1363
      emit_long(offs - long_size);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1364
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1365
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1366
    // Note: could eliminate cond. jumps to this jump if condition
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1367
    //       is the same however, seems to be rather unlikely case.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1368
    // Note: use jccb() if label to be bound is very close to get
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1369
    //       an 8-bit displacement
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1370
    L.add_patch_at(code(), locator());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1371
    emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1372
    emit_byte(0x80 | cc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1373
    emit_long(0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1374
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1375
}
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 Assembler::jccb(Condition cc, Label& L) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1378
  if (L.is_bound()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1379
    const int short_size = 2;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1380
    address entry = target(L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1381
    assert(is8bit((intptr_t)entry - ((intptr_t)_code_pos + short_size)),
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1382
           "Dispacement too large for a short jmp");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1383
    intptr_t offs = (intptr_t)entry - (intptr_t)_code_pos;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1384
    // 0111 tttn #8-bit disp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1385
    emit_byte(0x70 | cc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1386
    emit_byte((offs - short_size) & 0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1387
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1388
    InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1389
    L.add_patch_at(code(), locator());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1390
    emit_byte(0x70 | cc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1391
    emit_byte(0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1392
  }
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
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1395
void Assembler::jmp(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1396
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1397
  prefix(adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1398
  emit_byte(0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1399
  emit_operand(rsp, adr);
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
void Assembler::jmp(Label& L, relocInfo::relocType rtype) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1403
  if (L.is_bound()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1404
    address entry = target(L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1405
    assert(entry != NULL, "jmp most probably wrong");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1406
    InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1407
    const int short_size = 2;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1408
    const int long_size = 5;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1409
    intptr_t offs = entry - _code_pos;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1410
    if (rtype == relocInfo::none && is8bit(offs - short_size)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1411
      emit_byte(0xEB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1412
      emit_byte((offs - short_size) & 0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1413
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1414
      emit_byte(0xE9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1415
      emit_long(offs - long_size);
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
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1418
    // By default, forward jumps are always 32-bit displacements, since
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1419
    // we can't yet know where the label will be bound.  If you're sure that
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1420
    // the forward jump will not run beyond 256 bytes, use jmpb to
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1421
    // force an 8-bit displacement.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1422
    InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1423
    relocate(rtype);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1424
    L.add_patch_at(code(), locator());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1425
    emit_byte(0xE9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1426
    emit_long(0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1427
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1428
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1429
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1430
void Assembler::jmp(Register entry) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1431
  int encode = prefix_and_encode(entry->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1432
  emit_byte(0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1433
  emit_byte(0xE0 | encode);
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
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1436
void Assembler::jmp_literal(address dest, RelocationHolder const& rspec) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1437
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1438
  emit_byte(0xE9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1439
  assert(dest != NULL, "must have a target");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1440
  intptr_t disp = dest - (_code_pos + sizeof(int32_t));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1441
  assert(is_simm32(disp), "must be 32bit offset (jmp)");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1442
  emit_data(disp, rspec.reloc(), call32_operand);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1443
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1444
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1445
void Assembler::jmpb(Label& L) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1446
  if (L.is_bound()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1447
    const int short_size = 2;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1448
    address entry = target(L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1449
    assert(is8bit((entry - _code_pos) + short_size),
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1450
           "Dispacement too large for a short jmp");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1451
    assert(entry != NULL, "jmp most probably wrong");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1452
    intptr_t offs = entry - _code_pos;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1453
    emit_byte(0xEB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1454
    emit_byte((offs - short_size) & 0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1455
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1456
    InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1457
    L.add_patch_at(code(), locator());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1458
    emit_byte(0xEB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1459
    emit_byte(0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1460
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1461
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1462
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1463
void Assembler::ldmxcsr( Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1464
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1465
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1466
  prefix(src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1467
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1468
  emit_byte(0xAE);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1469
  emit_operand(as_Register(2), src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1470
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1471
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1472
void Assembler::leal(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1473
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1474
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1475
  emit_byte(0x67); // addr32
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1476
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1477
#endif // LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1478
  emit_byte(0x8D);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1479
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1480
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1481
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1482
void Assembler::lock() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1483
  if (Atomics & 1) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1484
     // Emit either nothing, a NOP, or a NOP: prefix
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1485
     emit_byte(0x90) ;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1486
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1487
     emit_byte(0xF0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1488
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1489
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1490
2862
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  1491
void Assembler::lzcntl(Register dst, Register src) {
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  1492
  assert(VM_Version::supports_lzcnt(), "encoding is treated as BSR");
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  1493
  emit_byte(0xF3);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  1494
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  1495
  emit_byte(0x0F);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  1496
  emit_byte(0xBD);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  1497
  emit_byte(0xC0 | encode);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  1498
}
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  1499
2338
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1500
// Emit mfence instruction
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1501
void Assembler::mfence() {
2338
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1502
  NOT_LP64(assert(VM_Version::supports_sse2(), "unsupported");)
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1503
  emit_byte( 0x0F );
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1504
  emit_byte( 0xAE );
a8660a1b709b 6822204: volatile fences should prefer lock:addl to actual mfence instructions
never
parents: 2332
diff changeset
  1505
  emit_byte( 0xF0 );
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1506
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1507
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1508
void Assembler::mov(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1509
  LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1510
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1511
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1512
void Assembler::movapd(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1513
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1514
  int dstenc = dst->encoding();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1515
  int srcenc = src->encoding();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1516
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1517
  if (dstenc < 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1518
    if (srcenc >= 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1519
      prefix(REX_B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1520
      srcenc -= 8;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1521
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1522
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1523
    if (srcenc < 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1524
      prefix(REX_R);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1525
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1526
      prefix(REX_RB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1527
      srcenc -= 8;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1528
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1529
    dstenc -= 8;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1530
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1531
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1532
  emit_byte(0x28);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1533
  emit_byte(0xC0 | dstenc << 3 | srcenc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1534
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1535
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1536
void Assembler::movaps(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1537
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1538
  int dstenc = dst->encoding();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1539
  int srcenc = src->encoding();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1540
  if (dstenc < 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1541
    if (srcenc >= 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1542
      prefix(REX_B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1543
      srcenc -= 8;
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
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1546
    if (srcenc < 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1547
      prefix(REX_R);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1548
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1549
      prefix(REX_RB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1550
      srcenc -= 8;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1551
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1552
    dstenc -= 8;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1553
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1554
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1555
  emit_byte(0x28);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1556
  emit_byte(0xC0 | dstenc << 3 | srcenc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1557
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1558
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1559
void Assembler::movb(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1560
  NOT_LP64(assert(dst->has_byte_register(), "must have byte register"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1561
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1562
  prefix(src, dst, true);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1563
  emit_byte(0x8A);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1564
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1565
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1566
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1567
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1568
void Assembler::movb(Address dst, int imm8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1569
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1570
   prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1571
  emit_byte(0xC6);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1572
  emit_operand(rax, dst, 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1573
  emit_byte(imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1574
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1575
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1576
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1577
void Assembler::movb(Address dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1578
  assert(src->has_byte_register(), "must have byte register");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1579
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1580
  prefix(dst, src, true);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1581
  emit_byte(0x88);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1582
  emit_operand(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1583
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1584
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1585
void Assembler::movdl(XMMRegister dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1586
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1587
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1588
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1589
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1590
  emit_byte(0x6E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1591
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1592
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1593
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1594
void Assembler::movdl(Register dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1595
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1596
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1597
  // swap src/dst to get correct prefix
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1598
  int encode = prefix_and_encode(src->encoding(), dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1599
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1600
  emit_byte(0x7E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1601
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1602
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1603
8494
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1604
void Assembler::movdl(XMMRegister dst, Address src) {
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1605
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1606
  InstructionMark im(this);
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1607
  emit_byte(0x66);
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1608
  prefix(src, dst);
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1609
  emit_byte(0x0F);
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1610
  emit_byte(0x6E);
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1611
  emit_operand(dst, src);
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1612
}
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1613
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  1614
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1615
void Assembler::movdqa(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1616
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1617
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1618
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1619
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1620
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1621
  emit_byte(0x6F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1622
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1623
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1624
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1625
void Assembler::movdqa(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1626
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1627
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1628
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1629
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1630
  emit_byte(0x6F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1631
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1632
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1633
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1634
void Assembler::movdqa(Address dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1635
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1636
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1637
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1638
  prefix(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1639
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1640
  emit_byte(0x7F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1641
  emit_operand(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1642
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1643
1437
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1644
void Assembler::movdqu(XMMRegister dst, Address src) {
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1645
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1646
  InstructionMark im(this);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1647
  emit_byte(0xF3);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1648
  prefix(src, dst);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1649
  emit_byte(0x0F);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1650
  emit_byte(0x6F);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1651
  emit_operand(dst, src);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1652
}
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1653
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1654
void Assembler::movdqu(XMMRegister dst, XMMRegister src) {
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1655
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1656
  emit_byte(0xF3);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1657
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1658
  emit_byte(0x0F);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1659
  emit_byte(0x6F);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1660
  emit_byte(0xC0 | encode);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1661
}
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1662
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1663
void Assembler::movdqu(Address dst, XMMRegister src) {
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1664
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1665
  InstructionMark im(this);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1666
  emit_byte(0xF3);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1667
  prefix(dst, src);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1668
  emit_byte(0x0F);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1669
  emit_byte(0x7F);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1670
  emit_operand(src, dst);
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1671
}
d1846c1c04c4 6532536: Optimize arraycopy stubs for Intel cpus
kvn
parents: 1394
diff changeset
  1672
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1673
// Uses zero extension on 64bit
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1674
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1675
void Assembler::movl(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1676
  int encode = prefix_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1677
  emit_byte(0xB8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1678
  emit_long(imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1679
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1680
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1681
void Assembler::movl(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1682
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1683
  emit_byte(0x8B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1684
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1685
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1686
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1687
void Assembler::movl(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1688
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1689
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1690
  emit_byte(0x8B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1691
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1692
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1693
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1694
void Assembler::movl(Address dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1695
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1696
  prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1697
  emit_byte(0xC7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1698
  emit_operand(rax, dst, 4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1699
  emit_long(imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1700
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1701
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1702
void Assembler::movl(Address dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1703
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1704
  prefix(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1705
  emit_byte(0x89);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1706
  emit_operand(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1707
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1708
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1709
// New cpus require to use movsd and movss to avoid partial register stall
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1710
// 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
  1711
// The selection is done in MacroAssembler::movdbl() and movflt().
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1712
void Assembler::movlpd(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1713
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1714
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1715
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1716
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1717
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1718
  emit_byte(0x12);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1719
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1720
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1721
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1722
void Assembler::movq( MMXRegister dst, Address src ) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1723
  assert( VM_Version::supports_mmx(), "" );
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1724
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1725
  emit_byte(0x6F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1726
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1727
}
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 Assembler::movq( Address dst, MMXRegister src ) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1730
  assert( VM_Version::supports_mmx(), "" );
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1731
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1732
  emit_byte(0x7F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1733
  // workaround gcc (3.2.1-7a) bug
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1734
  // In that version of gcc with only an emit_operand(MMX, Address)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1735
  // gcc will tail jump and try and reverse the parameters completely
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1736
  // obliterating dst in the process. By having a version available
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1737
  // that doesn't need to swap the args at the tail jump the bug is
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1738
  // avoided.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1739
  emit_operand(dst, src);
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
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1742
void Assembler::movq(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1743
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1744
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1745
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1746
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1747
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1748
  emit_byte(0x7E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1749
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1750
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1751
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1752
void Assembler::movq(Address dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1753
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1754
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1755
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1756
  prefix(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1757
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1758
  emit_byte(0xD6);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1759
  emit_operand(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1760
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1761
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1762
void Assembler::movsbl(Register dst, Address src) { // movsxb
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1763
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1764
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1765
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1766
  emit_byte(0xBE);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1767
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1768
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1769
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1770
void Assembler::movsbl(Register dst, Register src) { // movsxb
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1771
  NOT_LP64(assert(src->has_byte_register(), "must have byte register"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1772
  int encode = prefix_and_encode(dst->encoding(), src->encoding(), true);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1773
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1774
  emit_byte(0xBE);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1775
  emit_byte(0xC0 | encode);
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
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1778
void Assembler::movsd(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1779
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1780
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1781
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1782
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1783
  emit_byte(0x10);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1784
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1785
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1786
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1787
void Assembler::movsd(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1788
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1789
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1790
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1791
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1792
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1793
  emit_byte(0x10);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1794
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1795
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1796
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1797
void Assembler::movsd(Address dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1798
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1799
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1800
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1801
  prefix(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1802
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1803
  emit_byte(0x11);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1804
  emit_operand(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1805
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1806
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1807
void Assembler::movss(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1808
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1809
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1810
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1811
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1812
  emit_byte(0x10);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1813
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1814
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1815
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1816
void Assembler::movss(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1817
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1818
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1819
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1820
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1821
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1822
  emit_byte(0x10);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1823
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1824
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1825
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1826
void Assembler::movss(Address dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1827
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1828
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1829
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1830
  prefix(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1831
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1832
  emit_byte(0x11);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1833
  emit_operand(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1834
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1835
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1836
void Assembler::movswl(Register dst, Address src) { // movsxw
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1837
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1838
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1839
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1840
  emit_byte(0xBF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1841
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1842
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1843
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1844
void Assembler::movswl(Register dst, Register src) { // movsxw
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1845
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1846
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1847
  emit_byte(0xBF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1848
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1849
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1850
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1851
void Assembler::movw(Address dst, int imm16) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1852
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1853
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1854
  emit_byte(0x66); // switch to 16-bit mode
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1855
  prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1856
  emit_byte(0xC7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1857
  emit_operand(rax, dst, 2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1858
  emit_word(imm16);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1859
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1860
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1861
void Assembler::movw(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1862
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1863
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1864
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1865
  emit_byte(0x8B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1866
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1867
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1868
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1869
void Assembler::movw(Address dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1870
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1871
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1872
  prefix(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1873
  emit_byte(0x89);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1874
  emit_operand(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1875
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1876
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1877
void Assembler::movzbl(Register dst, Address src) { // movzxb
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1878
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1879
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1880
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1881
  emit_byte(0xB6);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1882
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1883
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1884
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1885
void Assembler::movzbl(Register dst, Register src) { // movzxb
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1886
  NOT_LP64(assert(src->has_byte_register(), "must have byte register"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1887
  int encode = prefix_and_encode(dst->encoding(), src->encoding(), true);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1888
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1889
  emit_byte(0xB6);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1890
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1891
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1892
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1893
void Assembler::movzwl(Register dst, Address src) { // movzxw
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1894
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1895
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1896
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1897
  emit_byte(0xB7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1898
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1899
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1900
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1901
void Assembler::movzwl(Register dst, Register src) { // movzxw
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1902
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1903
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1904
  emit_byte(0xB7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1905
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1906
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1907
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1908
void Assembler::mull(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1909
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1910
  prefix(src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1911
  emit_byte(0xF7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1912
  emit_operand(rsp, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1913
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1914
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1915
void Assembler::mull(Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1916
  int encode = prefix_and_encode(src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1917
  emit_byte(0xF7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1918
  emit_byte(0xE0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1919
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1920
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1921
void Assembler::mulsd(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1922
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1923
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1924
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1925
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1926
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1927
  emit_byte(0x59);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1928
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1929
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1930
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1931
void Assembler::mulsd(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1932
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1933
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1934
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1935
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1936
  emit_byte(0x59);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1937
  emit_byte(0xC0 | encode);
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
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1940
void Assembler::mulss(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1941
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1942
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1943
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1944
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1945
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1946
  emit_byte(0x59);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1947
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1948
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1949
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1950
void Assembler::mulss(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1951
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1952
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1953
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1954
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1955
  emit_byte(0x59);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1956
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1957
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1958
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1959
void Assembler::negl(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1960
  int encode = prefix_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1961
  emit_byte(0xF7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1962
  emit_byte(0xD8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1963
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1964
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1965
void Assembler::nop(int i) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1966
#ifdef ASSERT
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1967
  assert(i > 0, " ");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1968
  // The fancy nops aren't currently recognized by debuggers making it a
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1969
  // pain to disassemble code while debugging. If asserts are on clearly
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1970
  // speed is not an issue so simply use the single byte traditional nop
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1971
  // to do alignment.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1972
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1973
  for (; i > 0 ; i--) emit_byte(0x90);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1974
  return;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1975
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1976
#endif // ASSERT
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1977
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1978
  if (UseAddressNop && VM_Version::is_intel()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1979
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1980
    // Using multi-bytes nops "0x0F 0x1F [address]" for Intel
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1981
    //  1: 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1982
    //  2: 0x66 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1983
    //  3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1984
    //  4: 0x0F 0x1F 0x40 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1985
    //  5: 0x0F 0x1F 0x44 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1986
    //  6: 0x66 0x0F 0x1F 0x44 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1987
    //  7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1988
    //  8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1989
    //  9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1990
    // 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1991
    // 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1992
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1993
    // The rest coding is Intel specific - don't use consecutive address nops
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1994
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1995
    // 12: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1996
    // 13: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
    // 14: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1998
    // 15: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x66 0x66 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1999
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2000
    while(i >= 15) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2001
      // For Intel don't generate consecutive addess nops (mix with regular nops)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2002
      i -= 15;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2003
      emit_byte(0x66);   // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2004
      emit_byte(0x66);   // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2005
      emit_byte(0x66);   // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2006
      addr_nop_8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2007
      emit_byte(0x66);   // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2008
      emit_byte(0x66);   // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2009
      emit_byte(0x66);   // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2010
      emit_byte(0x90);   // nop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2011
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2012
    switch (i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2013
      case 14:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2014
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2015
      case 13:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2016
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2017
      case 12:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2018
        addr_nop_8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2019
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2020
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2021
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2022
        emit_byte(0x90); // nop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2023
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2024
      case 11:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2025
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2026
      case 10:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2027
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2028
      case 9:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2029
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2030
      case 8:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2031
        addr_nop_8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2032
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2033
      case 7:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
        addr_nop_7();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
      case 6:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2037
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2038
      case 5:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2039
        addr_nop_5();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2040
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
      case 4:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2042
        addr_nop_4();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2044
      case 3:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
        // Don't use "0x0F 0x1F 0x00" - need patching safe padding
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2047
      case 2:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
      case 1:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2050
        emit_byte(0x90); // nop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2052
      default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2053
        assert(i == 0, " ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2054
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2055
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2056
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2057
  if (UseAddressNop && VM_Version::is_amd()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2058
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2059
    // Using multi-bytes nops "0x0F 0x1F [address]" for AMD.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2060
    //  1: 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2061
    //  2: 0x66 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2062
    //  3: 0x66 0x66 0x90 (don't use "0x0F 0x1F 0x00" - need patching safe padding)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2063
    //  4: 0x0F 0x1F 0x40 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2064
    //  5: 0x0F 0x1F 0x44 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2065
    //  6: 0x66 0x0F 0x1F 0x44 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2066
    //  7: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2067
    //  8: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2068
    //  9: 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2069
    // 10: 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2070
    // 11: 0x66 0x66 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2071
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2072
    // The rest coding is AMD specific - use consecutive address nops
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2073
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2074
    // 12: 0x66 0x0F 0x1F 0x44 0x00 0x00 0x66 0x0F 0x1F 0x44 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2075
    // 13: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00 0x66 0x0F 0x1F 0x44 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2076
    // 14: 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2077
    // 15: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2078
    // 16: 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2079
    //     Size prefixes (0x66) are added for larger sizes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2080
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2081
    while(i >= 22) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2082
      i -= 11;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2083
      emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2084
      emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2085
      emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2086
      addr_nop_8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2087
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2088
    // Generate first nop for size between 21-12
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2089
    switch (i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2090
      case 21:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2091
        i -= 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2092
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2093
      case 20:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2094
      case 19:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2095
        i -= 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2096
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2097
      case 18:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2098
      case 17:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2099
        i -= 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2100
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2101
      case 16:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2102
      case 15:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2103
        i -= 8;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2104
        addr_nop_8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2105
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2106
      case 14:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2107
      case 13:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2108
        i -= 7;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2109
        addr_nop_7();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2110
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2111
      case 12:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2112
        i -= 6;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2113
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2114
        addr_nop_5();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2115
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2116
      default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2117
        assert(i < 12, " ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2118
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2119
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2120
    // Generate second nop for size between 11-1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2121
    switch (i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2122
      case 11:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2123
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2124
      case 10:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2125
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2126
      case 9:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2127
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2128
      case 8:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2129
        addr_nop_8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2130
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2131
      case 7:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2132
        addr_nop_7();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2133
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2134
      case 6:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2135
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2136
      case 5:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2137
        addr_nop_5();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2138
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2139
      case 4:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2140
        addr_nop_4();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2141
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2142
      case 3:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2143
        // Don't use "0x0F 0x1F 0x00" - need patching safe padding
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2144
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2145
      case 2:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2146
        emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2147
      case 1:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2148
        emit_byte(0x90); // nop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2149
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2150
      default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2151
        assert(i == 0, " ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2152
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2153
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2154
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2155
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2156
  // Using nops with size prefixes "0x66 0x90".
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2157
  // From AMD Optimization Guide:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2158
  //  1: 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2159
  //  2: 0x66 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2160
  //  3: 0x66 0x66 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2161
  //  4: 0x66 0x66 0x66 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2162
  //  5: 0x66 0x66 0x90 0x66 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2163
  //  6: 0x66 0x66 0x90 0x66 0x66 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2164
  //  7: 0x66 0x66 0x66 0x90 0x66 0x66 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2165
  //  8: 0x66 0x66 0x66 0x90 0x66 0x66 0x66 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2166
  //  9: 0x66 0x66 0x90 0x66 0x66 0x90 0x66 0x66 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2167
  // 10: 0x66 0x66 0x66 0x90 0x66 0x66 0x90 0x66 0x66 0x90
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2168
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2169
  while(i > 12) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2170
    i -= 4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2171
    emit_byte(0x66); // size prefix
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2172
    emit_byte(0x66);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2173
    emit_byte(0x66);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2174
    emit_byte(0x90); // nop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2175
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2176
  // 1 - 12 nops
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2177
  if(i > 8) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2178
    if(i > 9) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2179
      i -= 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2180
      emit_byte(0x66);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2181
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2182
    i -= 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2183
    emit_byte(0x66);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2184
    emit_byte(0x66);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2185
    emit_byte(0x90);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2186
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2187
  // 1 - 8 nops
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2188
  if(i > 4) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2189
    if(i > 6) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2190
      i -= 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2191
      emit_byte(0x66);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2192
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2193
    i -= 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2194
    emit_byte(0x66);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2195
    emit_byte(0x66);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2196
    emit_byte(0x90);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2197
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2198
  switch (i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2199
    case 4:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2200
      emit_byte(0x66);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2201
    case 3:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2202
      emit_byte(0x66);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2203
    case 2:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2204
      emit_byte(0x66);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2205
    case 1:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2206
      emit_byte(0x90);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2207
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2208
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2209
      assert(i == 0, " ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2210
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2211
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2212
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2213
void Assembler::notl(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2214
  int encode = prefix_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2215
  emit_byte(0xF7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2216
  emit_byte(0xD0 | encode );
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2217
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2218
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2219
void Assembler::orl(Address dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2220
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2221
  prefix(dst);
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
  2222
  emit_arith_operand(0x81, rcx, dst, imm32);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2223
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2224
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2225
void Assembler::orl(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2226
  prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2227
  emit_arith(0x81, 0xC8, dst, imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2228
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2229
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2230
void Assembler::orl(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2231
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2232
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2233
  emit_byte(0x0B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2234
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2235
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2236
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2237
void Assembler::orl(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2238
  (void) prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2239
  emit_arith(0x0B, 0xC0, dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2240
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2241
2348
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2242
void Assembler::pcmpestri(XMMRegister dst, Address src, int imm8) {
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2243
  assert(VM_Version::supports_sse4_2(), "");
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2244
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2245
  InstructionMark im(this);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2246
  emit_byte(0x66);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2247
  prefix(src, dst);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2248
  emit_byte(0x0F);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2249
  emit_byte(0x3A);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2250
  emit_byte(0x61);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2251
  emit_operand(dst, src);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2252
  emit_byte(imm8);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2253
}
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2254
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2255
void Assembler::pcmpestri(XMMRegister dst, XMMRegister src, int imm8) {
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2256
  assert(VM_Version::supports_sse4_2(), "");
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2257
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2258
  emit_byte(0x66);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2259
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2260
  emit_byte(0x0F);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2261
  emit_byte(0x3A);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2262
  emit_byte(0x61);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2263
  emit_byte(0xC0 | encode);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2264
  emit_byte(imm8);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2265
}
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2266
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2267
// generic
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2268
void Assembler::pop(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2269
  int encode = prefix_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2270
  emit_byte(0x58 | encode);
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
2255
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2273
void Assembler::popcntl(Register dst, Address src) {
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2274
  assert(VM_Version::supports_popcnt(), "must support");
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2275
  InstructionMark im(this);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2276
  emit_byte(0xF3);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2277
  prefix(src, dst);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2278
  emit_byte(0x0F);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2279
  emit_byte(0xB8);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2280
  emit_operand(dst, src);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2281
}
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2282
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2283
void Assembler::popcntl(Register dst, Register src) {
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2284
  assert(VM_Version::supports_popcnt(), "must support");
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2285
  emit_byte(0xF3);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2286
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2287
  emit_byte(0x0F);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2288
  emit_byte(0xB8);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2289
  emit_byte(0xC0 | encode);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2290
}
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  2291
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2292
void Assembler::popf() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2293
  emit_byte(0x9D);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2294
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2295
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  2296
#ifndef _LP64 // no 32bit push/pop on amd64
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2297
void Assembler::popl(Address dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2298
  // NOTE: this will adjust stack by 8byte on 64bits
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2299
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2300
  prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2301
  emit_byte(0x8F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2302
  emit_operand(rax, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2303
}
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  2304
#endif
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2305
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2306
void Assembler::prefetch_prefix(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2307
  prefix(src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2308
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2309
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2310
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2311
void Assembler::prefetchnta(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2312
  NOT_LP64(assert(VM_Version::supports_sse2(), "must support"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2313
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2314
  prefetch_prefix(src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2315
  emit_byte(0x18);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2316
  emit_operand(rax, src); // 0, src
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2317
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2318
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2319
void Assembler::prefetchr(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2320
  NOT_LP64(assert(VM_Version::supports_3dnow(), "must support"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2321
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2322
  prefetch_prefix(src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2323
  emit_byte(0x0D);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2324
  emit_operand(rax, src); // 0, src
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2325
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2326
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2327
void Assembler::prefetcht0(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2328
  NOT_LP64(assert(VM_Version::supports_sse(), "must support"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2329
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2330
  prefetch_prefix(src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2331
  emit_byte(0x18);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2332
  emit_operand(rcx, src); // 1, src
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2333
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2334
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2335
void Assembler::prefetcht1(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2336
  NOT_LP64(assert(VM_Version::supports_sse(), "must support"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2337
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2338
  prefetch_prefix(src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2339
  emit_byte(0x18);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2340
  emit_operand(rdx, src); // 2, src
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2341
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2342
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2343
void Assembler::prefetcht2(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2344
  NOT_LP64(assert(VM_Version::supports_sse(), "must support"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2345
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2346
  prefetch_prefix(src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2347
  emit_byte(0x18);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2348
  emit_operand(rbx, src); // 3, src
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2349
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2350
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2351
void Assembler::prefetchw(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2352
  NOT_LP64(assert(VM_Version::supports_3dnow(), "must support"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2353
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2354
  prefetch_prefix(src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2355
  emit_byte(0x0D);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2356
  emit_operand(rcx, src); // 1, src
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2357
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2358
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2359
void Assembler::prefix(Prefix p) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2360
  a_byte(p);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2361
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2362
8332
3320859e937a 7016474: string compare intrinsic improvements
never
parents: 8328
diff changeset
  2363
void Assembler::por(XMMRegister dst, XMMRegister src) {
3320859e937a 7016474: string compare intrinsic improvements
never
parents: 8328
diff changeset
  2364
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
3320859e937a 7016474: string compare intrinsic improvements
never
parents: 8328
diff changeset
  2365
3320859e937a 7016474: string compare intrinsic improvements
never
parents: 8328
diff changeset
  2366
  emit_byte(0x66);
3320859e937a 7016474: string compare intrinsic improvements
never
parents: 8328
diff changeset
  2367
  int  encode = prefix_and_encode(dst->encoding(), src->encoding());
3320859e937a 7016474: string compare intrinsic improvements
never
parents: 8328
diff changeset
  2368
  emit_byte(0x0F);
3320859e937a 7016474: string compare intrinsic improvements
never
parents: 8328
diff changeset
  2369
3320859e937a 7016474: string compare intrinsic improvements
never
parents: 8328
diff changeset
  2370
  emit_byte(0xEB);
3320859e937a 7016474: string compare intrinsic improvements
never
parents: 8328
diff changeset
  2371
  emit_byte(0xC0 | encode);
3320859e937a 7016474: string compare intrinsic improvements
never
parents: 8328
diff changeset
  2372
}
3320859e937a 7016474: string compare intrinsic improvements
never
parents: 8328
diff changeset
  2373
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2374
void Assembler::pshufd(XMMRegister dst, XMMRegister src, int mode) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2375
  assert(isByte(mode), "invalid value");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2376
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2377
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2378
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2379
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2380
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2381
  emit_byte(0x70);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2382
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2383
  emit_byte(mode & 0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2384
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2385
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2386
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2387
void Assembler::pshufd(XMMRegister dst, Address src, int mode) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2388
  assert(isByte(mode), "invalid value");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2389
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2390
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2391
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2392
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2393
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2394
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2395
  emit_byte(0x70);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2396
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2397
  emit_byte(mode & 0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2398
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2399
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2400
void Assembler::pshuflw(XMMRegister dst, XMMRegister src, int mode) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2401
  assert(isByte(mode), "invalid value");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2402
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2403
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2404
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2405
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2406
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2407
  emit_byte(0x70);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2408
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2409
  emit_byte(mode & 0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2410
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2411
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2412
void Assembler::pshuflw(XMMRegister dst, Address src, int mode) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2413
  assert(isByte(mode), "invalid value");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2414
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2415
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2416
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2417
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2418
  prefix(src, dst); // QQ new
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2419
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2420
  emit_byte(0x70);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2421
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2422
  emit_byte(mode & 0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2423
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2424
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2425
void Assembler::psrlq(XMMRegister dst, int shift) {
8494
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2426
  // Shift 64 bit value logically right by specified number of bits.
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2427
  // HMM Table D-1 says sse2 or mmx.
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2428
  // Do not confuse it with psrldq SSE2 instruction which
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2429
  // shifts 128 bit value in xmm register by number of bytes.
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2430
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2431
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2432
  int encode = prefixq_and_encode(xmm2->encoding(), dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2433
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2434
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2435
  emit_byte(0x73);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2436
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2437
  emit_byte(shift);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2438
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2439
8494
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2440
void Assembler::psrldq(XMMRegister dst, int shift) {
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2441
  // Shift 128 bit value in xmm register by number of bytes.
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2442
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2443
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2444
  int encode = prefixq_and_encode(xmm3->encoding(), dst->encoding());
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2445
  emit_byte(0x66);
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2446
  emit_byte(0x0F);
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2447
  emit_byte(0x73);
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2448
  emit_byte(0xC0 | encode);
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2449
  emit_byte(shift);
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2450
}
4258c78226d9 6942326: x86 code in string_indexof() could read beyond reserved heap space
kvn
parents: 8332
diff changeset
  2451
2348
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2452
void Assembler::ptest(XMMRegister dst, Address src) {
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2453
  assert(VM_Version::supports_sse4_1(), "");
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2454
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2455
  InstructionMark im(this);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2456
  emit_byte(0x66);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2457
  prefix(src, dst);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2458
  emit_byte(0x0F);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2459
  emit_byte(0x38);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2460
  emit_byte(0x17);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2461
  emit_operand(dst, src);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2462
}
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2463
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2464
void Assembler::ptest(XMMRegister dst, XMMRegister src) {
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2465
  assert(VM_Version::supports_sse4_1(), "");
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2466
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2467
  emit_byte(0x66);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2468
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2469
  emit_byte(0x0F);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2470
  emit_byte(0x38);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2471
  emit_byte(0x17);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2472
  emit_byte(0xC0 | encode);
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2473
}
4e71ed4c2709 6761600: Use sse 4.2 in intrinsics
cfang
parents: 2338
diff changeset
  2474
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2475
void Assembler::punpcklbw(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2476
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2477
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2478
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2479
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2480
  emit_byte(0x60);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2481
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2482
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2483
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2484
void Assembler::push(int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2485
  // in 64bits we push 64bits onto the stack but only
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2486
  // take a 32bit immediate
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2487
  emit_byte(0x68);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2488
  emit_long(imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2489
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2490
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2491
void Assembler::push(Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2492
  int encode = prefix_and_encode(src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2493
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2494
  emit_byte(0x50 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2495
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2496
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2497
void Assembler::pushf() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2498
  emit_byte(0x9C);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2499
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2500
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  2501
#ifndef _LP64 // no 32bit push/pop on amd64
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2502
void Assembler::pushl(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2503
  // Note this will push 64bit on 64bit
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2504
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2505
  prefix(src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2506
  emit_byte(0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2507
  emit_operand(rsi, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2508
}
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  2509
#endif
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2510
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2511
void Assembler::pxor(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2512
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2513
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2514
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2515
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2516
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2517
  emit_byte(0xEF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2518
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2519
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2520
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2521
void Assembler::pxor(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2522
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2523
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2524
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2525
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2526
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2527
  emit_byte(0xEF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2528
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2529
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2530
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2531
void Assembler::rcll(Register dst, int imm8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2532
  assert(isShiftCount(imm8), "illegal shift count");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2533
  int encode = prefix_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2534
  if (imm8 == 1) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2535
    emit_byte(0xD1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2536
    emit_byte(0xD0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2537
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2538
    emit_byte(0xC1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2539
    emit_byte(0xD0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2540
    emit_byte(imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2541
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2542
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2543
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2544
// copies data from [esi] to [edi] using rcx pointer sized words
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2545
// generic
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2546
void Assembler::rep_mov() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2547
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2548
  // MOVSQ
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2549
  LP64_ONLY(prefix(REX_W));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2550
  emit_byte(0xA5);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2551
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2552
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2553
// sets rcx pointer sized words with rax, value at [edi]
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2554
// generic
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2555
void Assembler::rep_set() { // rep_set
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2556
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2557
  // STOSQ
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2558
  LP64_ONLY(prefix(REX_W));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2559
  emit_byte(0xAB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2560
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2561
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2562
// scans rcx pointer sized words at [edi] for occurance of rax,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2563
// generic
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2564
void Assembler::repne_scan() { // repne_scan
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2565
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2566
  // SCASQ
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2567
  LP64_ONLY(prefix(REX_W));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2568
  emit_byte(0xAF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2569
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2570
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2571
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2572
// scans rcx 4 byte words at [edi] for occurance of rax,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2573
// generic
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2574
void Assembler::repne_scanl() { // repne_scan
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2575
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2576
  // SCASL
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2577
  emit_byte(0xAF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2578
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2579
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2580
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2581
void Assembler::ret(int imm16) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2582
  if (imm16 == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2583
    emit_byte(0xC3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2584
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2585
    emit_byte(0xC2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2586
    emit_word(imm16);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2587
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2588
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2589
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2590
void Assembler::sahf() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2591
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2592
  // Not supported in 64bit mode
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2593
  ShouldNotReachHere();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2594
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2595
  emit_byte(0x9E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2596
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2597
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2598
void Assembler::sarl(Register dst, int imm8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2599
  int encode = prefix_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2600
  assert(isShiftCount(imm8), "illegal shift count");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2601
  if (imm8 == 1) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2602
    emit_byte(0xD1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2603
    emit_byte(0xF8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2604
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2605
    emit_byte(0xC1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2606
    emit_byte(0xF8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2607
    emit_byte(imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2608
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2609
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2610
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2611
void Assembler::sarl(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2612
  int encode = prefix_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2613
  emit_byte(0xD3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2614
  emit_byte(0xF8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2615
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2616
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2617
void Assembler::sbbl(Address dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2618
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2619
  prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2620
  emit_arith_operand(0x81, rbx, dst, imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2621
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2622
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2623
void Assembler::sbbl(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2624
  prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2625
  emit_arith(0x81, 0xD8, dst, imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2626
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2627
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2628
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2629
void Assembler::sbbl(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2630
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2631
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2632
  emit_byte(0x1B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2633
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2634
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2635
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2636
void Assembler::sbbl(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2637
  (void) prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2638
  emit_arith(0x1B, 0xC0, dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2639
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2640
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2641
void Assembler::setb(Condition cc, Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2642
  assert(0 <= cc && cc < 16, "illegal cc");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2643
  int encode = prefix_and_encode(dst->encoding(), true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2644
  emit_byte(0x0F);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2645
  emit_byte(0x90 | cc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2646
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2647
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2648
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2649
void Assembler::shll(Register dst, int imm8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2650
  assert(isShiftCount(imm8), "illegal shift count");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2651
  int encode = prefix_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2652
  if (imm8 == 1 ) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2653
    emit_byte(0xD1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2654
    emit_byte(0xE0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2655
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2656
    emit_byte(0xC1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2657
    emit_byte(0xE0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2658
    emit_byte(imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2659
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2660
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2661
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2662
void Assembler::shll(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2663
  int encode = prefix_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2664
  emit_byte(0xD3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2665
  emit_byte(0xE0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2666
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2667
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2668
void Assembler::shrl(Register dst, int imm8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2669
  assert(isShiftCount(imm8), "illegal shift count");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2670
  int encode = prefix_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2671
  emit_byte(0xC1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2672
  emit_byte(0xE8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2673
  emit_byte(imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2674
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2675
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2676
void Assembler::shrl(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2677
  int encode = prefix_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2678
  emit_byte(0xD3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2679
  emit_byte(0xE8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2680
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2681
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2682
// copies a single word from [esi] to [edi]
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2683
void Assembler::smovl() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2684
  emit_byte(0xA5);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2685
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2686
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2687
void Assembler::sqrtsd(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2688
  // HMM Table D-1 says sse2
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2689
  // NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2690
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2691
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2692
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2693
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2694
  emit_byte(0x51);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2695
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2696
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2697
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2698
void Assembler::sqrtsd(XMMRegister dst, Address src) {
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2699
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2700
  InstructionMark im(this);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2701
  emit_byte(0xF2);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2702
  prefix(src, dst);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2703
  emit_byte(0x0F);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2704
  emit_byte(0x51);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2705
  emit_operand(dst, src);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2706
}
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2707
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2708
void Assembler::sqrtss(XMMRegister dst, XMMRegister src) {
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2709
  // HMM Table D-1 says sse2
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2710
  // NOT_LP64(assert(VM_Version::supports_sse(), ""));
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2711
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2712
  emit_byte(0xF3);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2713
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2714
  emit_byte(0x0F);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2715
  emit_byte(0x51);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2716
  emit_byte(0xC0 | encode);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2717
}
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2718
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2719
void Assembler::sqrtss(XMMRegister dst, Address src) {
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2720
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2721
  InstructionMark im(this);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2722
  emit_byte(0xF3);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2723
  prefix(src, dst);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2724
  emit_byte(0x0F);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2725
  emit_byte(0x51);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2726
  emit_operand(dst, src);
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2727
}
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7397
diff changeset
  2728
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2729
void Assembler::stmxcsr( Address dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2730
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2731
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2732
  prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2733
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2734
  emit_byte(0xAE);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2735
  emit_operand(as_Register(3), dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2736
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2737
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2738
void Assembler::subl(Address dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2739
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2740
  prefix(dst);
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
  2741
  emit_arith_operand(0x81, rbp, dst, imm32);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2742
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2743
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2744
void Assembler::subl(Address dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2745
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2746
  prefix(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2747
  emit_byte(0x29);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2748
  emit_operand(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2749
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2750
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
  2751
void Assembler::subl(Register dst, int32_t imm32) {
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
  2752
  prefix(dst);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
  2753
  emit_arith(0x81, 0xE8, dst, imm32);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
  2754
}
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
  2755
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2756
void Assembler::subl(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2757
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2758
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2759
  emit_byte(0x2B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2760
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2761
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2762
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2763
void Assembler::subl(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2764
  (void) prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2765
  emit_arith(0x2B, 0xC0, dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2766
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2767
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2768
void Assembler::subsd(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2769
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2770
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2771
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2772
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2773
  emit_byte(0x5C);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2774
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2775
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2776
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2777
void Assembler::subsd(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2778
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2779
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2780
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2781
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2782
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2783
  emit_byte(0x5C);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2784
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2785
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2786
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2787
void Assembler::subss(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2788
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2789
  emit_byte(0xF3);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2790
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2791
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2792
  emit_byte(0x5C);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2793
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2794
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2795
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2796
void Assembler::subss(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2797
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2798
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2799
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2800
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2801
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2802
  emit_byte(0x5C);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2803
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2804
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2805
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2806
void Assembler::testb(Register dst, int imm8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2807
  NOT_LP64(assert(dst->has_byte_register(), "must have byte register"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2808
  (void) prefix_and_encode(dst->encoding(), true);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2809
  emit_arith_b(0xF6, 0xC0, dst, imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2810
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2811
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2812
void Assembler::testl(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2813
  // not using emit_arith because test
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2814
  // doesn't support sign-extension of
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2815
  // 8bit operands
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2816
  int encode = dst->encoding();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2817
  if (encode == 0) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2818
    emit_byte(0xA9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2819
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2820
    encode = prefix_and_encode(encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2821
    emit_byte(0xF7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2822
    emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2823
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2824
  emit_long(imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2825
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2826
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2827
void Assembler::testl(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2828
  (void) prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2829
  emit_arith(0x85, 0xC0, dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2830
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2831
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2832
void Assembler::testl(Register dst, Address  src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2833
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2834
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2835
  emit_byte(0x85);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2836
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2837
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2838
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2839
void Assembler::ucomisd(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2840
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2841
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2842
  ucomiss(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2843
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2844
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2845
void Assembler::ucomisd(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2846
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2847
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2848
  ucomiss(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2849
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2850
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2851
void Assembler::ucomiss(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2852
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2853
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2854
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2855
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2856
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2857
  emit_byte(0x2E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2858
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2859
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2860
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2861
void Assembler::ucomiss(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2862
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2863
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2864
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2865
  emit_byte(0x2E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2866
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2867
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2868
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2869
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2870
void Assembler::xaddl(Address dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2871
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2872
  prefix(dst, src);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2873
  emit_byte(0x0F);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2874
  emit_byte(0xC1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2875
  emit_operand(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2876
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2877
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2878
void Assembler::xchgl(Register dst, Address src) { // xchg
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2879
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2880
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2881
  emit_byte(0x87);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2882
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2883
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2884
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2885
void Assembler::xchgl(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2886
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2887
  emit_byte(0x87);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2888
  emit_byte(0xc0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2889
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2890
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2891
void Assembler::xorl(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2892
  prefix(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2893
  emit_arith(0x81, 0xF0, dst, imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2894
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2895
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2896
void Assembler::xorl(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2897
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2898
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2899
  emit_byte(0x33);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2900
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2901
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2902
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2903
void Assembler::xorl(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2904
  (void) prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2905
  emit_arith(0x33, 0xC0, dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2906
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2907
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2908
void Assembler::xorpd(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2909
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2910
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2911
  xorps(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2912
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2913
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2914
void Assembler::xorpd(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2915
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2916
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2917
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2918
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2919
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2920
  emit_byte(0x57);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2921
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2922
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2923
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2924
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2925
void Assembler::xorps(XMMRegister dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2926
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2927
  int encode = prefix_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2928
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2929
  emit_byte(0x57);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2930
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2931
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2932
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2933
void Assembler::xorps(XMMRegister dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2934
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2935
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2936
  prefix(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2937
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2938
  emit_byte(0x57);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2939
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2940
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2941
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2942
#ifndef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2943
// 32bit only pieces of the assembler
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2944
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2945
void Assembler::cmp_literal32(Register src1, int32_t imm32, RelocationHolder const& rspec) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2946
  // NO PREFIX AS NEVER 64BIT
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2947
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2948
  emit_byte(0x81);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2949
  emit_byte(0xF8 | src1->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2950
  emit_data(imm32, rspec, 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2951
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2952
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2953
void Assembler::cmp_literal32(Address src1, int32_t imm32, RelocationHolder const& rspec) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2954
  // NO PREFIX AS NEVER 64BIT (not even 32bit versions of 64bit regs
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2955
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2956
  emit_byte(0x81);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2957
  emit_operand(rdi, src1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2958
  emit_data(imm32, rspec, 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2959
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2960
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2961
// The 64-bit (32bit platform) cmpxchg compares the value at adr with the contents of rdx:rax,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2962
// and stores rcx:rbx into adr if so; otherwise, the value at adr is loaded
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2963
// into rdx:rax.  The ZF is set if the compared values were equal, and cleared otherwise.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2964
void Assembler::cmpxchg8(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2965
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2966
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2967
  emit_byte(0xc7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2968
  emit_operand(rcx, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2969
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2970
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2971
void Assembler::decl(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2972
  // Don't use it directly. Use MacroAssembler::decrementl() instead.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2973
 emit_byte(0x48 | dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2974
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2975
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2976
#endif // _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2977
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2978
// 64bit typically doesn't use the x87 but needs to for the trig funcs
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2979
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2980
void Assembler::fabs() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2981
  emit_byte(0xD9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2982
  emit_byte(0xE1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2983
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2984
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2985
void Assembler::fadd(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2986
  emit_farith(0xD8, 0xC0, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2987
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2988
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2989
void Assembler::fadd_d(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2990
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2991
  emit_byte(0xDC);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2992
  emit_operand32(rax, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2993
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2994
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2995
void Assembler::fadd_s(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2996
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2997
  emit_byte(0xD8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2998
  emit_operand32(rax, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2999
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3000
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3001
void Assembler::fadda(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3002
  emit_farith(0xDC, 0xC0, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3003
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3004
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3005
void Assembler::faddp(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3006
  emit_farith(0xDE, 0xC0, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3007
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3008
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3009
void Assembler::fchs() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3010
  emit_byte(0xD9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3011
  emit_byte(0xE0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3012
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3013
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3014
void Assembler::fcom(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3015
  emit_farith(0xD8, 0xD0, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3016
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3017
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3018
void Assembler::fcomp(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3019
  emit_farith(0xD8, 0xD8, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3020
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3021
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3022
void Assembler::fcomp_d(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3023
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3024
  emit_byte(0xDC);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3025
  emit_operand32(rbx, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3026
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3027
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3028
void Assembler::fcomp_s(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3029
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3030
  emit_byte(0xD8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3031
  emit_operand32(rbx, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3032
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3033
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3034
void Assembler::fcompp() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3035
  emit_byte(0xDE);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3036
  emit_byte(0xD9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3037
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3038
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3039
void Assembler::fcos() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3040
  emit_byte(0xD9);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3041
  emit_byte(0xFF);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3042
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3043
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3044
void Assembler::fdecstp() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3045
  emit_byte(0xD9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3046
  emit_byte(0xF6);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3047
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3048
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3049
void Assembler::fdiv(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3050
  emit_farith(0xD8, 0xF0, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3051
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3052
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3053
void Assembler::fdiv_d(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3054
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3055
  emit_byte(0xDC);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3056
  emit_operand32(rsi, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3057
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3058
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3059
void Assembler::fdiv_s(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3060
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3061
  emit_byte(0xD8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3062
  emit_operand32(rsi, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3063
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3064
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3065
void Assembler::fdiva(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3066
  emit_farith(0xDC, 0xF8, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3067
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3068
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3069
// Note: The Intel manual (Pentium Processor User's Manual, Vol.3, 1994)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3070
//       is erroneous for some of the floating-point instructions below.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3071
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3072
void Assembler::fdivp(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3073
  emit_farith(0xDE, 0xF8, i);                    // ST(0) <- ST(0) / ST(1) and pop (Intel manual wrong)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3074
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3075
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3076
void Assembler::fdivr(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3077
  emit_farith(0xD8, 0xF8, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3078
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3079
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3080
void Assembler::fdivr_d(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3081
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3082
  emit_byte(0xDC);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3083
  emit_operand32(rdi, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3084
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3085
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3086
void Assembler::fdivr_s(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3087
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3088
  emit_byte(0xD8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3089
  emit_operand32(rdi, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3090
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3091
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3092
void Assembler::fdivra(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3093
  emit_farith(0xDC, 0xF0, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3094
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3095
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3096
void Assembler::fdivrp(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3097
  emit_farith(0xDE, 0xF0, i);                    // ST(0) <- ST(1) / ST(0) and pop (Intel manual wrong)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3098
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3099
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3100
void Assembler::ffree(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3101
  emit_farith(0xDD, 0xC0, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3102
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3103
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3104
void Assembler::fild_d(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3105
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3106
  emit_byte(0xDF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3107
  emit_operand32(rbp, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3108
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3109
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3110
void Assembler::fild_s(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3111
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3112
  emit_byte(0xDB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3113
  emit_operand32(rax, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3114
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3115
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3116
void Assembler::fincstp() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3117
  emit_byte(0xD9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3118
  emit_byte(0xF7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3119
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3120
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3121
void Assembler::finit() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3122
  emit_byte(0x9B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3123
  emit_byte(0xDB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3124
  emit_byte(0xE3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3125
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3126
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3127
void Assembler::fist_s(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3128
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3129
  emit_byte(0xDB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3130
  emit_operand32(rdx, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3131
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3132
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3133
void Assembler::fistp_d(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3134
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3135
  emit_byte(0xDF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3136
  emit_operand32(rdi, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3137
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3138
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3139
void Assembler::fistp_s(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3140
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3141
  emit_byte(0xDB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3142
  emit_operand32(rbx, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3143
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3144
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3145
void Assembler::fld1() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3146
  emit_byte(0xD9);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3147
  emit_byte(0xE8);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3148
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3149
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3150
void Assembler::fld_d(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3151
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3152
  emit_byte(0xDD);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3153
  emit_operand32(rax, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3154
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3155
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3156
void Assembler::fld_s(Address adr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3157
  InstructionMark im(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3158
  emit_byte(0xD9);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3159
  emit_operand32(rax, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3160
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3161
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3162
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3163
void Assembler::fld_s(int index) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3164
  emit_farith(0xD9, 0xC0, index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3165
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3166
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3167
void Assembler::fld_x(Address adr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3168
  InstructionMark im(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3169
  emit_byte(0xDB);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3170
  emit_operand32(rbp, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3171
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3172
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3173
void Assembler::fldcw(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3174
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3175
  emit_byte(0xd9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3176
  emit_operand32(rbp, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3177
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3178
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3179
void Assembler::fldenv(Address src) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3180
  InstructionMark im(this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3181
  emit_byte(0xD9);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3182
  emit_operand32(rsp, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3183
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3184
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3185
void Assembler::fldlg2() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3186
  emit_byte(0xD9);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3187
  emit_byte(0xEC);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3188
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3189
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3190
void Assembler::fldln2() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3191
  emit_byte(0xD9);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3192
  emit_byte(0xED);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3193
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3194
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3195
void Assembler::fldz() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3196
  emit_byte(0xD9);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3197
  emit_byte(0xEE);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3198
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3199
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3200
void Assembler::flog() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3201
  fldln2();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3202
  fxch();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3203
  fyl2x();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3204
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3205
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3206
void Assembler::flog10() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3207
  fldlg2();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3208
  fxch();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3209
  fyl2x();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3210
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3211
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3212
void Assembler::fmul(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3213
  emit_farith(0xD8, 0xC8, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3214
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3215
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3216
void Assembler::fmul_d(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3217
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3218
  emit_byte(0xDC);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3219
  emit_operand32(rcx, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3220
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3221
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3222
void Assembler::fmul_s(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3223
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3224
  emit_byte(0xD8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3225
  emit_operand32(rcx, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3226
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3227
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3228
void Assembler::fmula(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3229
  emit_farith(0xDC, 0xC8, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3230
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3231
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3232
void Assembler::fmulp(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3233
  emit_farith(0xDE, 0xC8, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3234
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3235
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3236
void Assembler::fnsave(Address dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3237
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3238
  emit_byte(0xDD);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3239
  emit_operand32(rsi, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3240
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3241
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3242
void Assembler::fnstcw(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3243
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3244
  emit_byte(0x9B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3245
  emit_byte(0xD9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3246
  emit_operand32(rdi, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3247
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3248
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3249
void Assembler::fnstsw_ax() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3250
  emit_byte(0xdF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3251
  emit_byte(0xE0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3252
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3253
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3254
void Assembler::fprem() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3255
  emit_byte(0xD9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3256
  emit_byte(0xF8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3257
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3258
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3259
void Assembler::fprem1() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3260
  emit_byte(0xD9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3261
  emit_byte(0xF5);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3262
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3263
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3264
void Assembler::frstor(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3265
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3266
  emit_byte(0xDD);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3267
  emit_operand32(rsp, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3268
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3269
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3270
void Assembler::fsin() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3271
  emit_byte(0xD9);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3272
  emit_byte(0xFE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3273
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3274
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3275
void Assembler::fsqrt() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3276
  emit_byte(0xD9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3277
  emit_byte(0xFA);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3278
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3279
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3280
void Assembler::fst_d(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3281
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3282
  emit_byte(0xDD);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3283
  emit_operand32(rdx, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3284
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3285
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3286
void Assembler::fst_s(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3287
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3288
  emit_byte(0xD9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3289
  emit_operand32(rdx, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3290
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3291
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3292
void Assembler::fstp_d(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3293
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3294
  emit_byte(0xDD);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3295
  emit_operand32(rbx, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3296
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3297
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3298
void Assembler::fstp_d(int index) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3299
  emit_farith(0xDD, 0xD8, index);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3300
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3301
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3302
void Assembler::fstp_s(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3303
  InstructionMark im(this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3304
  emit_byte(0xD9);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3305
  emit_operand32(rbx, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3306
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3307
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3308
void Assembler::fstp_x(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3309
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3310
  emit_byte(0xDB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3311
  emit_operand32(rdi, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3312
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3313
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3314
void Assembler::fsub(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3315
  emit_farith(0xD8, 0xE0, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3316
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3317
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3318
void Assembler::fsub_d(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3319
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3320
  emit_byte(0xDC);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3321
  emit_operand32(rsp, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3322
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3323
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3324
void Assembler::fsub_s(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3325
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3326
  emit_byte(0xD8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3327
  emit_operand32(rsp, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3328
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3329
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3330
void Assembler::fsuba(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3331
  emit_farith(0xDC, 0xE8, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3332
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3333
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3334
void Assembler::fsubp(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3335
  emit_farith(0xDE, 0xE8, i);                    // ST(0) <- ST(0) - ST(1) and pop (Intel manual wrong)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3336
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3337
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3338
void Assembler::fsubr(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3339
  emit_farith(0xD8, 0xE8, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3340
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3341
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3342
void Assembler::fsubr_d(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3343
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3344
  emit_byte(0xDC);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3345
  emit_operand32(rbp, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3346
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3347
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3348
void Assembler::fsubr_s(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3349
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3350
  emit_byte(0xD8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3351
  emit_operand32(rbp, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3352
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3353
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3354
void Assembler::fsubra(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3355
  emit_farith(0xDC, 0xE0, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3356
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3357
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3358
void Assembler::fsubrp(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3359
  emit_farith(0xDE, 0xE0, i);                    // ST(0) <- ST(1) - ST(0) and pop (Intel manual wrong)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3360
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3361
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3362
void Assembler::ftan() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3363
  emit_byte(0xD9);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3364
  emit_byte(0xF2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3365
  emit_byte(0xDD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3366
  emit_byte(0xD8);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3367
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3368
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3369
void Assembler::ftst() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3370
  emit_byte(0xD9);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3371
  emit_byte(0xE4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3372
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3373
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3374
void Assembler::fucomi(int i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3375
  // make sure the instruction is supported (introduced for P6, together with cmov)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3376
  guarantee(VM_Version::supports_cmov(), "illegal instruction");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3377
  emit_farith(0xDB, 0xE8, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3378
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3379
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3380
void Assembler::fucomip(int i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3381
  // make sure the instruction is supported (introduced for P6, together with cmov)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3382
  guarantee(VM_Version::supports_cmov(), "illegal instruction");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3383
  emit_farith(0xDF, 0xE8, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3384
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3385
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3386
void Assembler::fwait() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3387
  emit_byte(0x9B);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3388
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3389
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3390
void Assembler::fxch(int i) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3391
  emit_farith(0xD9, 0xC8, i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3392
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3393
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3394
void Assembler::fyl2x() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3395
  emit_byte(0xD9);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3396
  emit_byte(0xF1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3397
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3398
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3399
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3400
#ifndef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3401
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3402
void Assembler::incl(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3403
  // Don't use it directly. Use MacroAssembler::incrementl() instead.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3404
 emit_byte(0x40 | dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3405
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3406
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3407
void Assembler::lea(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3408
  leal(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3409
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3410
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3411
void Assembler::mov_literal32(Address dst, int32_t imm32,  RelocationHolder const& rspec) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3412
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3413
  emit_byte(0xC7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3414
  emit_operand(rax, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3415
  emit_data((int)imm32, rspec, 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3416
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3417
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  3418
void Assembler::mov_literal32(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
  3419
  InstructionMark im(this);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  3420
  int encode = prefix_and_encode(dst->encoding());
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  3421
  emit_byte(0xB8 | encode);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  3422
  emit_data((int)imm32, rspec, 0);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  3423
}
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3424
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3425
void Assembler::popa() { // 32bit
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3426
  emit_byte(0x61);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3427
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3428
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3429
void Assembler::push_literal32(int32_t imm32, RelocationHolder const& rspec) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3430
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3431
  emit_byte(0x68);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3432
  emit_data(imm32, rspec, 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3433
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3434
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3435
void Assembler::pusha() { // 32bit
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3436
  emit_byte(0x60);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3437
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3438
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3439
void Assembler::set_byte_if_not_zero(Register dst) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3440
  emit_byte(0x0F);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3441
  emit_byte(0x95);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3442
  emit_byte(0xE0 | dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3443
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3444
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3445
void Assembler::shldl(Register dst, Register src) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3446
  emit_byte(0x0F);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3447
  emit_byte(0xA5);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3448
  emit_byte(0xC0 | src->encoding() << 3 | dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3449
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3450
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3451
void Assembler::shrdl(Register dst, Register src) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3452
  emit_byte(0x0F);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3453
  emit_byte(0xAD);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3454
  emit_byte(0xC0 | src->encoding() << 3 | dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3455
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3456
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3457
#else // LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3458
5253
d2c37eee9a65 6942223: c1 64 bit fixes
iveresov
parents: 5053
diff changeset
  3459
void Assembler::set_byte_if_not_zero(Register dst) {
d2c37eee9a65 6942223: c1 64 bit fixes
iveresov
parents: 5053
diff changeset
  3460
  int enc = prefix_and_encode(dst->encoding(), true);
d2c37eee9a65 6942223: c1 64 bit fixes
iveresov
parents: 5053
diff changeset
  3461
  emit_byte(0x0F);
d2c37eee9a65 6942223: c1 64 bit fixes
iveresov
parents: 5053
diff changeset
  3462
  emit_byte(0x95);
d2c37eee9a65 6942223: c1 64 bit fixes
iveresov
parents: 5053
diff changeset
  3463
  emit_byte(0xE0 | enc);
d2c37eee9a65 6942223: c1 64 bit fixes
iveresov
parents: 5053
diff changeset
  3464
}
d2c37eee9a65 6942223: c1 64 bit fixes
iveresov
parents: 5053
diff changeset
  3465
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3466
// 64bit only pieces of the assembler
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3467
// This should only be used by 64bit instructions that can use rip-relative
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3468
// it cannot be used by instructions that want an immediate value.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3469
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3470
bool Assembler::reachable(AddressLiteral adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3471
  int64_t disp;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3472
  // None will force a 64bit literal to the code stream. Likely a placeholder
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3473
  // for something that will be patched later and we need to certain it will
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3474
  // always be reachable.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3475
  if (adr.reloc() == relocInfo::none) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3476
    return false;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3477
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3478
  if (adr.reloc() == relocInfo::internal_word_type) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3479
    // This should be rip relative and easily reachable.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3480
    return true;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3481
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3482
  if (adr.reloc() == relocInfo::virtual_call_type ||
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3483
      adr.reloc() == relocInfo::opt_virtual_call_type ||
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3484
      adr.reloc() == relocInfo::static_call_type ||
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3485
      adr.reloc() == relocInfo::static_stub_type ) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3486
    // This should be rip relative within the code cache and easily
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3487
    // reachable until we get huge code caches. (At which point
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3488
    // ic code is going to have issues).
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3489
    return true;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3490
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3491
  if (adr.reloc() != relocInfo::external_word_type &&
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3492
      adr.reloc() != relocInfo::poll_return_type &&  // these are really external_word but need special
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3493
      adr.reloc() != relocInfo::poll_type &&         // relocs to identify them
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3494
      adr.reloc() != relocInfo::runtime_call_type ) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3495
    return false;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3496
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3497
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3498
  // Stress the correction code
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3499
  if (ForceUnreachable) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3500
    // Must be runtimecall reloc, see if it is in the codecache
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3501
    // Flipping stuff in the codecache to be unreachable causes issues
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3502
    // with things like inline caches where the additional instructions
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3503
    // are not handled.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3504
    if (CodeCache::find_blob(adr._target) == NULL) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3505
      return false;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3506
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3507
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3508
  // For external_word_type/runtime_call_type if it is reachable from where we
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3509
  // are now (possibly a temp buffer) and where we might end up
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3510
  // anywhere in the codeCache then we are always reachable.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3511
  // This would have to change if we ever save/restore shared code
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3512
  // to be more pessimistic.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3513
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3514
  disp = (int64_t)adr._target - ((int64_t)CodeCache::low_bound() + sizeof(int));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3515
  if (!is_simm32(disp)) return false;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3516
  disp = (int64_t)adr._target - ((int64_t)CodeCache::high_bound() + sizeof(int));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3517
  if (!is_simm32(disp)) return false;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3518
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3519
  disp = (int64_t)adr._target - ((int64_t)_code_pos + sizeof(int));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3520
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3521
  // Because rip relative is a disp + address_of_next_instruction and we
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3522
  // don't know the value of address_of_next_instruction we apply a fudge factor
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3523
  // to make sure we will be ok no matter the size of the instruction we get placed into.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3524
  // We don't have to fudge the checks above here because they are already worst case.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3525
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3526
  // 12 == override/rex byte, opcode byte, rm byte, sib byte, a 4-byte disp , 4-byte literal
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3527
  // + 4 because better safe than sorry.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3528
  const int fudge = 12 + 4;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3529
  if (disp < 0) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3530
    disp -= fudge;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3531
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3532
    disp += fudge;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3533
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3534
  return is_simm32(disp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3535
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3536
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3537
void Assembler::emit_data64(jlong data,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3538
                            relocInfo::relocType rtype,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3539
                            int format) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3540
  if (rtype == relocInfo::none) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3541
    emit_long64(data);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3542
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3543
    emit_data64(data, Relocation::spec_simple(rtype), format);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3544
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3545
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3546
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3547
void Assembler::emit_data64(jlong data,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3548
                            RelocationHolder const& rspec,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3549
                            int format) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3550
  assert(imm_operand == 0, "default format must be immediate in this file");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3551
  assert(imm_operand == format, "must be immediate");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3552
  assert(inst_mark() != NULL, "must be inside InstructionMark");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3553
  // Do not use AbstractAssembler::relocate, which is not intended for
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3554
  // embedded words.  Instead, relocate to the enclosing instruction.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3555
  code_section()->relocate(inst_mark(), rspec, format);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3556
#ifdef ASSERT
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3557
  check_relocation(rspec, format);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3558
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3559
  emit_long64(data);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3560
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3561
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3562
int Assembler::prefix_and_encode(int reg_enc, bool byteinst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3563
  if (reg_enc >= 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3564
    prefix(REX_B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3565
    reg_enc -= 8;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3566
  } else if (byteinst && reg_enc >= 4) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3567
    prefix(REX);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3568
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3569
  return reg_enc;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3570
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3571
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3572
int Assembler::prefixq_and_encode(int reg_enc) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3573
  if (reg_enc < 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3574
    prefix(REX_W);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3575
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3576
    prefix(REX_WB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3577
    reg_enc -= 8;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3578
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3579
  return reg_enc;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3580
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3581
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3582
int Assembler::prefix_and_encode(int dst_enc, int src_enc, bool byteinst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3583
  if (dst_enc < 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3584
    if (src_enc >= 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3585
      prefix(REX_B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3586
      src_enc -= 8;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3587
    } else if (byteinst && src_enc >= 4) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3588
      prefix(REX);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3589
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3590
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3591
    if (src_enc < 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3592
      prefix(REX_R);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3593
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3594
      prefix(REX_RB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3595
      src_enc -= 8;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3596
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3597
    dst_enc -= 8;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3598
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3599
  return dst_enc << 3 | src_enc;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3600
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3601
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3602
int Assembler::prefixq_and_encode(int dst_enc, int src_enc) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3603
  if (dst_enc < 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3604
    if (src_enc < 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3605
      prefix(REX_W);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3606
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3607
      prefix(REX_WB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3608
      src_enc -= 8;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3609
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3610
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3611
    if (src_enc < 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3612
      prefix(REX_WR);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3613
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3614
      prefix(REX_WRB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3615
      src_enc -= 8;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3616
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3617
    dst_enc -= 8;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3618
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3619
  return dst_enc << 3 | src_enc;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3620
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3621
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3622
void Assembler::prefix(Register reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3623
  if (reg->encoding() >= 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3624
    prefix(REX_B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3625
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3626
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3627
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3628
void Assembler::prefix(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3629
  if (adr.base_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3630
    if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3631
      prefix(REX_XB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3632
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3633
      prefix(REX_B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3634
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3635
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3636
    if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3637
      prefix(REX_X);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3638
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3639
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3640
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3641
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3642
void Assembler::prefixq(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3643
  if (adr.base_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3644
    if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3645
      prefix(REX_WXB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3646
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3647
      prefix(REX_WB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3648
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3649
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3650
    if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3651
      prefix(REX_WX);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3652
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3653
      prefix(REX_W);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3654
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3655
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3656
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3657
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3658
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3659
void Assembler::prefix(Address adr, Register reg, bool byteinst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3660
  if (reg->encoding() < 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3661
    if (adr.base_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3662
      if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3663
        prefix(REX_XB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3664
      } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3665
        prefix(REX_B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3666
      }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3667
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3668
      if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3669
        prefix(REX_X);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3670
      } else if (reg->encoding() >= 4 ) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3671
        prefix(REX);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3672
      }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3673
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3674
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3675
    if (adr.base_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3676
      if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3677
        prefix(REX_RXB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3678
      } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3679
        prefix(REX_RB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3680
      }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3681
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3682
      if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3683
        prefix(REX_RX);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3684
      } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3685
        prefix(REX_R);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3686
      }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3687
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3688
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3689
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3690
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3691
void Assembler::prefixq(Address adr, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3692
  if (src->encoding() < 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3693
    if (adr.base_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3694
      if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3695
        prefix(REX_WXB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3696
      } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3697
        prefix(REX_WB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3698
      }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3699
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3700
      if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3701
        prefix(REX_WX);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3702
      } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3703
        prefix(REX_W);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3704
      }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3705
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3706
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3707
    if (adr.base_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3708
      if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3709
        prefix(REX_WRXB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3710
      } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3711
        prefix(REX_WRB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3712
      }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3713
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3714
      if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3715
        prefix(REX_WRX);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3716
      } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3717
        prefix(REX_WR);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3718
      }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3719
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3720
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3721
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3722
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3723
void Assembler::prefix(Address adr, XMMRegister reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3724
  if (reg->encoding() < 8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3725
    if (adr.base_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3726
      if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3727
        prefix(REX_XB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3728
      } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3729
        prefix(REX_B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3730
      }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3731
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3732
      if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3733
        prefix(REX_X);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3734
      }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3735
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3736
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3737
    if (adr.base_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3738
      if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3739
        prefix(REX_RXB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3740
      } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3741
        prefix(REX_RB);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3742
      }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3743
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3744
      if (adr.index_needs_rex()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3745
        prefix(REX_RX);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3746
      } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3747
        prefix(REX_R);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3748
      }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3749
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3750
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3751
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3752
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3753
void Assembler::adcq(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3754
  (void) prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3755
  emit_arith(0x81, 0xD0, dst, imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3756
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3757
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3758
void Assembler::adcq(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3759
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3760
  prefixq(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3761
  emit_byte(0x13);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3762
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3763
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3764
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3765
void Assembler::adcq(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3766
  (int) prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3767
  emit_arith(0x13, 0xC0, dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3768
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3769
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3770
void Assembler::addq(Address dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3771
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3772
  prefixq(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3773
  emit_arith_operand(0x81, rax, dst,imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3774
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3775
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3776
void Assembler::addq(Address dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3777
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3778
  prefixq(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3779
  emit_byte(0x01);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3780
  emit_operand(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3781
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3782
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3783
void Assembler::addq(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3784
  (void) prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3785
  emit_arith(0x81, 0xC0, dst, imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3786
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3787
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3788
void Assembler::addq(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3789
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3790
  prefixq(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3791
  emit_byte(0x03);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3792
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3793
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3794
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3795
void Assembler::addq(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3796
  (void) prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3797
  emit_arith(0x03, 0xC0, dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3798
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3799
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3800
void Assembler::andq(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3801
  (void) prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3802
  emit_arith(0x81, 0xE0, dst, imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3803
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3804
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3805
void Assembler::andq(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3806
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3807
  prefixq(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3808
  emit_byte(0x23);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3809
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3810
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3811
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3812
void Assembler::andq(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3813
  (int) prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3814
  emit_arith(0x23, 0xC0, dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3815
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3816
2862
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  3817
void Assembler::bsfq(Register dst, Register src) {
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  3818
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  3819
  emit_byte(0x0F);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  3820
  emit_byte(0xBC);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  3821
  emit_byte(0xC0 | encode);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  3822
}
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  3823
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  3824
void Assembler::bsrq(Register dst, Register src) {
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  3825
  assert(!VM_Version::supports_lzcnt(), "encoding is treated as LZCNT");
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  3826
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  3827
  emit_byte(0x0F);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  3828
  emit_byte(0xBD);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  3829
  emit_byte(0xC0 | encode);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  3830
}
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  3831
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3832
void Assembler::bswapq(Register reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3833
  int encode = prefixq_and_encode(reg->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3834
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3835
  emit_byte(0xC8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3836
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3837
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3838
void Assembler::cdqq() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3839
  prefix(REX_W);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3840
  emit_byte(0x99);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3841
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3842
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3843
void Assembler::clflush(Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3844
  prefix(adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3845
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3846
  emit_byte(0xAE);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3847
  emit_operand(rdi, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3848
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3849
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3850
void Assembler::cmovq(Condition cc, Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3851
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3852
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3853
  emit_byte(0x40 | cc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3854
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3855
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3856
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3857
void Assembler::cmovq(Condition cc, Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3858
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3859
  prefixq(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3860
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3861
  emit_byte(0x40 | cc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3862
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3863
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3864
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3865
void Assembler::cmpq(Address dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3866
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3867
  prefixq(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3868
  emit_byte(0x81);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3869
  emit_operand(rdi, dst, 4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3870
  emit_long(imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3871
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3872
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3873
void Assembler::cmpq(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3874
  (void) prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3875
  emit_arith(0x81, 0xF8, dst, imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3876
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3877
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3878
void Assembler::cmpq(Address dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3879
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3880
  prefixq(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3881
  emit_byte(0x3B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3882
  emit_operand(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3883
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3884
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3885
void Assembler::cmpq(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3886
  (void) prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3887
  emit_arith(0x3B, 0xC0, dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3888
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3889
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3890
void Assembler::cmpq(Register dst, Address  src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3891
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3892
  prefixq(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3893
  emit_byte(0x3B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3894
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3895
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3896
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3897
void Assembler::cmpxchgq(Register reg, Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3898
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3899
  prefixq(adr, reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3900
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3901
  emit_byte(0xB1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3902
  emit_operand(reg, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3903
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3904
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3905
void Assembler::cvtsi2sdq(XMMRegister dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3906
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3907
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3908
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3909
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3910
  emit_byte(0x2A);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3911
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3912
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3913
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3914
void Assembler::cvtsi2ssq(XMMRegister dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3915
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3916
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3917
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3918
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3919
  emit_byte(0x2A);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3920
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3921
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3922
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3923
void Assembler::cvttsd2siq(Register dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3924
  NOT_LP64(assert(VM_Version::supports_sse2(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3925
  emit_byte(0xF2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3926
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3927
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3928
  emit_byte(0x2C);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3929
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3930
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3931
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3932
void Assembler::cvttss2siq(Register dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3933
  NOT_LP64(assert(VM_Version::supports_sse(), ""));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3934
  emit_byte(0xF3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3935
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3936
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3937
  emit_byte(0x2C);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3938
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3939
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3940
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3941
void Assembler::decl(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3942
  // Don't use it directly. Use MacroAssembler::decrementl() instead.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3943
  // Use two-byte form (one-byte form is a REX prefix in 64-bit mode)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3944
  int encode = prefix_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3945
  emit_byte(0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3946
  emit_byte(0xC8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3947
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3948
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3949
void Assembler::decq(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3950
  // Don't use it directly. Use MacroAssembler::decrementq() instead.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3951
  // Use two-byte form (one-byte from is a REX prefix in 64-bit mode)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3952
  int encode = prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3953
  emit_byte(0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3954
  emit_byte(0xC8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3955
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3956
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3957
void Assembler::decq(Address dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3958
  // Don't use it directly. Use MacroAssembler::decrementq() instead.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3959
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3960
  prefixq(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3961
  emit_byte(0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3962
  emit_operand(rcx, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3963
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3964
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3965
void Assembler::fxrstor(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3966
  prefixq(src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3967
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3968
  emit_byte(0xAE);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3969
  emit_operand(as_Register(1), src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3970
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3971
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3972
void Assembler::fxsave(Address dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3973
  prefixq(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3974
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3975
  emit_byte(0xAE);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3976
  emit_operand(as_Register(0), dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3977
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3978
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3979
void Assembler::idivq(Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3980
  int encode = prefixq_and_encode(src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3981
  emit_byte(0xF7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3982
  emit_byte(0xF8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3983
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3984
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3985
void Assembler::imulq(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3986
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3987
  emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3988
  emit_byte(0xAF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3989
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3990
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3991
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3992
void Assembler::imulq(Register dst, Register src, int value) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3993
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3994
  if (is8bit(value)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3995
    emit_byte(0x6B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3996
    emit_byte(0xC0 | encode);
7115
32300e243300 6987135: Performance regression on Intel platform with 32-bits edition between 6u13 and 6u14.
kvn
parents: 6772
diff changeset
  3997
    emit_byte(value & 0xFF);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3998
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3999
    emit_byte(0x69);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4000
    emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4001
    emit_long(value);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4002
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4003
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4004
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4005
void Assembler::incl(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4006
  // Don't use it directly. Use MacroAssembler::incrementl() instead.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4007
  // Use two-byte form (one-byte from is a REX prefix in 64-bit mode)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4008
  int encode = prefix_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4009
  emit_byte(0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4010
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4011
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4012
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4013
void Assembler::incq(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4014
  // Don't use it directly. Use MacroAssembler::incrementq() instead.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4015
  // Use two-byte form (one-byte from is a REX prefix in 64-bit mode)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4016
  int encode = prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4017
  emit_byte(0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4018
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4019
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4020
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4021
void Assembler::incq(Address dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4022
  // Don't use it directly. Use MacroAssembler::incrementq() instead.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4023
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4024
  prefixq(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4025
  emit_byte(0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4026
  emit_operand(rax, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4027
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4028
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4029
void Assembler::lea(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4030
  leaq(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4031
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4032
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4033
void Assembler::leaq(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4034
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4035
  prefixq(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4036
  emit_byte(0x8D);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4037
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4038
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4039
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4040
void Assembler::mov64(Register dst, int64_t imm64) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4041
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4042
  int encode = prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4043
  emit_byte(0xB8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4044
  emit_long64(imm64);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4045
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4046
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4047
void Assembler::mov_literal64(Register dst, intptr_t imm64, RelocationHolder const& rspec) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4048
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4049
  int encode = prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4050
  emit_byte(0xB8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4051
  emit_data64(imm64, rspec);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4052
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4053
2254
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4054
void Assembler::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
  4055
  InstructionMark im(this);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4056
  int encode = prefix_and_encode(dst->encoding());
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4057
  emit_byte(0xB8 | encode);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4058
  emit_data((int)imm32, rspec, narrow_oop_operand);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4059
}
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4060
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4061
void Assembler::mov_narrow_oop(Address dst, int32_t imm32,  RelocationHolder const& rspec) {
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4062
  InstructionMark im(this);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4063
  prefix(dst);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4064
  emit_byte(0xC7);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4065
  emit_operand(rax, dst, 4);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4066
  emit_data((int)imm32, rspec, narrow_oop_operand);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4067
}
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4068
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4069
void Assembler::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
  4070
  InstructionMark im(this);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4071
  int encode = prefix_and_encode(src1->encoding());
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4072
  emit_byte(0x81);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4073
  emit_byte(0xF8 | encode);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4074
  emit_data((int)imm32, rspec, narrow_oop_operand);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4075
}
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4076
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4077
void Assembler::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
  4078
  InstructionMark im(this);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4079
  prefix(src1);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4080
  emit_byte(0x81);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4081
  emit_operand(rax, src1, 4);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4082
  emit_data((int)imm32, rspec, narrow_oop_operand);
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4083
}
f13dda645a4b 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 2150
diff changeset
  4084
2862
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  4085
void Assembler::lzcntq(Register dst, Register src) {
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  4086
  assert(VM_Version::supports_lzcnt(), "encoding is treated as BSR");
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  4087
  emit_byte(0xF3);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  4088
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  4089
  emit_byte(0x0F);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  4090
  emit_byte(0xBD);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  4091
  emit_byte(0xC0 | encode);
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  4092
}
fad636edf18f 6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}()
twisti
parents: 2534
diff changeset
  4093
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4094
void Assembler::movdq(XMMRegister dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4095
  // table D-1 says MMX/SSE2
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4096
  NOT_LP64(assert(VM_Version::supports_sse2() || VM_Version::supports_mmx(), ""));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4097
  emit_byte(0x66);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4098
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4099
  emit_byte(0x0F);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4100
  emit_byte(0x6E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4101
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4102
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4103
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4104
void Assembler::movdq(Register dst, XMMRegister src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4105
  // table D-1 says MMX/SSE2
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4106
  NOT_LP64(assert(VM_Version::supports_sse2() || VM_Version::supports_mmx(), ""));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4107
  emit_byte(0x66);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4108
  // swap src/dst to get correct prefix
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4109
  int encode = prefixq_and_encode(src->encoding(), dst->encoding());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4110
  emit_byte(0x0F);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4111
  emit_byte(0x7E);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4112
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4113
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4114
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4115
void Assembler::movq(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4116
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4117
  emit_byte(0x8B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4118
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4119
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4120
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4121
void Assembler::movq(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4122
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4123
  prefixq(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4124
  emit_byte(0x8B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4125
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4126
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4127
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4128
void Assembler::movq(Address dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4129
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4130
  prefixq(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4131
  emit_byte(0x89);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4132
  emit_operand(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4133
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4134
2150
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4135
void Assembler::movsbq(Register dst, Address src) {
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4136
  InstructionMark im(this);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4137
  prefixq(src, dst);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4138
  emit_byte(0x0F);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4139
  emit_byte(0xBE);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4140
  emit_operand(dst, src);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4141
}
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4142
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4143
void Assembler::movsbq(Register dst, Register src) {
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4144
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4145
  emit_byte(0x0F);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4146
  emit_byte(0xBE);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4147
  emit_byte(0xC0 | encode);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4148
}
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4149
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4150
void Assembler::movslq(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4151
  // dbx shows movslq(rcx, 3) as movq     $0x0000000049000000,(%rbx)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4152
  // and movslq(r8, 3); as movl     $0x0000000048000000,(%rbx)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4153
  // as a result we shouldn't use until tested at runtime...
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4154
  ShouldNotReachHere();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4155
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4156
  int encode = prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4157
  emit_byte(0xC7 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4158
  emit_long(imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4159
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4160
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4161
void Assembler::movslq(Address dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4162
  assert(is_simm32(imm32), "lost bits");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4163
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4164
  prefixq(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4165
  emit_byte(0xC7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4166
  emit_operand(rax, dst, 4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4167
  emit_long(imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4168
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4169
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4170
void Assembler::movslq(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4171
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4172
  prefixq(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4173
  emit_byte(0x63);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4174
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4175
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4176
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4177
void Assembler::movslq(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4178
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4179
  emit_byte(0x63);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4180
  emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4181
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4182
2150
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4183
void Assembler::movswq(Register dst, Address src) {
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4184
  InstructionMark im(this);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4185
  prefixq(src, dst);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4186
  emit_byte(0x0F);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4187
  emit_byte(0xBF);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4188
  emit_operand(dst, src);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4189
}
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4190
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4191
void Assembler::movswq(Register dst, Register src) {
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4192
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4193
  emit_byte(0x0F);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4194
  emit_byte(0xBF);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4195
  emit_byte(0xC0 | encode);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4196
}
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4197
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4198
void Assembler::movzbq(Register dst, Address src) {
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4199
  InstructionMark im(this);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4200
  prefixq(src, dst);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4201
  emit_byte(0x0F);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4202
  emit_byte(0xB6);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4203
  emit_operand(dst, src);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4204
}
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4205
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4206
void Assembler::movzbq(Register dst, Register src) {
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4207
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4208
  emit_byte(0x0F);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4209
  emit_byte(0xB6);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4210
  emit_byte(0xC0 | encode);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4211
}
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4212
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4213
void Assembler::movzwq(Register dst, Address src) {
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4214
  InstructionMark im(this);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4215
  prefixq(src, dst);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4216
  emit_byte(0x0F);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4217
  emit_byte(0xB7);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4218
  emit_operand(dst, src);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4219
}
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4220
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4221
void Assembler::movzwq(Register dst, Register src) {
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4222
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4223
  emit_byte(0x0F);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4224
  emit_byte(0xB7);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4225
  emit_byte(0xC0 | encode);
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4226
}
0d91d17158cc 6797305: Add LoadUB and LoadUI opcode class
twisti
parents: 2149
diff changeset
  4227
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4228
void Assembler::negq(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4229
  int encode = prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4230
  emit_byte(0xF7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4231
  emit_byte(0xD8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4232
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4233
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4234
void Assembler::notq(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4235
  int encode = prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4236
  emit_byte(0xF7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4237
  emit_byte(0xD0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4238
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4239
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4240
void Assembler::orq(Address dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4241
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4242
  prefixq(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4243
  emit_byte(0x81);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4244
  emit_operand(rcx, dst, 4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4245
  emit_long(imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4246
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4247
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4248
void Assembler::orq(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4249
  (void) prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4250
  emit_arith(0x81, 0xC8, dst, imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4251
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4252
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4253
void Assembler::orq(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4254
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4255
  prefixq(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4256
  emit_byte(0x0B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4257
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4258
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4259
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4260
void Assembler::orq(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4261
  (void) prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4262
  emit_arith(0x0B, 0xC0, dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4263
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4264
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4265
void Assembler::popa() { // 64bit
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4266
  movq(r15, Address(rsp, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4267
  movq(r14, Address(rsp, wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4268
  movq(r13, Address(rsp, 2 * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4269
  movq(r12, Address(rsp, 3 * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4270
  movq(r11, Address(rsp, 4 * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4271
  movq(r10, Address(rsp, 5 * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4272
  movq(r9,  Address(rsp, 6 * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4273
  movq(r8,  Address(rsp, 7 * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4274
  movq(rdi, Address(rsp, 8 * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4275
  movq(rsi, Address(rsp, 9 * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4276
  movq(rbp, Address(rsp, 10 * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4277
  // skip rsp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4278
  movq(rbx, Address(rsp, 12 * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4279
  movq(rdx, Address(rsp, 13 * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4280
  movq(rcx, Address(rsp, 14 * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4281
  movq(rax, Address(rsp, 15 * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4282
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4283
  addq(rsp, 16 * wordSize);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4284
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4285
2255
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4286
void Assembler::popcntq(Register dst, Address src) {
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4287
  assert(VM_Version::supports_popcnt(), "must support");
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4288
  InstructionMark im(this);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4289
  emit_byte(0xF3);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4290
  prefixq(src, dst);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4291
  emit_byte(0x0F);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4292
  emit_byte(0xB8);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4293
  emit_operand(dst, src);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4294
}
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4295
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4296
void Assembler::popcntq(Register dst, Register src) {
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4297
  assert(VM_Version::supports_popcnt(), "must support");
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4298
  emit_byte(0xF3);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4299
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4300
  emit_byte(0x0F);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4301
  emit_byte(0xB8);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4302
  emit_byte(0xC0 | encode);
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4303
}
54abdf3e1055 6378821: bitCount() should use POPC on SPARC processors and AMD+10h
twisti
parents: 2254
diff changeset
  4304
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4305
void Assembler::popq(Address dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4306
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4307
  prefixq(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4308
  emit_byte(0x8F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4309
  emit_operand(rax, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4310
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4311
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4312
void Assembler::pusha() { // 64bit
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4313
  // we have to store original rsp.  ABI says that 128 bytes
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4314
  // below rsp are local scratch.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4315
  movq(Address(rsp, -5 * wordSize), rsp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4316
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4317
  subq(rsp, 16 * wordSize);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4318
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4319
  movq(Address(rsp, 15 * wordSize), rax);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4320
  movq(Address(rsp, 14 * wordSize), rcx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4321
  movq(Address(rsp, 13 * wordSize), rdx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4322
  movq(Address(rsp, 12 * wordSize), rbx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4323
  // skip rsp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4324
  movq(Address(rsp, 10 * wordSize), rbp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4325
  movq(Address(rsp, 9 * wordSize), rsi);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4326
  movq(Address(rsp, 8 * wordSize), rdi);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4327
  movq(Address(rsp, 7 * wordSize), r8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4328
  movq(Address(rsp, 6 * wordSize), r9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4329
  movq(Address(rsp, 5 * wordSize), r10);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4330
  movq(Address(rsp, 4 * wordSize), r11);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4331
  movq(Address(rsp, 3 * wordSize), r12);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4332
  movq(Address(rsp, 2 * wordSize), r13);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4333
  movq(Address(rsp, wordSize), r14);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4334
  movq(Address(rsp, 0), r15);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4335
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4336
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4337
void Assembler::pushq(Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4338
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4339
  prefixq(src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4340
  emit_byte(0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4341
  emit_operand(rsi, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4342
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4343
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4344
void Assembler::rclq(Register dst, int imm8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4345
  assert(isShiftCount(imm8 >> 1), "illegal shift count");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4346
  int encode = prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4347
  if (imm8 == 1) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4348
    emit_byte(0xD1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4349
    emit_byte(0xD0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4350
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4351
    emit_byte(0xC1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4352
    emit_byte(0xD0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4353
    emit_byte(imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4354
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4355
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4356
void Assembler::sarq(Register dst, int imm8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4357
  assert(isShiftCount(imm8 >> 1), "illegal shift count");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4358
  int encode = prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4359
  if (imm8 == 1) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4360
    emit_byte(0xD1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4361
    emit_byte(0xF8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4362
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4363
    emit_byte(0xC1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4364
    emit_byte(0xF8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4365
    emit_byte(imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4366
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4367
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4368
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4369
void Assembler::sarq(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4370
  int encode = prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4371
  emit_byte(0xD3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4372
  emit_byte(0xF8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4373
}
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
  4374
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4375
void Assembler::sbbq(Address dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4376
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4377
  prefixq(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4378
  emit_arith_operand(0x81, rbx, dst, imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4379
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4380
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4381
void Assembler::sbbq(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4382
  (void) prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4383
  emit_arith(0x81, 0xD8, dst, imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4384
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4385
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4386
void Assembler::sbbq(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4387
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4388
  prefixq(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4389
  emit_byte(0x1B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4390
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4391
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4392
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4393
void Assembler::sbbq(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4394
  (void) prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4395
  emit_arith(0x1B, 0xC0, dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4396
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4397
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4398
void Assembler::shlq(Register dst, int imm8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4399
  assert(isShiftCount(imm8 >> 1), "illegal shift count");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4400
  int encode = prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4401
  if (imm8 == 1) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4402
    emit_byte(0xD1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4403
    emit_byte(0xE0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4404
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4405
    emit_byte(0xC1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4406
    emit_byte(0xE0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4407
    emit_byte(imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4408
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4409
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4410
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4411
void Assembler::shlq(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4412
  int encode = prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4413
  emit_byte(0xD3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4414
  emit_byte(0xE0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4415
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4416
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4417
void Assembler::shrq(Register dst, int imm8) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4418
  assert(isShiftCount(imm8 >> 1), "illegal shift count");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4419
  int encode = prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4420
  emit_byte(0xC1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4421
  emit_byte(0xE8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4422
  emit_byte(imm8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4423
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4424
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4425
void Assembler::shrq(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4426
  int encode = prefixq_and_encode(dst->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4427
  emit_byte(0xD3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4428
  emit_byte(0xE8 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4429
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4430
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4431
void Assembler::subq(Address dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4432
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4433
  prefixq(dst);
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
  4434
  emit_arith_operand(0x81, rbp, dst, imm32);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4435
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4436
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4437
void Assembler::subq(Address dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4438
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4439
  prefixq(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4440
  emit_byte(0x29);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4441
  emit_operand(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4442
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4443
7724
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
  4444
void Assembler::subq(Register dst, int32_t imm32) {
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
  4445
  (void) prefixq_and_encode(dst->encoding());
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
  4446
  emit_arith(0x81, 0xE8, dst, imm32);
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
  4447
}
a92d706dbdd5 7003271: Hotspot should track cumulative Java heap bytes allocated on a per-thread basis
phh
parents: 7439
diff changeset
  4448
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4449
void Assembler::subq(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4450
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4451
  prefixq(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4452
  emit_byte(0x2B);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4453
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4454
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4455
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4456
void Assembler::subq(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4457
  (void) prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4458
  emit_arith(0x2B, 0xC0, dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4459
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4460
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4461
void Assembler::testq(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4462
  // not using emit_arith because test
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4463
  // doesn't support sign-extension of
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4464
  // 8bit operands
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4465
  int encode = dst->encoding();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4466
  if (encode == 0) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4467
    prefix(REX_W);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4468
    emit_byte(0xA9);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4469
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4470
    encode = prefixq_and_encode(encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4471
    emit_byte(0xF7);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4472
    emit_byte(0xC0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4473
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4474
  emit_long(imm32);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4475
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4476
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4477
void Assembler::testq(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4478
  (void) prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4479
  emit_arith(0x85, 0xC0, dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4480
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4481
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4482
void Assembler::xaddq(Address dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4483
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4484
  prefixq(dst, src);
244
c8ad6f221400 6662967: Optimize I2D conversion on new x86
kvn
parents: 1
diff changeset
  4485
  emit_byte(0x0F);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4486
  emit_byte(0xC1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4487
  emit_operand(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4488
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4489
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4490
void Assembler::xchgq(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4491
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4492
  prefixq(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4493
  emit_byte(0x87);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4494
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4495
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4496
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4497
void Assembler::xchgq(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4498
  int encode = prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4499
  emit_byte(0x87);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4500
  emit_byte(0xc0 | encode);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4501
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4502
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4503
void Assembler::xorq(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4504
  (void) prefixq_and_encode(dst->encoding(), src->encoding());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4505
  emit_arith(0x33, 0xC0, dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4506
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4507
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4508
void Assembler::xorq(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4509
  InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4510
  prefixq(src, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4511
  emit_byte(0x33);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4512
  emit_operand(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4513
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4514
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4515
#endif // !LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4516
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4517
static Assembler::Condition reverse[] = {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4518
    Assembler::noOverflow     /* overflow      = 0x0 */ ,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4519
    Assembler::overflow       /* noOverflow    = 0x1 */ ,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4520
    Assembler::aboveEqual     /* carrySet      = 0x2, below         = 0x2 */ ,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4521
    Assembler::below          /* aboveEqual    = 0x3, carryClear    = 0x3 */ ,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4522
    Assembler::notZero        /* zero          = 0x4, equal         = 0x4 */ ,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4523
    Assembler::zero           /* notZero       = 0x5, notEqual      = 0x5 */ ,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4524
    Assembler::above          /* belowEqual    = 0x6 */ ,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4525
    Assembler::belowEqual     /* above         = 0x7 */ ,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4526
    Assembler::positive       /* negative      = 0x8 */ ,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4527
    Assembler::negative       /* positive      = 0x9 */ ,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4528
    Assembler::noParity       /* parity        = 0xa */ ,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4529
    Assembler::parity         /* noParity      = 0xb */ ,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4530
    Assembler::greaterEqual   /* less          = 0xc */ ,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4531
    Assembler::less           /* greaterEqual  = 0xd */ ,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4532
    Assembler::greater        /* lessEqual     = 0xe */ ,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4533
    Assembler::lessEqual      /* greater       = 0xf, */
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4534
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4535
};
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4536
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4537
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4538
// Implementation of MacroAssembler
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4539
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4540
// First all the versions that have distinct versions depending on 32/64 bit
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4541
// Unless the difference is trivial (1 line or so).
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4542
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4543
#ifndef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4544
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4545
// 32bit versions
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4546
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4547
Address MacroAssembler::as_Address(AddressLiteral adr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4548
  return Address(adr.target(), adr.rspec());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4549
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4550
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4551
Address MacroAssembler::as_Address(ArrayAddress adr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4552
  return Address::make_array(adr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4553
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4554
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4555
int MacroAssembler::biased_locking_enter(Register lock_reg,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4556
                                         Register obj_reg,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4557
                                         Register swap_reg,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4558
                                         Register tmp_reg,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4559
                                         bool swap_reg_contains_mark,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4560
                                         Label& done,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4561
                                         Label* slow_case,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4562
                                         BiasedLockingCounters* counters) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4563
  assert(UseBiasedLocking, "why call this otherwise?");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4564
  assert(swap_reg == rax, "swap_reg must be rax, for cmpxchg");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4565
  assert_different_registers(lock_reg, obj_reg, swap_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4566
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4567
  if (PrintBiasedLockingStatistics && counters == NULL)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4568
    counters = BiasedLocking::counters();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4569
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4570
  bool need_tmp_reg = false;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4571
  if (tmp_reg == noreg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4572
    need_tmp_reg = true;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4573
    tmp_reg = lock_reg;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4574
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4575
    assert_different_registers(lock_reg, obj_reg, swap_reg, tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4576
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4577
  assert(markOopDesc::age_shift == markOopDesc::lock_bits + markOopDesc::biased_lock_bits, "biased locking makes assumptions about bit layout");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4578
  Address mark_addr      (obj_reg, oopDesc::mark_offset_in_bytes());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4579
  Address klass_addr     (obj_reg, oopDesc::klass_offset_in_bytes());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4580
  Address saved_mark_addr(lock_reg, 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4581
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4582
  // Biased locking
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4583
  // See whether the lock is currently biased toward our thread and
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4584
  // whether the epoch is still valid
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4585
  // Note that the runtime guarantees sufficient alignment of JavaThread
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4586
  // pointers to allow age to be placed into low bits
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4587
  // First check to see whether biasing is even enabled for this object
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4588
  Label cas_label;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4589
  int null_check_offset = -1;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4590
  if (!swap_reg_contains_mark) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4591
    null_check_offset = offset();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4592
    movl(swap_reg, mark_addr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4593
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4594
  if (need_tmp_reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4595
    push(tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4596
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4597
  movl(tmp_reg, swap_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4598
  andl(tmp_reg, markOopDesc::biased_lock_mask_in_place);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4599
  cmpl(tmp_reg, markOopDesc::biased_lock_pattern);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4600
  if (need_tmp_reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4601
    pop(tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4602
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4603
  jcc(Assembler::notEqual, cas_label);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4604
  // The bias pattern is present in the object's header. Need to check
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4605
  // whether the bias owner and the epoch are both still current.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4606
  // Note that because there is no current thread register on x86 we
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4607
  // need to store off the mark word we read out of the object to
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4608
  // avoid reloading it and needing to recheck invariants below. This
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4609
  // store is unfortunate but it makes the overall code shorter and
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4610
  // simpler.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4611
  movl(saved_mark_addr, swap_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4612
  if (need_tmp_reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4613
    push(tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4614
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4615
  get_thread(tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4616
  xorl(swap_reg, tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4617
  if (swap_reg_contains_mark) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4618
    null_check_offset = offset();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4619
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4620
  movl(tmp_reg, klass_addr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4621
  xorl(swap_reg, Address(tmp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4622
  andl(swap_reg, ~((int) markOopDesc::age_mask_in_place));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4623
  if (need_tmp_reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4624
    pop(tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4625
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4626
  if (counters != NULL) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4627
    cond_inc32(Assembler::zero,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4628
               ExternalAddress((address)counters->biased_lock_entry_count_addr()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4629
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4630
  jcc(Assembler::equal, done);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4631
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4632
  Label try_revoke_bias;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4633
  Label try_rebias;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4634
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4635
  // At this point we know that the header has the bias pattern and
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4636
  // that we are not the bias owner in the current epoch. We need to
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4637
  // figure out more details about the state of the header in order to
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4638
  // know what operations can be legally performed on the object's
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4639
  // header.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4640
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4641
  // If the low three bits in the xor result aren't clear, that means
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4642
  // the prototype header is no longer biased and we have to revoke
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4643
  // the bias on this object.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4644
  testl(swap_reg, markOopDesc::biased_lock_mask_in_place);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4645
  jcc(Assembler::notZero, try_revoke_bias);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4646
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4647
  // Biasing is still enabled for this data type. See whether the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4648
  // epoch of the current bias is still valid, meaning that the epoch
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4649
  // bits of the mark word are equal to the epoch bits of the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4650
  // prototype header. (Note that the prototype header's epoch bits
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4651
  // only change at a safepoint.) If not, attempt to rebias the object
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4652
  // toward the current thread. Note that we must be absolutely sure
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4653
  // that the current epoch is invalid in order to do this because
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4654
  // otherwise the manipulations it performs on the mark word are
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4655
  // illegal.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4656
  testl(swap_reg, markOopDesc::epoch_mask_in_place);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4657
  jcc(Assembler::notZero, try_rebias);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4658
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4659
  // The epoch of the current bias is still valid but we know nothing
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4660
  // about the owner; it might be set or it might be clear. Try to
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4661
  // acquire the bias of the object using an atomic operation. If this
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4662
  // fails we will go in to the runtime to revoke the object's bias.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4663
  // Note that we first construct the presumed unbiased header so we
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4664
  // don't accidentally blow away another thread's valid bias.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4665
  movl(swap_reg, saved_mark_addr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4666
  andl(swap_reg,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4667
       markOopDesc::biased_lock_mask_in_place | markOopDesc::age_mask_in_place | markOopDesc::epoch_mask_in_place);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4668
  if (need_tmp_reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4669
    push(tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4670
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4671
  get_thread(tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4672
  orl(tmp_reg, swap_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4673
  if (os::is_MP()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4674
    lock();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4675
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4676
  cmpxchgptr(tmp_reg, Address(obj_reg, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4677
  if (need_tmp_reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4678
    pop(tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4679
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4680
  // If the biasing toward our thread failed, this means that
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4681
  // another thread succeeded in biasing it toward itself and we
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4682
  // need to revoke that bias. The revocation will occur in the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4683
  // interpreter runtime in the slow case.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4684
  if (counters != NULL) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4685
    cond_inc32(Assembler::zero,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4686
               ExternalAddress((address)counters->anonymously_biased_lock_entry_count_addr()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4687
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4688
  if (slow_case != NULL) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4689
    jcc(Assembler::notZero, *slow_case);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4690
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4691
  jmp(done);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4692
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4693
  bind(try_rebias);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4694
  // At this point we know the epoch has expired, meaning that the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4695
  // current "bias owner", if any, is actually invalid. Under these
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4696
  // circumstances _only_, we are allowed to use the current header's
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4697
  // value as the comparison value when doing the cas to acquire the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4698
  // bias in the current epoch. In other words, we allow transfer of
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4699
  // the bias from one thread to another directly in this situation.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4700
  //
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4701
  // FIXME: due to a lack of registers we currently blow away the age
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4702
  // bits in this situation. Should attempt to preserve them.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4703
  if (need_tmp_reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4704
    push(tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4705
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4706
  get_thread(tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4707
  movl(swap_reg, klass_addr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4708
  orl(tmp_reg, Address(swap_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4709
  movl(swap_reg, saved_mark_addr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4710
  if (os::is_MP()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4711
    lock();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4712
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4713
  cmpxchgptr(tmp_reg, Address(obj_reg, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4714
  if (need_tmp_reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4715
    pop(tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4716
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4717
  // If the biasing toward our thread failed, then another thread
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4718
  // succeeded in biasing it toward itself and we need to revoke that
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4719
  // bias. The revocation will occur in the runtime in the slow case.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4720
  if (counters != NULL) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4721
    cond_inc32(Assembler::zero,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4722
               ExternalAddress((address)counters->rebiased_lock_entry_count_addr()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4723
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4724
  if (slow_case != NULL) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4725
    jcc(Assembler::notZero, *slow_case);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4726
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4727
  jmp(done);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4728
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4729
  bind(try_revoke_bias);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4730
  // The prototype mark in the klass doesn't have the bias bit set any
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4731
  // more, indicating that objects of this data type are not supposed
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4732
  // to be biased any more. We are going to try to reset the mark of
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4733
  // this object to the prototype value and fall through to the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4734
  // CAS-based locking scheme. Note that if our CAS fails, it means
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4735
  // that another thread raced us for the privilege of revoking the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4736
  // bias of this particular object, so it's okay to continue in the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4737
  // normal locking code.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4738
  //
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4739
  // FIXME: due to a lack of registers we currently blow away the age
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4740
  // bits in this situation. Should attempt to preserve them.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4741
  movl(swap_reg, saved_mark_addr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4742
  if (need_tmp_reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4743
    push(tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4744
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4745
  movl(tmp_reg, klass_addr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4746
  movl(tmp_reg, Address(tmp_reg, Klass::prototype_header_offset_in_bytes() + klassOopDesc::klass_part_offset_in_bytes()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4747
  if (os::is_MP()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4748
    lock();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4749
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4750
  cmpxchgptr(tmp_reg, Address(obj_reg, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4751
  if (need_tmp_reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4752
    pop(tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4753
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4754
  // Fall through to the normal CAS-based lock, because no matter what
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4755
  // the result of the above CAS, some thread must have succeeded in
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4756
  // removing the bias bit from the object's header.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4757
  if (counters != NULL) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4758
    cond_inc32(Assembler::zero,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4759
               ExternalAddress((address)counters->revoked_lock_entry_count_addr()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4760
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4761
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4762
  bind(cas_label);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4763
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4764
  return null_check_offset;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4765
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4766
void MacroAssembler::call_VM_leaf_base(address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4767
                                       int number_of_arguments) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4768
  call(RuntimeAddress(entry_point));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4769
  increment(rsp, number_of_arguments * wordSize);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4770
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4771
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4772
void MacroAssembler::cmpoop(Address src1, jobject obj) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4773
  cmp_literal32(src1, (int32_t)obj, oop_Relocation::spec_for_immediate());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4774
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4775
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4776
void MacroAssembler::cmpoop(Register src1, jobject obj) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4777
  cmp_literal32(src1, (int32_t)obj, oop_Relocation::spec_for_immediate());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4778
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4779
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4780
void MacroAssembler::extend_sign(Register hi, Register lo) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4781
  // According to Intel Doc. AP-526, "Integer Divide", p.18.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4782
  if (VM_Version::is_P6() && hi == rdx && lo == rax) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4783
    cdql();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4784
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4785
    movl(hi, lo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4786
    sarl(hi, 31);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4787
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4788
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4789
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4790
void MacroAssembler::fat_nop() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4791
  // A 5 byte nop that is safe for patching (see patch_verified_entry)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4792
  emit_byte(0x26); // es:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4793
  emit_byte(0x2e); // cs:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4794
  emit_byte(0x64); // fs:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4795
  emit_byte(0x65); // gs:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4796
  emit_byte(0x90);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4797
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4798
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4799
void MacroAssembler::jC2(Register tmp, Label& L) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4800
  // set parity bit if FPU flag C2 is set (via rax)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4801
  save_rax(tmp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4802
  fwait(); fnstsw_ax();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4803
  sahf();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4804
  restore_rax(tmp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4805
  // branch
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4806
  jcc(Assembler::parity, L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4807
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4808
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4809
void MacroAssembler::jnC2(Register tmp, Label& L) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4810
  // set parity bit if FPU flag C2 is set (via rax)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4811
  save_rax(tmp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4812
  fwait(); fnstsw_ax();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4813
  sahf();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4814
  restore_rax(tmp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4815
  // branch
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4816
  jcc(Assembler::noParity, L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4817
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4818
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4819
// 32bit can do a case table jump in one instruction but we no longer allow the base
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4820
// to be installed in the Address class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4821
void MacroAssembler::jump(ArrayAddress entry) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4822
  jmp(as_Address(entry));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4823
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4824
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4825
// Note: y_lo will be destroyed
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4826
void MacroAssembler::lcmp2int(Register x_hi, Register x_lo, Register y_hi, Register y_lo) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4827
  // Long compare for Java (semantics as described in JVM spec.)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4828
  Label high, low, done;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4829
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4830
  cmpl(x_hi, y_hi);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4831
  jcc(Assembler::less, low);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4832
  jcc(Assembler::greater, high);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4833
  // x_hi is the return register
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4834
  xorl(x_hi, x_hi);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4835
  cmpl(x_lo, y_lo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4836
  jcc(Assembler::below, low);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4837
  jcc(Assembler::equal, done);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4838
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4839
  bind(high);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4840
  xorl(x_hi, x_hi);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4841
  increment(x_hi);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4842
  jmp(done);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4843
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4844
  bind(low);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4845
  xorl(x_hi, x_hi);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4846
  decrementl(x_hi);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4847
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4848
  bind(done);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4849
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4850
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4851
void MacroAssembler::lea(Register dst, AddressLiteral src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4852
    mov_literal32(dst, (int32_t)src.target(), src.rspec());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4853
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4854
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4855
void MacroAssembler::lea(Address dst, AddressLiteral adr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4856
  // leal(dst, as_Address(adr));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4857
  // see note in movl as to why we must use a move
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4858
  mov_literal32(dst, (int32_t) adr.target(), adr.rspec());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4859
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4860
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4861
void MacroAssembler::leave() {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4862
  mov(rsp, rbp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4863
  pop(rbp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4864
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4865
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4866
void MacroAssembler::lmul(int x_rsp_offset, int y_rsp_offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4867
  // Multiplication of two Java long values stored on the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4868
  // as illustrated below. Result is in rdx:rax.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4869
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4870
  // rsp ---> [  ??  ] \               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4871
  //            ....    | y_rsp_offset  |
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4872
  //          [ y_lo ] /  (in bytes)    | x_rsp_offset
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4873
  //          [ y_hi ]                  | (in bytes)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4874
  //            ....                    |
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4875
  //          [ x_lo ]                 /
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4876
  //          [ x_hi ]
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4877
  //            ....
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4878
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4879
  // Basic idea: lo(result) = lo(x_lo * y_lo)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4880
  //             hi(result) = hi(x_lo * y_lo) + lo(x_hi * y_lo) + lo(x_lo * y_hi)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4881
  Address x_hi(rsp, x_rsp_offset + wordSize); Address x_lo(rsp, x_rsp_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4882
  Address y_hi(rsp, y_rsp_offset + wordSize); Address y_lo(rsp, y_rsp_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4883
  Label quick;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4884
  // load x_hi, y_hi and check if quick
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4885
  // multiplication is possible
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4886
  movl(rbx, x_hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4887
  movl(rcx, y_hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4888
  movl(rax, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4889
  orl(rbx, rcx);                                 // rbx, = 0 <=> x_hi = 0 and y_hi = 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4890
  jcc(Assembler::zero, quick);                   // if rbx, = 0 do quick multiply
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4891
  // do full multiplication
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4892
  // 1st step
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4893
  mull(y_lo);                                    // x_hi * y_lo
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4894
  movl(rbx, rax);                                // save lo(x_hi * y_lo) in rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4895
  // 2nd step
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4896
  movl(rax, x_lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4897
  mull(rcx);                                     // x_lo * y_hi
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4898
  addl(rbx, rax);                                // add lo(x_lo * y_hi) to rbx,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4899
  // 3rd step
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4900
  bind(quick);                                   // note: rbx, = 0 if quick multiply!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4901
  movl(rax, x_lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4902
  mull(y_lo);                                    // x_lo * y_lo
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4903
  addl(rdx, rbx);                                // correct hi(x_lo * y_lo)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4904
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4905
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4906
void MacroAssembler::lneg(Register hi, Register lo) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4907
  negl(lo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4908
  adcl(hi, 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4909
  negl(hi);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4910
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4911
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4912
void MacroAssembler::lshl(Register hi, Register lo) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4913
  // Java shift left long support (semantics as described in JVM spec., p.305)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4914
  // (basic idea for shift counts s >= n: x << s == (x << n) << (s - n))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4915
  // shift value is in rcx !
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4916
  assert(hi != rcx, "must not use rcx");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4917
  assert(lo != rcx, "must not use rcx");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4918
  const Register s = rcx;                        // shift count
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4919
  const int      n = BitsPerWord;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4920
  Label L;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4921
  andl(s, 0x3f);                                 // s := s & 0x3f (s < 0x40)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4922
  cmpl(s, n);                                    // if (s < n)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4923
  jcc(Assembler::less, L);                       // else (s >= n)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4924
  movl(hi, lo);                                  // x := x << n
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4925
  xorl(lo, lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4926
  // Note: subl(s, n) is not needed since the Intel shift instructions work rcx mod n!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4927
  bind(L);                                       // s (mod n) < n
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4928
  shldl(hi, lo);                                 // x := x << s
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4929
  shll(lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4930
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4931
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4932
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4933
void MacroAssembler::lshr(Register hi, Register lo, bool sign_extension) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4934
  // Java shift right long support (semantics as described in JVM spec., p.306 & p.310)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4935
  // (basic idea for shift counts s >= n: x >> s == (x >> n) >> (s - n))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4936
  assert(hi != rcx, "must not use rcx");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4937
  assert(lo != rcx, "must not use rcx");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4938
  const Register s = rcx;                        // shift count
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4939
  const int      n = BitsPerWord;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4940
  Label L;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4941
  andl(s, 0x3f);                                 // s := s & 0x3f (s < 0x40)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4942
  cmpl(s, n);                                    // if (s < n)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4943
  jcc(Assembler::less, L);                       // else (s >= n)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4944
  movl(lo, hi);                                  // x := x >> n
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4945
  if (sign_extension) sarl(hi, 31);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4946
  else                xorl(hi, hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4947
  // Note: subl(s, n) is not needed since the Intel shift instructions work rcx mod n!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4948
  bind(L);                                       // s (mod n) < n
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4949
  shrdl(lo, hi);                                 // x := x >> s
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4950
  if (sign_extension) sarl(hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4951
  else                shrl(hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4952
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  4953
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4954
void MacroAssembler::movoop(Register dst, jobject obj) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4955
  mov_literal32(dst, (int32_t)obj, oop_Relocation::spec_for_immediate());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4956
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4957
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4958
void MacroAssembler::movoop(Address dst, jobject obj) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4959
  mov_literal32(dst, (int32_t)obj, oop_Relocation::spec_for_immediate());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4960
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4961
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4962
void MacroAssembler::movptr(Register dst, AddressLiteral src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4963
  if (src.is_lval()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4964
    mov_literal32(dst, (intptr_t)src.target(), src.rspec());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4965
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4966
    movl(dst, as_Address(src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4967
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4968
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4969
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4970
void MacroAssembler::movptr(ArrayAddress dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4971
  movl(as_Address(dst), src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4972
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4973
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4974
void MacroAssembler::movptr(Register dst, ArrayAddress src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4975
  movl(dst, as_Address(src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4976
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4977
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4978
// src should NEVER be a real pointer. Use AddressLiteral for true pointers
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4979
void MacroAssembler::movptr(Address dst, intptr_t src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4980
  movl(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4981
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4982
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4983
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4984
void MacroAssembler::pop_callee_saved_registers() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4985
  pop(rcx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4986
  pop(rdx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4987
  pop(rdi);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4988
  pop(rsi);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4989
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4990
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4991
void MacroAssembler::pop_fTOS() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4992
  fld_d(Address(rsp, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4993
  addl(rsp, 2 * wordSize);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4994
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4995
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4996
void MacroAssembler::push_callee_saved_registers() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4997
  push(rsi);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4998
  push(rdi);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  4999
  push(rdx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5000
  push(rcx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5001
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5002
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5003
void MacroAssembler::push_fTOS() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5004
  subl(rsp, 2 * wordSize);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5005
  fstp_d(Address(rsp, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5006
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5007
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5008
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5009
void MacroAssembler::pushoop(jobject obj) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5010
  push_literal32((int32_t)obj, oop_Relocation::spec_for_immediate());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5011
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5012
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5013
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5014
void MacroAssembler::pushptr(AddressLiteral src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5015
  if (src.is_lval()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5016
    push_literal32((int32_t)src.target(), src.rspec());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5017
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5018
    pushl(as_Address(src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5019
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5020
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5021
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5022
void MacroAssembler::set_word_if_not_zero(Register dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5023
  xorl(dst, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5024
  set_byte_if_not_zero(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5025
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5026
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5027
static void pass_arg0(MacroAssembler* masm, Register arg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5028
  masm->push(arg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5029
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5030
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5031
static void pass_arg1(MacroAssembler* masm, Register arg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5032
  masm->push(arg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5033
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5034
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5035
static void pass_arg2(MacroAssembler* masm, Register arg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5036
  masm->push(arg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5037
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5038
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5039
static void pass_arg3(MacroAssembler* masm, Register arg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5040
  masm->push(arg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5041
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5042
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5043
#ifndef PRODUCT
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5044
extern "C" void findpc(intptr_t x);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5045
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5046
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5047
void MacroAssembler::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
  5048
  // In order to get locks to work, we need to fake a in_VM state
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5049
  JavaThread* thread = JavaThread::current();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5050
  JavaThreadState saved_state = thread->thread_state();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5051
  thread->set_thread_state(_thread_in_vm);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5052
  if (ShowMessageBoxOnError) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5053
    JavaThread* thread = JavaThread::current();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5054
    JavaThreadState saved_state = thread->thread_state();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5055
    thread->set_thread_state(_thread_in_vm);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5056
    if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5057
      ttyLocker ttyl;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5058
      BytecodeCounter::print();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5059
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5060
    // To see where a verify_oop failed, get $ebx+40/X for this frame.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5061
    // This is the value of eip which points to where verify_oop will return.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5062
    if (os::message_box(msg, "Execution stopped, print registers?")) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5063
      ttyLocker ttyl;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5064
      tty->print_cr("eip = 0x%08x", eip);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5065
#ifndef PRODUCT
6463
f4362c8da849 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 6433
diff changeset
  5066
      if ((WizardMode || Verbose) && PrintMiscellaneous) {
f4362c8da849 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 6433
diff changeset
  5067
        tty->cr();
f4362c8da849 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 6433
diff changeset
  5068
        findpc(eip);
f4362c8da849 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 6433
diff changeset
  5069
        tty->cr();
f4362c8da849 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 6433
diff changeset
  5070
      }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5071
#endif
6463
f4362c8da849 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 6433
diff changeset
  5072
      tty->print_cr("rax = 0x%08x", rax);
f4362c8da849 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 6433
diff changeset
  5073
      tty->print_cr("rbx = 0x%08x", rbx);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5074
      tty->print_cr("rcx = 0x%08x", rcx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5075
      tty->print_cr("rdx = 0x%08x", rdx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5076
      tty->print_cr("rdi = 0x%08x", rdi);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5077
      tty->print_cr("rsi = 0x%08x", rsi);
6463
f4362c8da849 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 6433
diff changeset
  5078
      tty->print_cr("rbp = 0x%08x", rbp);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5079
      tty->print_cr("rsp = 0x%08x", rsp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5080
      BREAKPOINT;
6463
f4362c8da849 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 6433
diff changeset
  5081
      assert(false, "start up GDB");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5082
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5083
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5084
    ttyLocker ttyl;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5085
    ::tty->print_cr("=============== DEBUG MESSAGE: %s ================\n", msg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5086
    assert(false, "DEBUG MESSAGE");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5087
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5088
  ThreadStateTransition::transition(thread, _thread_in_vm, saved_state);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5089
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5090
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5091
void MacroAssembler::stop(const char* msg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5092
  ExternalAddress message((address)msg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5093
  // push address of message
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5094
  pushptr(message.addr());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5095
  { Label L; call(L, relocInfo::none); bind(L); }     // push eip
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5096
  pusha();                                           // push registers
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5097
  call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::debug32)));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5098
  hlt();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5099
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5100
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5101
void MacroAssembler::warn(const char* msg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5102
  push_CPU_state();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5103
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5104
  ExternalAddress message((address) msg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5105
  // push address of message
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5106
  pushptr(message.addr());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5107
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5108
  call(RuntimeAddress(CAST_FROM_FN_PTR(address, warning)));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5109
  addl(rsp, wordSize);       // discard argument
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5110
  pop_CPU_state();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5111
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5112
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5113
#else // _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5114
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5115
// 64 bit versions
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5116
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5117
Address MacroAssembler::as_Address(AddressLiteral adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5118
  // amd64 always does this as a pc-rel
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5119
  // we can be absolute or disp based on the instruction type
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5120
  // jmp/call are displacements others are absolute
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5121
  assert(!adr.is_lval(), "must be rval");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5122
  assert(reachable(adr), "must be");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5123
  return Address((int32_t)(intptr_t)(adr.target() - pc()), adr.target(), adr.reloc());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5124
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5125
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5126
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5127
Address MacroAssembler::as_Address(ArrayAddress adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5128
  AddressLiteral base = adr.base();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5129
  lea(rscratch1, base);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5130
  Address index = adr.index();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5131
  assert(index._disp == 0, "must not have disp"); // maybe it can?
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5132
  Address array(rscratch1, index._index, index._scale, index._disp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5133
  return array;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5134
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5135
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5136
int MacroAssembler::biased_locking_enter(Register lock_reg,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5137
                                         Register obj_reg,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5138
                                         Register swap_reg,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5139
                                         Register tmp_reg,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5140
                                         bool swap_reg_contains_mark,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5141
                                         Label& done,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5142
                                         Label* slow_case,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5143
                                         BiasedLockingCounters* counters) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5144
  assert(UseBiasedLocking, "why call this otherwise?");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5145
  assert(swap_reg == rax, "swap_reg must be rax for cmpxchgq");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5146
  assert(tmp_reg != noreg, "tmp_reg must be supplied");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5147
  assert_different_registers(lock_reg, obj_reg, swap_reg, tmp_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5148
  assert(markOopDesc::age_shift == markOopDesc::lock_bits + markOopDesc::biased_lock_bits, "biased locking makes assumptions about bit layout");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5149
  Address mark_addr      (obj_reg, oopDesc::mark_offset_in_bytes());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5150
  Address saved_mark_addr(lock_reg, 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5151
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5152
  if (PrintBiasedLockingStatistics && counters == NULL)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5153
    counters = BiasedLocking::counters();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5154
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5155
  // Biased locking
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5156
  // See whether the lock is currently biased toward our thread and
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5157
  // whether the epoch is still valid
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5158
  // Note that the runtime guarantees sufficient alignment of JavaThread
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5159
  // pointers to allow age to be placed into low bits
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5160
  // First check to see whether biasing is even enabled for this object
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5161
  Label cas_label;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5162
  int null_check_offset = -1;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5163
  if (!swap_reg_contains_mark) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5164
    null_check_offset = offset();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5165
    movq(swap_reg, mark_addr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5166
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5167
  movq(tmp_reg, swap_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5168
  andq(tmp_reg, markOopDesc::biased_lock_mask_in_place);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5169
  cmpq(tmp_reg, markOopDesc::biased_lock_pattern);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5170
  jcc(Assembler::notEqual, cas_label);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5171
  // The bias pattern is present in the object's header. Need to check
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5172
  // whether the bias owner and the epoch are both still current.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5173
  load_prototype_header(tmp_reg, obj_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5174
  orq(tmp_reg, r15_thread);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5175
  xorq(tmp_reg, swap_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5176
  andq(tmp_reg, ~((int) markOopDesc::age_mask_in_place));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5177
  if (counters != NULL) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5178
    cond_inc32(Assembler::zero,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5179
               ExternalAddress((address) counters->anonymously_biased_lock_entry_count_addr()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5180
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5181
  jcc(Assembler::equal, done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5182
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5183
  Label try_revoke_bias;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5184
  Label try_rebias;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5185
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5186
  // At this point we know that the header has the bias pattern and
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5187
  // that we are not the bias owner in the current epoch. We need to
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5188
  // figure out more details about the state of the header in order to
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5189
  // know what operations can be legally performed on the object's
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5190
  // header.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5191
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5192
  // If the low three bits in the xor result aren't clear, that means
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5193
  // the prototype header is no longer biased and we have to revoke
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5194
  // the bias on this object.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5195
  testq(tmp_reg, markOopDesc::biased_lock_mask_in_place);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5196
  jcc(Assembler::notZero, try_revoke_bias);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5197
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5198
  // Biasing is still enabled for this data type. See whether the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5199
  // epoch of the current bias is still valid, meaning that the epoch
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5200
  // bits of the mark word are equal to the epoch bits of the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5201
  // prototype header. (Note that the prototype header's epoch bits
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5202
  // only change at a safepoint.) If not, attempt to rebias the object
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5203
  // toward the current thread. Note that we must be absolutely sure
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5204
  // that the current epoch is invalid in order to do this because
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5205
  // otherwise the manipulations it performs on the mark word are
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5206
  // illegal.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5207
  testq(tmp_reg, markOopDesc::epoch_mask_in_place);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5208
  jcc(Assembler::notZero, try_rebias);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5209
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5210
  // The epoch of the current bias is still valid but we know nothing
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5211
  // about the owner; it might be set or it might be clear. Try to
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5212
  // acquire the bias of the object using an atomic operation. If this
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5213
  // fails we will go in to the runtime to revoke the object's bias.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5214
  // Note that we first construct the presumed unbiased header so we
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5215
  // don't accidentally blow away another thread's valid bias.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5216
  andq(swap_reg,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5217
       markOopDesc::biased_lock_mask_in_place | markOopDesc::age_mask_in_place | markOopDesc::epoch_mask_in_place);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5218
  movq(tmp_reg, swap_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5219
  orq(tmp_reg, r15_thread);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5220
  if (os::is_MP()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5221
    lock();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5222
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5223
  cmpxchgq(tmp_reg, Address(obj_reg, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5224
  // If the biasing toward our thread failed, this means that
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5225
  // another thread succeeded in biasing it toward itself and we
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5226
  // need to revoke that bias. The revocation will occur in the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5227
  // interpreter runtime in the slow case.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5228
  if (counters != NULL) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5229
    cond_inc32(Assembler::zero,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5230
               ExternalAddress((address) counters->anonymously_biased_lock_entry_count_addr()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5231
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5232
  if (slow_case != NULL) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5233
    jcc(Assembler::notZero, *slow_case);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5234
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5235
  jmp(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5236
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5237
  bind(try_rebias);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5238
  // At this point we know the epoch has expired, meaning that the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5239
  // current "bias owner", if any, is actually invalid. Under these
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5240
  // circumstances _only_, we are allowed to use the current header's
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5241
  // value as the comparison value when doing the cas to acquire the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5242
  // bias in the current epoch. In other words, we allow transfer of
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5243
  // the bias from one thread to another directly in this situation.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5244
  //
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5245
  // FIXME: due to a lack of registers we currently blow away the age
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5246
  // bits in this situation. Should attempt to preserve them.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5247
  load_prototype_header(tmp_reg, obj_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5248
  orq(tmp_reg, r15_thread);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5249
  if (os::is_MP()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5250
    lock();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5251
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5252
  cmpxchgq(tmp_reg, Address(obj_reg, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5253
  // If the biasing toward our thread failed, then another thread
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5254
  // succeeded in biasing it toward itself and we need to revoke that
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5255
  // bias. The revocation will occur in the runtime in the slow case.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5256
  if (counters != NULL) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5257
    cond_inc32(Assembler::zero,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5258
               ExternalAddress((address) counters->rebiased_lock_entry_count_addr()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5259
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5260
  if (slow_case != NULL) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5261
    jcc(Assembler::notZero, *slow_case);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5262
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5263
  jmp(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5264
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5265
  bind(try_revoke_bias);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5266
  // The prototype mark in the klass doesn't have the bias bit set any
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5267
  // more, indicating that objects of this data type are not supposed
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5268
  // to be biased any more. We are going to try to reset the mark of
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5269
  // this object to the prototype value and fall through to the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5270
  // CAS-based locking scheme. Note that if our CAS fails, it means
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5271
  // that another thread raced us for the privilege of revoking the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5272
  // bias of this particular object, so it's okay to continue in the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5273
  // normal locking code.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5274
  //
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5275
  // FIXME: due to a lack of registers we currently blow away the age
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5276
  // bits in this situation. Should attempt to preserve them.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5277
  load_prototype_header(tmp_reg, obj_reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5278
  if (os::is_MP()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5279
    lock();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5280
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5281
  cmpxchgq(tmp_reg, Address(obj_reg, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5282
  // Fall through to the normal CAS-based lock, because no matter what
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5283
  // the result of the above CAS, some thread must have succeeded in
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5284
  // removing the bias bit from the object's header.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5285
  if (counters != NULL) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5286
    cond_inc32(Assembler::zero,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5287
               ExternalAddress((address) counters->revoked_lock_entry_count_addr()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5288
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5289
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5290
  bind(cas_label);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5291
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5292
  return null_check_offset;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5293
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5294
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5295
void MacroAssembler::call_VM_leaf_base(address entry_point, int num_args) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5296
  Label L, E;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5297
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5298
#ifdef _WIN64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5299
  // Windows always allocates space for it's register args
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5300
  assert(num_args <= 4, "only register arguments supported");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5301
  subq(rsp,  frame::arg_reg_save_area_bytes);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5302
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5303
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5304
  // Align stack if necessary
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5305
  testl(rsp, 15);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5306
  jcc(Assembler::zero, L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5307
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5308
  subq(rsp, 8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5309
  {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5310
    call(RuntimeAddress(entry_point));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5311
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5312
  addq(rsp, 8);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5313
  jmp(E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5314
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5315
  bind(L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5316
  {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5317
    call(RuntimeAddress(entry_point));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5318
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5319
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5320
  bind(E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5321
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5322
#ifdef _WIN64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5323
  // restore stack pointer
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5324
  addq(rsp, frame::arg_reg_save_area_bytes);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5325
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5326
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5327
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5328
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5329
void MacroAssembler::cmp64(Register src1, AddressLiteral src2) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5330
  assert(!src2.is_lval(), "should use cmpptr");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5331
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5332
  if (reachable(src2)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5333
    cmpq(src1, as_Address(src2));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5334
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5335
    lea(rscratch1, src2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5336
    Assembler::cmpq(src1, Address(rscratch1, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5337
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5338
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5339
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5340
int MacroAssembler::corrected_idivq(Register reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5341
  // Full implementation of Java ldiv and lrem; checks for special
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5342
  // case as described in JVM spec., p.243 & p.271.  The function
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5343
  // returns the (pc) offset of the idivl instruction - may be needed
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5344
  // for implicit exceptions.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5345
  //
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5346
  //         normal case                           special case
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5347
  //
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5348
  // input : rax: dividend                         min_long
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5349
  //         reg: divisor   (may not be eax/edx)   -1
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5350
  //
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5351
  // output: rax: quotient  (= rax idiv reg)       min_long
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5352
  //         rdx: remainder (= rax irem reg)       0
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5353
  assert(reg != rax && reg != rdx, "reg cannot be rax or rdx register");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5354
  static const int64_t min_long = 0x8000000000000000;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5355
  Label normal_case, special_case;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5356
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5357
  // check for special case
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5358
  cmp64(rax, ExternalAddress((address) &min_long));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5359
  jcc(Assembler::notEqual, normal_case);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5360
  xorl(rdx, rdx); // prepare rdx for possible special case (where
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5361
                  // remainder = 0)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5362
  cmpq(reg, -1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5363
  jcc(Assembler::equal, special_case);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5364
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5365
  // handle normal case
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5366
  bind(normal_case);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5367
  cdqq();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5368
  int idivq_offset = offset();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5369
  idivq(reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5370
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5371
  // normal and special case exit
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5372
  bind(special_case);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5373
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5374
  return idivq_offset;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5375
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5376
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5377
void MacroAssembler::decrementq(Register reg, int value) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5378
  if (value == min_jint) { subq(reg, value); return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5379
  if (value <  0) { incrementq(reg, -value); return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5380
  if (value == 0) {                        ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5381
  if (value == 1 && UseIncDec) { decq(reg) ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5382
  /* else */      { subq(reg, value)       ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5383
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5384
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5385
void MacroAssembler::decrementq(Address dst, int value) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5386
  if (value == min_jint) { subq(dst, value); return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5387
  if (value <  0) { incrementq(dst, -value); return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5388
  if (value == 0) {                        ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5389
  if (value == 1 && UseIncDec) { decq(dst) ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5390
  /* else */      { subq(dst, value)       ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5391
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5392
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5393
void MacroAssembler::fat_nop() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5394
  // A 5 byte nop that is safe for patching (see patch_verified_entry)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5395
  // Recommened sequence from 'Software Optimization Guide for the AMD
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5396
  // Hammer Processor'
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5397
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5398
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5399
  emit_byte(0x90);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5400
  emit_byte(0x66);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5401
  emit_byte(0x90);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5402
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5403
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5404
void MacroAssembler::incrementq(Register reg, int value) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5405
  if (value == min_jint) { addq(reg, value); return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5406
  if (value <  0) { decrementq(reg, -value); return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5407
  if (value == 0) {                        ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5408
  if (value == 1 && UseIncDec) { incq(reg) ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5409
  /* else */      { addq(reg, value)       ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5410
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5411
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5412
void MacroAssembler::incrementq(Address dst, int value) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5413
  if (value == min_jint) { addq(dst, value); return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5414
  if (value <  0) { decrementq(dst, -value); return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5415
  if (value == 0) {                        ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5416
  if (value == 1 && UseIncDec) { incq(dst) ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5417
  /* else */      { addq(dst, value)       ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5418
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5419
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5420
// 32bit can do a case table jump in one instruction but we no longer allow the base
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5421
// to be installed in the Address class
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5422
void MacroAssembler::jump(ArrayAddress entry) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5423
  lea(rscratch1, entry.base());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5424
  Address dispatch = entry.index();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5425
  assert(dispatch._base == noreg, "must be");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5426
  dispatch._base = rscratch1;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5427
  jmp(dispatch);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5428
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5429
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5430
void MacroAssembler::lcmp2int(Register x_hi, Register x_lo, Register y_hi, Register y_lo) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5431
  ShouldNotReachHere(); // 64bit doesn't use two regs
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5432
  cmpq(x_lo, y_lo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5433
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5434
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5435
void MacroAssembler::lea(Register dst, AddressLiteral src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5436
    mov_literal64(dst, (intptr_t)src.target(), src.rspec());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5437
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5438
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5439
void MacroAssembler::lea(Address dst, AddressLiteral adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5440
  mov_literal64(rscratch1, (intptr_t)adr.target(), adr.rspec());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5441
  movptr(dst, rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5442
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5443
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5444
void MacroAssembler::leave() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5445
  // %%% is this really better? Why not on 32bit too?
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5446
  emit_byte(0xC9); // LEAVE
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5447
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5448
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5449
void MacroAssembler::lneg(Register hi, Register lo) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5450
  ShouldNotReachHere(); // 64bit doesn't use two regs
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5451
  negq(lo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5452
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5453
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5454
void MacroAssembler::movoop(Register dst, jobject obj) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5455
  mov_literal64(dst, (intptr_t)obj, oop_Relocation::spec_for_immediate());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5456
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5457
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5458
void MacroAssembler::movoop(Address dst, jobject obj) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5459
  mov_literal64(rscratch1, (intptr_t)obj, oop_Relocation::spec_for_immediate());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5460
  movq(dst, rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5461
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5462
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5463
void MacroAssembler::movptr(Register dst, AddressLiteral src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5464
  if (src.is_lval()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5465
    mov_literal64(dst, (intptr_t)src.target(), src.rspec());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5466
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5467
    if (reachable(src)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5468
      movq(dst, as_Address(src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5469
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5470
      lea(rscratch1, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5471
      movq(dst, Address(rscratch1,0));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5472
    }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5473
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5474
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5475
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5476
void MacroAssembler::movptr(ArrayAddress dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5477
  movq(as_Address(dst), src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5478
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5479
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5480
void MacroAssembler::movptr(Register dst, ArrayAddress src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5481
  movq(dst, as_Address(src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5482
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5483
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5484
// src should NEVER be a real pointer. Use AddressLiteral for true pointers
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5485
void MacroAssembler::movptr(Address dst, intptr_t src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5486
  mov64(rscratch1, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5487
  movq(dst, rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5488
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5489
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5490
// These are mostly for initializing NULL
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5491
void MacroAssembler::movptr(Address dst, int32_t src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5492
  movslq(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5493
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5494
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5495
void MacroAssembler::movptr(Register dst, int32_t src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5496
  mov64(dst, (intptr_t)src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5497
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5498
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5499
void MacroAssembler::pushoop(jobject obj) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5500
  movoop(rscratch1, obj);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5501
  push(rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5502
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5503
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5504
void MacroAssembler::pushptr(AddressLiteral src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5505
  lea(rscratch1, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5506
  if (src.is_lval()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5507
    push(rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5508
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5509
    pushq(Address(rscratch1, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5510
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5511
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5512
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5513
void MacroAssembler::reset_last_Java_frame(bool clear_fp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5514
                                           bool clear_pc) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5515
  // we must set sp to zero to clear frame
1888
bbf498fb4354 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 1500
diff changeset
  5516
  movptr(Address(r15_thread, JavaThread::last_Java_sp_offset()), NULL_WORD);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5517
  // must clear fp, so that compiled frames are not confused; it is
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5518
  // possible that we need it only for debugging
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5519
  if (clear_fp) {
1888
bbf498fb4354 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 1500
diff changeset
  5520
    movptr(Address(r15_thread, JavaThread::last_Java_fp_offset()), NULL_WORD);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5521
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5522
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5523
  if (clear_pc) {
1888
bbf498fb4354 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 1500
diff changeset
  5524
    movptr(Address(r15_thread, JavaThread::last_Java_pc_offset()), NULL_WORD);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5525
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5526
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5527
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5528
void MacroAssembler::set_last_Java_frame(Register last_java_sp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5529
                                         Register last_java_fp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5530
                                         address  last_java_pc) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5531
  // determine last_java_sp register
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5532
  if (!last_java_sp->is_valid()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5533
    last_java_sp = rsp;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5534
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5535
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5536
  // last_java_fp is optional
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5537
  if (last_java_fp->is_valid()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5538
    movptr(Address(r15_thread, JavaThread::last_Java_fp_offset()),
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5539
           last_java_fp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5540
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5541
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5542
  // last_java_pc is optional
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5543
  if (last_java_pc != NULL) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5544
    Address java_pc(r15_thread,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5545
                    JavaThread::frame_anchor_offset() + JavaFrameAnchor::last_Java_pc_offset());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5546
    lea(rscratch1, InternalAddress(last_java_pc));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5547
    movptr(java_pc, rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5548
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5549
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5550
  movptr(Address(r15_thread, JavaThread::last_Java_sp_offset()), last_java_sp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5551
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5552
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5553
static void pass_arg0(MacroAssembler* masm, Register arg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5554
  if (c_rarg0 != arg ) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5555
    masm->mov(c_rarg0, arg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5556
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5557
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5558
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5559
static void pass_arg1(MacroAssembler* masm, Register arg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5560
  if (c_rarg1 != arg ) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5561
    masm->mov(c_rarg1, arg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5562
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5563
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5564
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5565
static void pass_arg2(MacroAssembler* masm, Register arg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5566
  if (c_rarg2 != arg ) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5567
    masm->mov(c_rarg2, arg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5568
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5569
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5570
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5571
static void pass_arg3(MacroAssembler* masm, Register arg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5572
  if (c_rarg3 != arg ) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5573
    masm->mov(c_rarg3, arg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5574
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5575
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5576
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5577
void MacroAssembler::stop(const char* msg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5578
  address rip = pc();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5579
  pusha(); // get regs on stack
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5580
  lea(c_rarg0, ExternalAddress((address) msg));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5581
  lea(c_rarg1, InternalAddress(rip));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5582
  movq(c_rarg2, rsp); // pass pointer to regs array
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5583
  andq(rsp, -16); // align stack as required by ABI
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5584
  call(RuntimeAddress(CAST_FROM_FN_PTR(address, MacroAssembler::debug64)));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5585
  hlt();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5586
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5587
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5588
void MacroAssembler::warn(const char* msg) {
7401
ebde7415b521 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 7397
diff changeset
  5589
  push(rsp);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5590
  andq(rsp, -16);     // align stack as required by push_CPU_state and call
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5591
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5592
  push_CPU_state();   // keeps alignment at 16 bytes
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5593
  lea(c_rarg0, ExternalAddress((address) msg));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5594
  call_VM_leaf(CAST_FROM_FN_PTR(address, warning), c_rarg0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5595
  pop_CPU_state();
7401
ebde7415b521 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 7397
diff changeset
  5596
  pop(rsp);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5597
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5598
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5599
#ifndef PRODUCT
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5600
extern "C" void findpc(intptr_t x);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5601
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5602
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5603
void MacroAssembler::debug64(char* msg, int64_t pc, int64_t regs[]) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5604
  // In order to get locks to work, we need to fake a in_VM state
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5605
  if (ShowMessageBoxOnError ) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5606
    JavaThread* thread = JavaThread::current();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5607
    JavaThreadState saved_state = thread->thread_state();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5608
    thread->set_thread_state(_thread_in_vm);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5609
#ifndef PRODUCT
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5610
    if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5611
      ttyLocker ttyl;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5612
      BytecodeCounter::print();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5613
    }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5614
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5615
    // To see where a verify_oop failed, get $ebx+40/X for this frame.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5616
    // XXX correct this offset for amd64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5617
    // This is the value of eip which points to where verify_oop will return.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5618
    if (os::message_box(msg, "Execution stopped, print registers?")) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5619
      ttyLocker ttyl;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5620
      tty->print_cr("rip = 0x%016lx", pc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5621
#ifndef PRODUCT
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5622
      tty->cr();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5623
      findpc(pc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5624
      tty->cr();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5625
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5626
      tty->print_cr("rax = 0x%016lx", regs[15]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5627
      tty->print_cr("rbx = 0x%016lx", regs[12]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5628
      tty->print_cr("rcx = 0x%016lx", regs[14]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5629
      tty->print_cr("rdx = 0x%016lx", regs[13]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5630
      tty->print_cr("rdi = 0x%016lx", regs[8]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5631
      tty->print_cr("rsi = 0x%016lx", regs[9]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5632
      tty->print_cr("rbp = 0x%016lx", regs[10]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5633
      tty->print_cr("rsp = 0x%016lx", regs[11]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5634
      tty->print_cr("r8  = 0x%016lx", regs[7]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5635
      tty->print_cr("r9  = 0x%016lx", regs[6]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5636
      tty->print_cr("r10 = 0x%016lx", regs[5]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5637
      tty->print_cr("r11 = 0x%016lx", regs[4]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5638
      tty->print_cr("r12 = 0x%016lx", regs[3]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5639
      tty->print_cr("r13 = 0x%016lx", regs[2]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5640
      tty->print_cr("r14 = 0x%016lx", regs[1]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5641
      tty->print_cr("r15 = 0x%016lx", regs[0]);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5642
      BREAKPOINT;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5643
    }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5644
    ThreadStateTransition::transition(thread, _thread_in_vm, saved_state);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5645
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5646
    ttyLocker ttyl;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5647
    ::tty->print_cr("=============== DEBUG MESSAGE: %s ================\n",
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5648
                    msg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5649
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5650
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5651
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5652
#endif // _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5653
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5654
// Now versions that are common to 32/64 bit
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5655
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5656
void MacroAssembler::addptr(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5657
  LP64_ONLY(addq(dst, imm32)) NOT_LP64(addl(dst, imm32));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5658
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5659
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5660
void MacroAssembler::addptr(Register dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5661
  LP64_ONLY(addq(dst, src)) NOT_LP64(addl(dst, src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5662
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5663
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5664
void MacroAssembler::addptr(Address dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5665
  LP64_ONLY(addq(dst, src)) NOT_LP64(addl(dst, src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5666
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5667
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5668
void MacroAssembler::align(int modulus) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5669
  if (offset() % modulus != 0) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5670
    nop(modulus - (offset() % modulus));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5671
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5672
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5673
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5674
void MacroAssembler::andpd(XMMRegister dst, AddressLiteral src) {
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  5675
  if (reachable(src)) {
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  5676
    andpd(dst, as_Address(src));
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  5677
  } else {
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  5678
    lea(rscratch1, src);
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  5679
    andpd(dst, Address(rscratch1, 0));
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  5680
  }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5681
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5682
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5683
void MacroAssembler::andptr(Register dst, int32_t imm32) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5684
  LP64_ONLY(andq(dst, imm32)) NOT_LP64(andl(dst, imm32));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5685
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5686
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5687
void MacroAssembler::atomic_incl(AddressLiteral counter_addr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5688
  pushf();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5689
  if (os::is_MP())
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5690
    lock();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5691
  incrementl(counter_addr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5692
  popf();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5693
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5694
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5695
// Writes to stack successive pages until offset reached to check for
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5696
// stack overflow + shadow pages.  This clobbers tmp.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5697
void MacroAssembler::bang_stack_size(Register size, Register tmp) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5698
  movptr(tmp, rsp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5699
  // Bang stack for total size given plus shadow page size.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5700
  // Bang one page at a time because large size can bang beyond yellow and
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5701
  // red zones.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5702
  Label loop;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5703
  bind(loop);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5704
  movl(Address(tmp, (-os::vm_page_size())), size );
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5705
  subptr(tmp, os::vm_page_size());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5706
  subl(size, os::vm_page_size());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5707
  jcc(Assembler::greater, loop);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5708
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5709
  // Bang down shadow pages too.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5710
  // The -1 because we already subtracted 1 page.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5711
  for (int i = 0; i< StackShadowPages-1; i++) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5712
    // this could be any sized move but this is can be a debugging crumb
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5713
    // so the bigger the better.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5714
    movptr(Address(tmp, (-i*os::vm_page_size())), size );
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5715
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5716
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5717
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5718
void MacroAssembler::biased_locking_exit(Register obj_reg, Register temp_reg, Label& done) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5719
  assert(UseBiasedLocking, "why call this otherwise?");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5720
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5721
  // Check for biased locking unlock case, which is a no-op
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5722
  // Note: we do not have to check the thread ID for two reasons.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5723
  // First, the interpreter checks for IllegalMonitorStateException at
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5724
  // a higher level. Second, if the bias was revoked while we held the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5725
  // lock, the object could not be rebiased toward another thread, so
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5726
  // the bias bit would be clear.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5727
  movptr(temp_reg, Address(obj_reg, oopDesc::mark_offset_in_bytes()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5728
  andptr(temp_reg, markOopDesc::biased_lock_mask_in_place);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5729
  cmpptr(temp_reg, markOopDesc::biased_lock_pattern);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5730
  jcc(Assembler::equal, done);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5731
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5732
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5733
void MacroAssembler::c2bool(Register x) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5734
  // implements x == 0 ? 0 : 1
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5735
  // note: must only look at least-significant byte of x
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5736
  //       since C-style booleans are stored in one byte
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5737
  //       only! (was bug)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5738
  andl(x, 0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5739
  setb(Assembler::notZero, x);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5740
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5741
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5742
// Wouldn't need if AddressLiteral version had new name
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5743
void MacroAssembler::call(Label& L, relocInfo::relocType rtype) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5744
  Assembler::call(L, rtype);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5745
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5746
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5747
void MacroAssembler::call(Register entry) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5748
  Assembler::call(entry);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5749
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5750
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5751
void MacroAssembler::call(AddressLiteral entry) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5752
  if (reachable(entry)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5753
    Assembler::call_literal(entry.target(), entry.rspec());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5754
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5755
    lea(rscratch1, entry);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5756
    Assembler::call(rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5757
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5758
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5759
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5760
// Implementation of call_VM versions
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5761
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5762
void MacroAssembler::call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5763
                             address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5764
                             bool check_exceptions) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5765
  Label C, E;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5766
  call(C, relocInfo::none);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5767
  jmp(E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5768
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5769
  bind(C);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5770
  call_VM_helper(oop_result, entry_point, 0, check_exceptions);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5771
  ret(0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5772
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5773
  bind(E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5774
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5775
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5776
void MacroAssembler::call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5777
                             address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5778
                             Register arg_1,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5779
                             bool check_exceptions) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5780
  Label C, E;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5781
  call(C, relocInfo::none);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5782
  jmp(E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5783
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5784
  bind(C);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5785
  pass_arg1(this, arg_1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5786
  call_VM_helper(oop_result, entry_point, 1, check_exceptions);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5787
  ret(0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5788
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5789
  bind(E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5790
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5791
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5792
void MacroAssembler::call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5793
                             address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5794
                             Register arg_1,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5795
                             Register arg_2,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5796
                             bool check_exceptions) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5797
  Label C, E;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5798
  call(C, relocInfo::none);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5799
  jmp(E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5800
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5801
  bind(C);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5802
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5803
  LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5804
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5805
  pass_arg2(this, arg_2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5806
  pass_arg1(this, arg_1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5807
  call_VM_helper(oop_result, entry_point, 2, check_exceptions);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5808
  ret(0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5809
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5810
  bind(E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5811
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5812
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5813
void MacroAssembler::call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5814
                             address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5815
                             Register arg_1,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5816
                             Register arg_2,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5817
                             Register arg_3,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5818
                             bool check_exceptions) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5819
  Label C, E;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5820
  call(C, relocInfo::none);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5821
  jmp(E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5822
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5823
  bind(C);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5824
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5825
  LP64_ONLY(assert(arg_1 != c_rarg3, "smashed arg"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5826
  LP64_ONLY(assert(arg_2 != c_rarg3, "smashed arg"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5827
  pass_arg3(this, arg_3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5828
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5829
  LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5830
  pass_arg2(this, arg_2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5831
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5832
  pass_arg1(this, arg_1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5833
  call_VM_helper(oop_result, entry_point, 3, check_exceptions);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5834
  ret(0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5835
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5836
  bind(E);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5837
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5838
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5839
void MacroAssembler::call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5840
                             Register last_java_sp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5841
                             address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5842
                             int number_of_arguments,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5843
                             bool check_exceptions) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5844
  Register thread = LP64_ONLY(r15_thread) NOT_LP64(noreg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5845
  call_VM_base(oop_result, thread, last_java_sp, entry_point, number_of_arguments, check_exceptions);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5846
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5847
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5848
void MacroAssembler::call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5849
                             Register last_java_sp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5850
                             address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5851
                             Register arg_1,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5852
                             bool check_exceptions) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5853
  pass_arg1(this, arg_1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5854
  call_VM(oop_result, last_java_sp, entry_point, 1, check_exceptions);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5855
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5856
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5857
void MacroAssembler::call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5858
                             Register last_java_sp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5859
                             address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5860
                             Register arg_1,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5861
                             Register arg_2,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5862
                             bool check_exceptions) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5863
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5864
  LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5865
  pass_arg2(this, arg_2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5866
  pass_arg1(this, arg_1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5867
  call_VM(oop_result, last_java_sp, entry_point, 2, check_exceptions);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5868
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5869
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5870
void MacroAssembler::call_VM(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5871
                             Register last_java_sp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5872
                             address entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5873
                             Register arg_1,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5874
                             Register arg_2,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5875
                             Register arg_3,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5876
                             bool check_exceptions) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5877
  LP64_ONLY(assert(arg_1 != c_rarg3, "smashed arg"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5878
  LP64_ONLY(assert(arg_2 != c_rarg3, "smashed arg"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5879
  pass_arg3(this, arg_3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5880
  LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5881
  pass_arg2(this, arg_2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5882
  pass_arg1(this, arg_1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5883
  call_VM(oop_result, last_java_sp, entry_point, 3, check_exceptions);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5884
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5885
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5886
void MacroAssembler::call_VM_base(Register oop_result,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5887
                                  Register java_thread,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5888
                                  Register last_java_sp,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5889
                                  address  entry_point,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5890
                                  int      number_of_arguments,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5891
                                  bool     check_exceptions) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5892
  // determine java_thread register
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5893
  if (!java_thread->is_valid()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5894
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5895
    java_thread = r15_thread;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5896
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5897
    java_thread = rdi;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5898
    get_thread(java_thread);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5899
#endif // LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5900
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5901
  // determine last_java_sp register
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5902
  if (!last_java_sp->is_valid()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5903
    last_java_sp = rsp;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5904
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5905
  // debugging support
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5906
  assert(number_of_arguments >= 0   , "cannot have negative number of arguments");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5907
  LP64_ONLY(assert(java_thread == r15_thread, "unexpected register"));
7401
ebde7415b521 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 7397
diff changeset
  5908
#ifdef ASSERT
ebde7415b521 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 7397
diff changeset
  5909
  LP64_ONLY(if (UseCompressedOops) verify_heapbase("call_VM_base");)
ebde7415b521 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 7397
diff changeset
  5910
#endif // ASSERT
ebde7415b521 6780143: hs203t003 hits SIGSEGV/EXCEPTION_ACCESS_VIOLATION with -XX:+UseCompressedOops
coleenp
parents: 7397
diff changeset
  5911
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5912
  assert(java_thread != oop_result  , "cannot use the same register for java_thread & oop_result");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5913
  assert(java_thread != last_java_sp, "cannot use the same register for java_thread & last_java_sp");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5914
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5915
  // push java thread (becomes first argument of C function)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5916
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5917
  NOT_LP64(push(java_thread); number_of_arguments++);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5918
  LP64_ONLY(mov(c_rarg0, r15_thread));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5919
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5920
  // set last Java frame before call
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5921
  assert(last_java_sp != rbp, "can't use ebp/rbp");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5922
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5923
  // Only interpreter should have to set fp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5924
  set_last_Java_frame(java_thread, last_java_sp, rbp, NULL);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5925
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5926
  // do the call, remove parameters
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5927
  MacroAssembler::call_VM_leaf_base(entry_point, number_of_arguments);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5928
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5929
  // restore the thread (cannot use the pushed argument since arguments
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5930
  // may be overwritten by C code generated by an optimizing compiler);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5931
  // however can use the register value directly if it is callee saved.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5932
  if (LP64_ONLY(true ||) java_thread == rdi || java_thread == rsi) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5933
    // rdi & rsi (also r15) are callee saved -> nothing to do
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5934
#ifdef ASSERT
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5935
    guarantee(java_thread != rax, "change this code");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5936
    push(rax);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5937
    { Label L;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5938
      get_thread(rax);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5939
      cmpptr(java_thread, rax);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5940
      jcc(Assembler::equal, L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5941
      stop("MacroAssembler::call_VM_base: rdi not callee saved?");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5942
      bind(L);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  5943
    }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5944
    pop(rax);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5945
#endif
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5946
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5947
    get_thread(java_thread);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5948
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5949
  // reset last Java frame
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5950
  // Only interpreter should have to clear fp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5951
  reset_last_Java_frame(java_thread, true, false);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5952
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5953
#ifndef CC_INTERP
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5954
   // C++ interp handles this in the interpreter
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5955
  check_and_handle_popframe(java_thread);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5956
  check_and_handle_earlyret(java_thread);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5957
#endif /* CC_INTERP */
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5958
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5959
  if (check_exceptions) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5960
    // check for pending exceptions (java_thread is set upon return)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5961
    cmpptr(Address(java_thread, Thread::pending_exception_offset()), (int32_t) NULL_WORD);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5962
#ifndef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5963
    jump_cc(Assembler::notEqual,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5964
            RuntimeAddress(StubRoutines::forward_exception_entry()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5965
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5966
    // This used to conditionally jump to forward_exception however it is
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5967
    // possible if we relocate that the branch will not reach. So we must jump
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5968
    // around so we can always reach
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5969
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5970
    Label ok;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5971
    jcc(Assembler::equal, ok);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5972
    jump(RuntimeAddress(StubRoutines::forward_exception_entry()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5973
    bind(ok);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5974
#endif // LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5975
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5976
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5977
  // get oop result if there is one and reset the value in the thread
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5978
  if (oop_result->is_valid()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5979
    movptr(oop_result, Address(java_thread, JavaThread::vm_result_offset()));
1888
bbf498fb4354 6787106: Hotspot 32 bit build fails on platforms having different definitions for intptr_t & int32_t
xlu
parents: 1500
diff changeset
  5980
    movptr(Address(java_thread, JavaThread::vm_result_offset()), NULL_WORD);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5981
    verify_oop(oop_result, "broken oop in call_VM_base");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5982
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5983
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5984
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5985
void MacroAssembler::call_VM_helper(Register oop_result, address entry_point, int number_of_arguments, bool check_exceptions) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5986
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5987
  // Calculate the value for last_Java_sp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5988
  // somewhat subtle. call_VM does an intermediate call
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5989
  // which places a return address on the stack just under the
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5990
  // stack pointer as the user finsihed with it. This allows
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5991
  // use to retrieve last_Java_pc from last_Java_sp[-1].
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5992
  // On 32bit we then have to push additional args on the stack to accomplish
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5993
  // the actual requested call. On 64bit call_VM only can use register args
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5994
  // so the only extra space is the return address that call_VM created.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5995
  // This hopefully explains the calculations here.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5996
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5997
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5998
  // We've pushed one address, correct last_Java_sp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  5999
  lea(rax, Address(rsp, wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6000
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6001
  lea(rax, Address(rsp, (1 + number_of_arguments) * wordSize));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6002
#endif // LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6003
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6004
  call_VM_base(oop_result, noreg, rax, entry_point, number_of_arguments, check_exceptions);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6005
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6006
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6007
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6008
void MacroAssembler::call_VM_leaf(address entry_point, int number_of_arguments) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6009
  call_VM_leaf_base(entry_point, number_of_arguments);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6010
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6011
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6012
void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6013
  pass_arg0(this, arg_0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6014
  call_VM_leaf(entry_point, 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6015
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6016
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6017
void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0, Register arg_1) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6018
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6019
  LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6020
  pass_arg1(this, arg_1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6021
  pass_arg0(this, arg_0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6022
  call_VM_leaf(entry_point, 2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6023
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6024
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6025
void MacroAssembler::call_VM_leaf(address entry_point, Register arg_0, Register arg_1, Register arg_2) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6026
  LP64_ONLY(assert(arg_0 != c_rarg2, "smashed arg"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6027
  LP64_ONLY(assert(arg_1 != c_rarg2, "smashed arg"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6028
  pass_arg2(this, arg_2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6029
  LP64_ONLY(assert(arg_0 != c_rarg1, "smashed arg"));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6030
  pass_arg1(this, arg_1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6031
  pass_arg0(this, arg_0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6032
  call_VM_leaf(entry_point, 3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6033
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6034
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6035
void MacroAssembler::check_and_handle_earlyret(Register java_thread) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6036
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6037
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6038
void MacroAssembler::check_and_handle_popframe(Register java_thread) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6039
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6040
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6041
void MacroAssembler::cmp32(AddressLiteral src1, int32_t imm) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6042
  if (reachable(src1)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6043
    cmpl(as_Address(src1), imm);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6044
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6045
    lea(rscratch1, src1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6046
    cmpl(Address(rscratch1, 0), imm);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6047
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6048
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6049
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6050
void MacroAssembler::cmp32(Register src1, AddressLiteral src2) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6051
  assert(!src2.is_lval(), "use cmpptr");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6052
  if (reachable(src2)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6053
    cmpl(src1, as_Address(src2));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6054
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6055
    lea(rscratch1, src2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6056
    cmpl(src1, Address(rscratch1, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6057
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6058
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6059
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6060
void MacroAssembler::cmp32(Register src1, int32_t imm) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6061
  Assembler::cmpl(src1, imm);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6062
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6063
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6064
void MacroAssembler::cmp32(Register src1, Address src2) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6065
  Assembler::cmpl(src1, src2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6066
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6067
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6068
void MacroAssembler::cmpsd2int(XMMRegister opr1, XMMRegister opr2, Register dst, bool unordered_is_less) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6069
  ucomisd(opr1, opr2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6070
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6071
  Label L;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6072
  if (unordered_is_less) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6073
    movl(dst, -1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6074
    jcc(Assembler::parity, L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6075
    jcc(Assembler::below , L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6076
    movl(dst, 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6077
    jcc(Assembler::equal , L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6078
    increment(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6079
  } else { // unordered is greater
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6080
    movl(dst, 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6081
    jcc(Assembler::parity, L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6082
    jcc(Assembler::above , L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6083
    movl(dst, 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6084
    jcc(Assembler::equal , L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6085
    decrementl(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6086
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6087
  bind(L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6088
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6089
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6090
void MacroAssembler::cmpss2int(XMMRegister opr1, XMMRegister opr2, Register dst, bool unordered_is_less) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6091
  ucomiss(opr1, opr2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6092
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6093
  Label L;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6094
  if (unordered_is_less) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6095
    movl(dst, -1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6096
    jcc(Assembler::parity, L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6097
    jcc(Assembler::below , L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6098
    movl(dst, 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6099
    jcc(Assembler::equal , L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6100
    increment(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6101
  } else { // unordered is greater
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6102
    movl(dst, 1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6103
    jcc(Assembler::parity, L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6104
    jcc(Assembler::above , L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6105
    movl(dst, 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6106
    jcc(Assembler::equal , L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6107
    decrementl(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6108
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6109
  bind(L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6110
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6111
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6112
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6113
void MacroAssembler::cmp8(AddressLiteral src1, int imm) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6114
  if (reachable(src1)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6115
    cmpb(as_Address(src1), imm);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6116
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6117
    lea(rscratch1, src1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6118
    cmpb(Address(rscratch1, 0), imm);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6119
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6120
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6121
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6122
void MacroAssembler::cmpptr(Register src1, AddressLiteral src2) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6123
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6124
  if (src2.is_lval()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6125
    movptr(rscratch1, src2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6126
    Assembler::cmpq(src1, rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6127
  } else if (reachable(src2)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6128
    cmpq(src1, as_Address(src2));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6129
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6130
    lea(rscratch1, src2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6131
    Assembler::cmpq(src1, Address(rscratch1, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6132
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6133
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6134
  if (src2.is_lval()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6135
    cmp_literal32(src1, (int32_t) src2.target(), src2.rspec());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6136
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6137
    cmpl(src1, as_Address(src2));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6138
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6139
#endif // _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6140
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6141
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6142
void MacroAssembler::cmpptr(Address src1, AddressLiteral src2) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6143
  assert(src2.is_lval(), "not a mem-mem compare");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6144
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6145
  // moves src2's literal address
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6146
  movptr(rscratch1, src2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6147
  Assembler::cmpq(src1, rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6148
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6149
  cmp_literal32(src1, (int32_t) src2.target(), src2.rspec());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6150
#endif // _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6151
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6152
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6153
void MacroAssembler::locked_cmpxchgptr(Register reg, AddressLiteral adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6154
  if (reachable(adr)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6155
    if (os::is_MP())
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6156
      lock();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6157
    cmpxchgptr(reg, as_Address(adr));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6158
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6159
    lea(rscratch1, adr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6160
    if (os::is_MP())
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6161
      lock();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6162
    cmpxchgptr(reg, Address(rscratch1, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6163
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6164
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6165
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6166
void MacroAssembler::cmpxchgptr(Register reg, Address adr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6167
  LP64_ONLY(cmpxchgq(reg, adr)) NOT_LP64(cmpxchgl(reg, adr));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6168
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6169
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6170
void MacroAssembler::comisd(XMMRegister dst, AddressLiteral src) {
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  6171
  if (reachable(src)) {
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  6172
    comisd(dst, as_Address(src));
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  6173
  } else {
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  6174
    lea(rscratch1, src);
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  6175
    comisd(dst, Address(rscratch1, 0));
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  6176
  }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6177
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6178
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6179
void MacroAssembler::comiss(XMMRegister dst, AddressLiteral src) {
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  6180
  if (reachable(src)) {
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  6181
    comiss(dst, as_Address(src));
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  6182
  } else {
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  6183
    lea(rscratch1, src);
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  6184
    comiss(dst, Address(rscratch1, 0));
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 4019
diff changeset
  6185
  }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6186
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6187
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6188
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6189
void MacroAssembler::cond_inc32(Condition cond, AddressLiteral counter_addr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6190
  Condition negated_cond = negate_condition(cond);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6191
  Label L;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6192
  jcc(negated_cond, L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6193
  atomic_incl(counter_addr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6194
  bind(L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6195
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6196
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6197
int MacroAssembler::corrected_idivl(Register reg) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6198
  // Full implementation of Java idiv and irem; checks for
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6199
  // special case as described in JVM spec., p.243 & p.271.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6200
  // The function returns the (pc) offset of the idivl
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6201
  // instruction - may be needed for implicit exceptions.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6202
  //
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6203
  //         normal case                           special case
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6204
  //
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6205
  // input : rax,: dividend                         min_int
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6206
  //         reg: divisor   (may not be rax,/rdx)   -1
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6207
  //
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6208
  // output: rax,: quotient  (= rax, idiv reg)       min_int
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6209
  //         rdx: remainder (= rax, irem reg)       0
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6210
  assert(reg != rax && reg != rdx, "reg cannot be rax, or rdx register");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6211
  const int min_int = 0x80000000;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6212
  Label normal_case, special_case;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6213
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6214
  // check for special case
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6215
  cmpl(rax, min_int);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6216
  jcc(Assembler::notEqual, normal_case);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6217
  xorl(rdx, rdx); // prepare rdx for possible special case (where remainder = 0)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6218
  cmpl(reg, -1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6219
  jcc(Assembler::equal, special_case);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6220
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6221
  // handle normal case
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6222
  bind(normal_case);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6223
  cdql();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6224
  int idivl_offset = offset();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6225
  idivl(reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6226
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6227
  // normal and special case exit
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6228
  bind(special_case);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6229
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6230
  return idivl_offset;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6231
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6232
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6233
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6234
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6235
void MacroAssembler::decrementl(Register reg, int value) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6236
  if (value == min_jint) {subl(reg, value) ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6237
  if (value <  0) { incrementl(reg, -value); return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6238
  if (value == 0) {                        ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6239
  if (value == 1 && UseIncDec) { decl(reg) ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6240
  /* else */      { subl(reg, value)       ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6241
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6242
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6243
void MacroAssembler::decrementl(Address dst, int value) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6244
  if (value == min_jint) {subl(dst, value) ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6245
  if (value <  0) { incrementl(dst, -value); return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6246
  if (value == 0) {                        ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6247
  if (value == 1 && UseIncDec) { decl(dst) ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6248
  /* else */      { subl(dst, value)       ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6249
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6250
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6251
void MacroAssembler::division_with_shift (Register reg, int shift_value) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6252
  assert (shift_value > 0, "illegal shift value");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6253
  Label _is_positive;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6254
  testl (reg, reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6255
  jcc (Assembler::positive, _is_positive);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6256
  int offset = (1 << shift_value) - 1 ;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6257
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6258
  if (offset == 1) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6259
    incrementl(reg);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6260
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6261
    addl(reg, offset);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6262
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6263
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6264
  bind (_is_positive);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6265
  sarl(reg, shift_value);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6266
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6267
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6268
// !defined(COMPILER2) is because of stupid core builds
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6269
#if !defined(_LP64) || defined(COMPILER1) || !defined(COMPILER2)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6270
void MacroAssembler::empty_FPU_stack() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6271
  if (VM_Version::supports_mmx()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6272
    emms();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6273
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6274
    for (int i = 8; i-- > 0; ) ffree(i);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6275
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6276
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6277
#endif // !LP64 || C1 || !C2
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6278
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6279
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6280
// Defines obj, preserves var_size_in_bytes
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6281
void MacroAssembler::eden_allocate(Register obj,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6282
                                   Register var_size_in_bytes,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6283
                                   int con_size_in_bytes,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6284
                                   Register t1,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6285
                                   Label& slow_case) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6286
  assert(obj == rax, "obj must be in rax, for cmpxchg");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6287
  assert_different_registers(obj, var_size_in_bytes, t1);
1394
apetrusenko
parents: 1388 1066
diff changeset
  6288
  if (CMSIncrementalMode || !Universe::heap()->supports_inline_contig_alloc()) {
apetrusenko
parents: 1388 1066
diff changeset
  6289
    jmp(slow_case);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6290
  } else {
1394
apetrusenko
parents: 1388 1066
diff changeset
  6291
    Register end = t1;
apetrusenko
parents: 1388 1066
diff changeset
  6292
    Label retry;
apetrusenko
parents: 1388 1066
diff changeset
  6293
    bind(retry);
apetrusenko
parents: 1388 1066
diff changeset
  6294
    ExternalAddress heap_top((address) Universe::heap()->top_addr());
apetrusenko
parents: 1388 1066
diff changeset
  6295
    movptr(obj, heap_top);
apetrusenko
parents: 1388 1066
diff changeset
  6296
    if (var_size_in_bytes == noreg) {
apetrusenko
parents: 1388 1066
diff changeset
  6297
      lea(end, Address(obj, con_size_in_bytes));
apetrusenko
parents: 1388 1066
diff changeset
  6298
    } else {
apetrusenko
parents: 1388 1066
diff changeset
  6299
      lea(end, Address(obj, var_size_in_bytes, Address::times_1));
apetrusenko
parents: 1388 1066
diff changeset
  6300
    }
apetrusenko
parents: 1388 1066
diff changeset
  6301
    // if end < obj then we wrapped around => object too long => slow case
apetrusenko
parents: 1388 1066
diff changeset
  6302
    cmpptr(end, obj);
apetrusenko
parents: 1388 1066
diff changeset
  6303
    jcc(Assembler::below, slow_case);
apetrusenko
parents: 1388 1066
diff changeset
  6304
    cmpptr(end, ExternalAddress((address) Universe::heap()->end_addr()));
apetrusenko
parents: 1388 1066
diff changeset
  6305
    jcc(Assembler::above, slow_case);
apetrusenko
parents: 1388 1066
diff changeset
  6306
    // Compare obj with the top addr, and if still equal, store the new top addr in
apetrusenko
parents: 1388 1066
diff changeset
  6307
    // end at the address of the top addr pointer. Sets ZF if was equal, and clears
apetrusenko
parents: 1388 1066
diff changeset
  6308
    // it otherwise. Use lock prefix for atomicity on MPs.
apetrusenko
parents: 1388 1066
diff changeset
  6309
    locked_cmpxchgptr(end, heap_top);
apetrusenko
parents: 1388 1066
diff changeset
  6310
    jcc(Assembler::notEqual, retry);
apetrusenko
parents: 1388 1066
diff changeset
  6311
  }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6312
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6313
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6314
void MacroAssembler::enter() {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6315
  push(rbp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6316
  mov(rbp, rsp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6317
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6318
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6319
void MacroAssembler::fcmp(Register tmp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6320
  fcmp(tmp, 1, true, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6321
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6322
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6323
void MacroAssembler::fcmp(Register tmp, int index, bool pop_left, bool pop_right) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6324
  assert(!pop_right || pop_left, "usage error");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6325
  if (VM_Version::supports_cmov()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6326
    assert(tmp == noreg, "unneeded temp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6327
    if (pop_left) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6328
      fucomip(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6329
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6330
      fucomi(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6331
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6332
    if (pop_right) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6333
      fpop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6334
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6335
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6336
    assert(tmp != noreg, "need temp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6337
    if (pop_left) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6338
      if (pop_right) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6339
        fcompp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6340
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6341
        fcomp(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6342
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6343
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6344
      fcom(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6345
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6346
    // convert FPU condition into eflags condition via rax,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6347
    save_rax(tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6348
    fwait(); fnstsw_ax();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6349
    sahf();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6350
    restore_rax(tmp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6351
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6352
  // condition codes set as follows:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6353
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6354
  // CF (corresponds to C0) if x < y
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6355
  // PF (corresponds to C2) if unordered
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6356
  // ZF (corresponds to C3) if x = y
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6357
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6358
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6359
void MacroAssembler::fcmp2int(Register dst, bool unordered_is_less) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6360
  fcmp2int(dst, unordered_is_less, 1, true, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6361
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6362
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6363
void MacroAssembler::fcmp2int(Register dst, bool unordered_is_less, int index, bool pop_left, bool pop_right) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6364
  fcmp(VM_Version::supports_cmov() ? noreg : dst, index, pop_left, pop_right);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6365
  Label L;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6366
  if (unordered_is_less) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6367
    movl(dst, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6368
    jcc(Assembler::parity, L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6369
    jcc(Assembler::below , L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6370
    movl(dst, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6371
    jcc(Assembler::equal , L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6372
    increment(dst);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6373
  } else { // unordered is greater
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6374
    movl(dst, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6375
    jcc(Assembler::parity, L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6376
    jcc(Assembler::above , L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6377
    movl(dst, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6378
    jcc(Assembler::equal , L);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6379
    decrementl(dst);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6380
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6381
  bind(L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6382
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6383
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6384
void MacroAssembler::fld_d(AddressLiteral src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6385
  fld_d(as_Address(src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6386
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6387
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6388
void MacroAssembler::fld_s(AddressLiteral src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6389
  fld_s(as_Address(src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6390
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6391
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6392
void MacroAssembler::fld_x(AddressLiteral src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6393
  Assembler::fld_x(as_Address(src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6394
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6395
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6396
void MacroAssembler::fldcw(AddressLiteral src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6397
  Assembler::fldcw(as_Address(src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6398
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6399
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6400
void MacroAssembler::fpop() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6401
  ffree();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6402
  fincstp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6403
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6404
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6405
void MacroAssembler::fremr(Register tmp) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6406
  save_rax(tmp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6407
  { Label L;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6408
    bind(L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6409
    fprem();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6410
    fwait(); fnstsw_ax();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6411
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6412
    testl(rax, 0x400);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6413
    jcc(Assembler::notEqual, L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6414
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6415
    sahf();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6416
    jcc(Assembler::parity, L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6417
#endif // _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6418
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6419
  restore_rax(tmp);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6420
  // Result is in ST0.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6421
  // Note: fxch & fpop to get rid of ST1
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6422
  // (otherwise FPU stack could overflow eventually)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6423
  fxch(1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6424
  fpop();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6425
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6426
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6427
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6428
void MacroAssembler::incrementl(AddressLiteral dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6429
  if (reachable(dst)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6430
    incrementl(as_Address(dst));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6431
  } else {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6432
    lea(rscratch1, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6433
    incrementl(Address(rscratch1, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6434
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6435
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6436
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6437
void MacroAssembler::incrementl(ArrayAddress dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6438
  incrementl(as_Address(dst));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6439
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6440
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6441
void MacroAssembler::incrementl(Register reg, int value) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6442
  if (value == min_jint) {addl(reg, value) ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6443
  if (value <  0) { decrementl(reg, -value); return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6444
  if (value == 0) {                        ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6445
  if (value == 1 && UseIncDec) { incl(reg) ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6446
  /* else */      { addl(reg, value)       ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6447
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6448
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6449
void MacroAssembler::incrementl(Address dst, int value) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6450
  if (value == min_jint) {addl(dst, value) ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6451
  if (value <  0) { decrementl(dst, -value); return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6452
  if (value == 0) {                        ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6453
  if (value == 1 && UseIncDec) { incl(dst) ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6454
  /* else */      { addl(dst, value)       ; return; }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6455
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6456
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6457
void MacroAssembler::jump(AddressLiteral dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6458
  if (reachable(dst)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6459
    jmp_literal(dst.target(), dst.rspec());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6460
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6461
    lea(rscratch1, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6462
    jmp(rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6463
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6464
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6465
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6466
void MacroAssembler::jump_cc(Condition cc, AddressLiteral dst) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6467
  if (reachable(dst)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6468
    InstructionMark im(this);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6469
    relocate(dst.reloc());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6470
    const int short_size = 2;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6471
    const int long_size = 6;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6472
    int offs = (intptr_t)dst.target() - ((intptr_t)_code_pos);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6473
    if (dst.reloc() == relocInfo::none && is8bit(offs - short_size)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6474
      // 0111 tttn #8-bit disp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6475
      emit_byte(0x70 | cc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6476
      emit_byte((offs - short_size) & 0xFF);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6477
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6478
      // 0000 1111 1000 tttn #32-bit disp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6479
      emit_byte(0x0F);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6480
      emit_byte(0x80 | cc);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6481
      emit_long(offs - long_size);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6482
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6483
  } else {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6484
#ifdef ASSERT
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6485
    warning("reversing conditional branch");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6486
#endif /* ASSERT */
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6487
    Label skip;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6488
    jccb(reverse[cc], skip);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6489
    lea(rscratch1, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6490
    Assembler::jmp(rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6491
    bind(skip);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6492
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6493
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6494
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6495
void MacroAssembler::ldmxcsr(AddressLiteral src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6496
  if (reachable(src)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6497
    Assembler::ldmxcsr(as_Address(src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6498
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6499
    lea(rscratch1, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6500
    Assembler::ldmxcsr(Address(rscratch1, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6501
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6502
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6503
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6504
int MacroAssembler::load_signed_byte(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6505
  int off;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6506
  if (LP64_ONLY(true ||) VM_Version::is_P6()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6507
    off = offset();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6508
    movsbl(dst, src); // movsxb
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6509
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6510
    off = load_unsigned_byte(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6511
    shll(dst, 24);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6512
    sarl(dst, 24);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6513
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6514
  return off;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6515
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6516
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2132
diff changeset
  6517
// Note: load_signed_short used to be called load_signed_word.
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2132
diff changeset
  6518
// Although the 'w' in x86 opcodes refers to the term "word" in the assembler
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2132
diff changeset
  6519
// manual, which means 16 bits, that usage is found nowhere in HotSpot code.
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2132
diff changeset
  6520
// The term "word" in HotSpot means a 32- or 64-bit machine word.
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2132
diff changeset
  6521
int MacroAssembler::load_signed_short(Register dst, Address src) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6522
  int off;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6523
  if (LP64_ONLY(true ||) VM_Version::is_P6()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6524
    // This is dubious to me since it seems safe to do a signed 16 => 64 bit
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6525
    // version but this is what 64bit has always done. This seems to imply
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6526
    // that users are only using 32bits worth.
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6527
    off = offset();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6528
    movswl(dst, src); // movsxw
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6529
  } else {
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2132
diff changeset
  6530
    off = load_unsigned_short(dst, src);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6531
    shll(dst, 16);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6532
    sarl(dst, 16);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6533
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6534
  return off;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6535
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6536
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6537
int MacroAssembler::load_unsigned_byte(Register dst, Address src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6538
  // According to Intel Doc. AP-526, "Zero-Extension of Short", p.16,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6539
  // and "3.9 Partial Register Penalties", p. 22).
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6540
  int off;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6541
  if (LP64_ONLY(true || ) VM_Version::is_P6() || src.uses(dst)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6542
    off = offset();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6543
    movzbl(dst, src); // movzxb
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6544
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6545
    xorl(dst, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6546
    off = offset();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6547
    movb(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6548
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6549
  return off;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6550
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6551
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2132
diff changeset
  6552
// Note: load_unsigned_short used to be called load_unsigned_word.
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2132
diff changeset
  6553
int MacroAssembler::load_unsigned_short(Register dst, Address src) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6554
  // According to Intel Doc. AP-526, "Zero-Extension of Short", p.16,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6555
  // and "3.9 Partial Register Penalties", p. 22).
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6556
  int off;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6557
  if (LP64_ONLY(true ||) VM_Version::is_P6() || src.uses(dst)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6558
    off = offset();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6559
    movzwl(dst, src); // movzxw
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6560
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6561
    xorl(dst, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6562
    off = offset();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6563
    movw(dst, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6564
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6565
  return off;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6566
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6567
8328
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6568
void MacroAssembler::load_sized_value(Register dst, Address src, size_t size_in_bytes, bool is_signed, Register dst2) {
5416
5f6377fcfd3e 6829193: JSR 292 needs to support SPARC
twisti
parents: 5253
diff changeset
  6569
  switch (size_in_bytes) {
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2132
diff changeset
  6570
#ifndef _LP64
8328
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6571
  case  8:
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6572
    assert(dst2 != noreg, "second dest register required");
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6573
    movl(dst,  src);
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6574
    movl(dst2, src.plus_disp(BytesPerInt));
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6575
    break;
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2132
diff changeset
  6576
#else
8328
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6577
  case  8:  movq(dst, src); break;
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2132
diff changeset
  6578
#endif
8328
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6579
  case  4:  movl(dst, src); break;
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6580
  case  2:  is_signed ? load_signed_short(dst, src) : load_unsigned_short(dst, src); break;
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6581
  case  1:  is_signed ? load_signed_byte( dst, src) : load_unsigned_byte( dst, src); break;
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6582
  default:  ShouldNotReachHere();
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6583
  }
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6584
}
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6585
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6586
void MacroAssembler::store_sized_value(Address dst, Register src, size_t size_in_bytes, Register src2) {
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6587
  switch (size_in_bytes) {
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6588
#ifndef _LP64
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6589
  case  8:
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6590
    assert(src2 != noreg, "second source register required");
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6591
    movl(dst,                        src);
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6592
    movl(dst.plus_disp(BytesPerInt), src2);
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6593
    break;
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6594
#else
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6595
  case  8:  movq(dst, src); break;
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6596
#endif
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6597
  case  4:  movl(dst, src); break;
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6598
  case  2:  movw(dst, src); break;
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6599
  case  1:  movb(dst, src); break;
478a1d29e5a3 7018378: JSR 292: _bound_int_mh produces wrong result on 64-bit SPARC
twisti
parents: 7724
diff changeset
  6600
  default:  ShouldNotReachHere();
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2132
diff changeset
  6601
  }
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2132
diff changeset
  6602
}
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 2132
diff changeset
  6603
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6604
void MacroAssembler::mov32(AddressLiteral dst, Register src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6605
  if (reachable(dst)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6606
    movl(as_Address(dst), src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6607
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6608
    lea(rscratch1, dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6609
    movl(Address(rscratch1, 0), src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6610
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6611
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6612
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6613
void MacroAssembler::mov32(Register dst, AddressLiteral src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6614
  if (reachable(src)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6615
    movl(dst, as_Address(src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6616
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6617
    lea(rscratch1, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6618
    movl(dst, Address(rscratch1, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6619
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6620
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6621
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6622
// C++ bool manipulation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6623
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6624
void MacroAssembler::movbool(Register dst, Address src) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6625
  if(sizeof(bool) == 1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6626
    movb(dst, src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6627
  else if(sizeof(bool) == 2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6628
    movw(dst, src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6629
  else if(sizeof(bool) == 4)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6630
    movl(dst, src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6631
  else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6632
    // unsupported
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6633
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6634
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6635
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6636
void MacroAssembler::movbool(Address dst, bool boolconst) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6637
  if(sizeof(bool) == 1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6638
    movb(dst, (int) boolconst);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6639
  else if(sizeof(bool) == 2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6640
    movw(dst, (int) boolconst);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6641
  else if(sizeof(bool) == 4)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6642
    movl(dst, (int) boolconst);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6643
  else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6644
    // unsupported
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6645
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6646
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6647
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6648
void MacroAssembler::movbool(Address dst, Register src) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6649
  if(sizeof(bool) == 1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6650
    movb(dst, src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6651
  else if(sizeof(bool) == 2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6652
    movw(dst, src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6653
  else if(sizeof(bool) == 4)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6654
    movl(dst, src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6655
  else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6656
    // unsupported
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6657
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6658
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  6659
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6660
void MacroAssembler::movbyte(ArrayAddress dst, int src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6661
  movb(as_Address(dst), src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6662
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6663
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6664
void MacroAssembler::movdbl(XMMRegister dst, AddressLiteral src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6665
  if (reachable(src)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6666
    if (UseXmmLoadAndClearUpper) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6667
      movsd (dst, as_Address(src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6668
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6669
      movlpd(dst, as_Address(src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6670
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6671
  } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6672
    lea(rscratch1, src);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6673
    if (UseXmmLoadAndClearUpper) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6674
      movsd (dst, Address(rscratch1, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6675
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6676
      movlpd(dst, Address(rscratch1, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6677
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6678
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6679
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6680
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6681
void MacroAssembler::movflt(XMMRegister dst, AddressLiteral src) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6682
  if (reachable(src)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6683
    movss(dst, as_Address(src));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  6684