hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
author iveresov
Wed, 08 Dec 2010 02:36:36 -0800
changeset 7438 6e2a9ad88dba
parent 7432 f06f1253c317
child 7713 1e06d2419258
permissions -rw-r--r--
7005241: C1: SEGV in java.util.concurrent.LinkedTransferQueue.xfer() with compressed oops Summary: Implementation of the CAS primitive for x64 compressed oops was incorrect. It kills rscratch2 register (r11), which is allocatable in C1. Also, we don't need to restore cmpval as it's never used after that, so we need only one temporary register, which can be scratch1. Reviewed-by: kvn, never
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5404
diff changeset
     2
 * Copyright (c) 2000, 2010, 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: 5404
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5404
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: 5404
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: 6774
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6774
diff changeset
    26
#include "c1/c1_Compilation.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6774
diff changeset
    27
#include "c1/c1_LIRAssembler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6774
diff changeset
    28
#include "c1/c1_MacroAssembler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6774
diff changeset
    29
#include "c1/c1_Runtime1.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6774
diff changeset
    30
#include "c1/c1_ValueStack.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6774
diff changeset
    31
#include "ci/ciArrayKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6774
diff changeset
    32
#include "ci/ciInstance.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6774
diff changeset
    33
#include "gc_interface/collectedHeap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6774
diff changeset
    34
#include "memory/barrierSet.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6774
diff changeset
    35
#include "memory/cardTableModRefBS.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6774
diff changeset
    36
#include "nativeInst_x86.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6774
diff changeset
    37
#include "oops/objArrayKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6774
diff changeset
    38
#include "runtime/sharedRuntime.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
// These masks are used to provide 128-bit aligned bitmasks to the XMM
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
// instructions, to allow sign-masking or sign-bit flipping.  They allow
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
// fast versions of NegF/NegD and AbsF/AbsD.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
// Note: 'double' and 'long long' have 32-bits alignment on x86.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
static jlong* double_quadword(jlong *adr, jlong lo, jlong hi) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  // Use the expression (adr)&(~0xF) to provide 128-bits aligned address
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  // of 128-bits operands for SSE instructions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  jlong *operand = (jlong*)(((long)adr)&((long)(~0xF)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  // Store the value to a 128-bits operand.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  operand[0] = lo;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  operand[1] = hi;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  return operand;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
// Buffer for 128-bits masks used by SSE instructions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
static jlong fp_signmask_pool[(4+1)*2]; // 4*128bits(data) + 128bits(alignment)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
// Static initialization during VM startup.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
static jlong *float_signmask_pool  = double_quadword(&fp_signmask_pool[1*2], CONST64(0x7FFFFFFF7FFFFFFF), CONST64(0x7FFFFFFF7FFFFFFF));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
static jlong *double_signmask_pool = double_quadword(&fp_signmask_pool[2*2], CONST64(0x7FFFFFFFFFFFFFFF), CONST64(0x7FFFFFFFFFFFFFFF));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
static jlong *float_signflip_pool  = double_quadword(&fp_signmask_pool[3*2], CONST64(0x8000000080000000), CONST64(0x8000000080000000));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
static jlong *double_signflip_pool = double_quadword(&fp_signmask_pool[4*2], CONST64(0x8000000000000000), CONST64(0x8000000000000000));
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
NEEDS_CLEANUP // remove this definitions ?
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
const Register IC_Klass    = rax;   // where the IC klass is cached
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
const Register SYNC_header = rax;   // synchronization header
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
const Register SHIFT_count = rcx;   // where count for shift operations must be
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
#define __ _masm->
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
static void select_different_registers(Register preserve,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
                                       Register extra,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
                                       Register &tmp1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
                                       Register &tmp2) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  if (tmp1 == preserve) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
    assert_different_registers(tmp1, tmp2, extra);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
    tmp1 = extra;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  } else if (tmp2 == preserve) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
    assert_different_registers(tmp1, tmp2, extra);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
    tmp2 = extra;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  assert_different_registers(preserve, tmp1, tmp2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
static void select_different_registers(Register preserve,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
                                       Register extra,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
                                       Register &tmp1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
                                       Register &tmp2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
                                       Register &tmp3) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  if (tmp1 == preserve) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
    assert_different_registers(tmp1, tmp2, tmp3, extra);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
    tmp1 = extra;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  } else if (tmp2 == preserve) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
    assert_different_registers(tmp1, tmp2, tmp3, extra);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
    tmp2 = extra;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
  } else if (tmp3 == preserve) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
    assert_different_registers(tmp1, tmp2, tmp3, extra);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
    tmp3 = extra;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  assert_different_registers(preserve, tmp1, tmp2, tmp3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
bool LIR_Assembler::is_small_constant(LIR_Opr opr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  if (opr->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
    LIR_Const* constant = opr->as_constant_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
    switch (constant->type()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
      case T_INT: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
        return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
      default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
        return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
LIR_Opr LIR_Assembler::receiverOpr() {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   128
  return FrameMap::receiver_opr;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
LIR_Opr LIR_Assembler::incomingReceiverOpr() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  return receiverOpr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
LIR_Opr LIR_Assembler::osrBufferPointer() {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   136
  return FrameMap::as_pointer_opr(receiverOpr()->as_register());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
//--------------fpu register translations-----------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
address LIR_Assembler::float_constant(float f) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  address const_addr = __ float_constant(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
  if (const_addr == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
    bailout("const section overflow");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
    return __ code()->consts()->start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
    return const_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
address LIR_Assembler::double_constant(double d) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  address const_addr = __ double_constant(d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  if (const_addr == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
    bailout("const section overflow");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    return __ code()->consts()->start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
    return const_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
void LIR_Assembler::set_24bit_FPU() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_24()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
void LIR_Assembler::reset_FPU() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_std()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
void LIR_Assembler::fpop() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  __ fpop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
void LIR_Assembler::fxch(int i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  __ fxch(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
void LIR_Assembler::fld(int i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  __ fld_s(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
void LIR_Assembler::ffree(int i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  __ ffree(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
void LIR_Assembler::breakpoint() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  __ int3();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
void LIR_Assembler::push(LIR_Opr opr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  if (opr->is_single_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
    __ push_reg(opr->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  } else if (opr->is_double_cpu()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   196
    NOT_LP64(__ push_reg(opr->as_register_hi()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
    __ push_reg(opr->as_register_lo());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  } else if (opr->is_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
    __ push_addr(frame_map()->address_for_slot(opr->single_stack_ix()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  } else if (opr->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
    LIR_Const* const_opr = opr->as_constant_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
    if (const_opr->type() == T_OBJECT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
      __ push_oop(const_opr->as_jobject());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
    } else if (const_opr->type() == T_INT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
      __ push_jint(const_opr->as_jint());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
void LIR_Assembler::pop(LIR_Opr opr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  if (opr->is_single_cpu()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   217
    __ pop_reg(opr->as_register());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   223
bool LIR_Assembler::is_literal_address(LIR_Address* addr) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   224
  return addr->base()->is_illegal() && addr->index()->is_illegal();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   225
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   226
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
//-------------------------------------------
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   228
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
Address LIR_Assembler::as_Address(LIR_Address* addr) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   230
  return as_Address(addr, rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   231
}
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   232
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   233
Address LIR_Assembler::as_Address(LIR_Address* addr, Register tmp) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  if (addr->base()->is_illegal()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
    assert(addr->index()->is_illegal(), "must be illegal too");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   236
    AddressLiteral laddr((address)addr->disp(), relocInfo::none);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   237
    if (! __ reachable(laddr)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   238
      __ movptr(tmp, laddr.addr());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   239
      Address res(tmp, 0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   240
      return res;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   241
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   242
      return __ as_Address(laddr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   243
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   246
  Register base = addr->base()->as_pointer_register();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  if (addr->index()->is_illegal()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
    return Address( base, addr->disp());
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   250
  } else if (addr->index()->is_cpu_register()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   251
    Register index = addr->index()->as_pointer_register();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
    return Address(base, index, (Address::ScaleFactor) addr->scale(), addr->disp());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  } else if (addr->index()->is_constant()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   254
    intptr_t addr_offset = (addr->index()->as_constant_ptr()->as_jint() << addr->scale()) + addr->disp();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   255
    assert(Assembler::is_simm32(addr_offset), "must be");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
    return Address(base, addr_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
    Unimplemented();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
    return Address();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
Address LIR_Assembler::as_Address_hi(LIR_Address* addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  Address base = as_Address(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  return Address(base._base, base._index, base._scale, base._disp + BytesPerWord);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
Address LIR_Assembler::as_Address_lo(LIR_Address* addr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  return as_Address(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
void LIR_Assembler::osr_entry() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  offsets()->set_value(CodeOffsets::OSR_Entry, code_offset());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  BlockBegin* osr_entry = compilation()->hir()->osr_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  ValueStack* entry_state = osr_entry->state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  int number_of_locks = entry_state->locks_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  // we jump here if osr happens with the interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  // state set up to continue at the beginning of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  // loop that triggered osr - in particular, we have
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  // the following registers setup:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  // rcx: osr buffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  // build frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  ciMethod* m = compilation()->method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  __ build_frame(initial_frame_size_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  // OSR buffer is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  // locals[nlocals-1..0]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  // monitors[0..number_of_locks]
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  // locals is a direct copy of the interpreter frame so in the osr buffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  // so first slot in the local array is the last local from the interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  // and last slot is local[0] (receiver) from the interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  // Similarly with locks. The first lock slot in the osr buffer is the nth lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  // from the interpreter frame, the nth lock slot in the osr buffer is 0th lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  // in the interpreter frame (the method lock if a sync method)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  // Initialize monitors in the compiled activation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
  //   rcx: pointer to osr buffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  // All other registers are dead at this point and the locals will be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  // copied into place by code emitted in the IR.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   313
  Register OSR_buf = osrBufferPointer()->as_pointer_register();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  { assert(frame::interpreter_frame_monitor_size() == BasicObjectLock::size(), "adjust code below");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
    int monitor_offset = BytesPerWord * method()->max_locals() +
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
   316
      (2 * BytesPerWord) * (number_of_locks - 1);
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
   317
    // SharedRuntime::OSR_migration_begin() packs BasicObjectLocks in
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
   318
    // the OSR buffer using 2 word entries: first the lock and then
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
   319
    // the oop.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
    for (int i = 0; i < number_of_locks; i++) {
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
   321
      int slot_offset = monitor_offset - ((i * 2) * BytesPerWord);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
      // verify the interpreter's monitor has a non-null object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
        Label L;
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
   326
        __ cmpptr(Address(OSR_buf, slot_offset + 1*BytesPerWord), (int32_t)NULL_WORD);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
        __ jcc(Assembler::notZero, L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
        __ stop("locked object is NULL");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
        __ bind(L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
#endif
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
   332
      __ movptr(rbx, Address(OSR_buf, slot_offset + 0));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   333
      __ movptr(frame_map()->address_for_monitor_lock(i), rbx);
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
   334
      __ movptr(rbx, Address(OSR_buf, slot_offset + 1*BytesPerWord));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   335
      __ movptr(frame_map()->address_for_monitor_object(i), rbx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
// inline cache check; done before the frame is built.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
int LIR_Assembler::check_icache() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  Register receiver = FrameMap::receiver_opr->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  Register ic_klass = IC_Klass;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   345
  const int ic_cmp_size = LP64_ONLY(10) NOT_LP64(9);
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   346
  const bool do_post_padding = VerifyOops || UseCompressedOops;
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   347
  if (!do_post_padding) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
    // insert some nops so that the verified entry point is aligned on CodeEntryAlignment
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   349
    while ((__ offset() + ic_cmp_size) % CodeEntryAlignment != 0) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
      __ nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  int offset = __ offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  __ inline_cache_check(receiver, IC_Klass);
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   355
  assert(__ offset() % CodeEntryAlignment == 0 || do_post_padding, "alignment must be correct");
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   356
  if (do_post_padding) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
    // force alignment after the cache check.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
    // It's been verified to be aligned if !VerifyOops
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
    __ align(CodeEntryAlignment);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  return offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
void LIR_Assembler::jobject2reg_with_patching(Register reg, CodeEmitInfo* info) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  jobject o = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  PatchingStub* patch = new PatchingStub(_masm, PatchingStub::load_klass_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  __ movoop(reg, o);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  patching_epilog(patch, lir_patch_normal, reg, info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
void LIR_Assembler::monitorexit(LIR_Opr obj_opr, LIR_Opr lock_opr, Register new_hdr, int monitor_no, Register exception) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  if (exception->is_valid()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
    // preserve exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
    // note: the monitor_exit runtime call is a leaf routine
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
    //       and cannot block => no GC can happen
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
    // The slow case (MonitorAccessStub) uses the first two stack slots
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
    // ([esp+0] and [esp+4]), therefore we store the exception at [esp+8]
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   380
    __ movptr (Address(rsp, 2*wordSize), exception);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
  Register obj_reg  = obj_opr->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  Register lock_reg = lock_opr->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  // setup registers (lock_reg must be rax, for lock_object)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  assert(obj_reg != SYNC_header && lock_reg != SYNC_header, "rax, must be available here");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  Register hdr = lock_reg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  assert(new_hdr == SYNC_header, "wrong register");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  lock_reg = new_hdr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  // compute pointer to BasicLock
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  Address lock_addr = frame_map()->address_for_monitor_lock(monitor_no);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   393
  __ lea(lock_reg, lock_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  // unlock object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  MonitorAccessStub* slow_case = new MonitorExitStub(lock_opr, true, monitor_no);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
  // _slow_case_stubs->append(slow_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  // temporary fix: must be created after exceptionhandler, therefore as call stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  _slow_case_stubs->append(slow_case);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
  if (UseFastLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
    // try inlined fast unlocking first, revert to slow locking if it fails
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
    // note: lock_reg points to the displaced header since the displaced header offset is 0!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
    assert(BasicLock::displaced_header_offset_in_bytes() == 0, "lock_reg must point to the displaced header");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
    __ unlock_object(hdr, obj_reg, lock_reg, *slow_case->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
    // always do slow unlocking
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
    // note: the slow unlocking code could be inlined here, however if we use
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
    //       slow unlocking, speed doesn't matter anyway and this solution is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
    //       simpler and requires less duplicated code - additionally, the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
    //       slow unlocking code is the same in either case which simplifies
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
    //       debugging
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
    __ jmp(*slow_case->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  // done
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  __ bind(*slow_case->continuation());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  if (exception->is_valid()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
    // restore exception
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   418
    __ movptr (exception, Address(rsp, 2 * wordSize));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
// This specifies the rsp decrement needed to build the frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
int LIR_Assembler::initial_frame_size_in_bytes() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  // if rounding, must let FrameMap know!
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   425
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   426
  // The frame_map records size in slots (32bit word)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   427
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   428
  // subtract two words to account for return address and link
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   429
  return (frame_map()->framesize() - (2*VMRegImpl::slots_per_word))  * VMRegImpl::stack_slot_size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
4752
67a506670cd0 6921352: JSR 292 needs its own deopt handler
twisti
parents: 4749
diff changeset
   433
int LIR_Assembler::emit_exception_handler() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  // if the last instruction is a call (typically to do a throw which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  // is coming at the end after block reordering) the return address
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  // must still point into the code area in order to avoid assertion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  // failures when searching for the corresponding bci => add a nop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  // (was bug 5/14/1999 - gri)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  __ nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  // generate code for exception handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  address handler_base = __ start_a_stub(exception_handler_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  if (handler_base == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
    // not enough space left for the handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
    bailout("exception handler overflow");
4752
67a506670cd0 6921352: JSR 292 needs its own deopt handler
twisti
parents: 4749
diff changeset
   446
    return -1;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  }
4752
67a506670cd0 6921352: JSR 292 needs its own deopt handler
twisti
parents: 4749
diff changeset
   448
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  int offset = code_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
   451
  // the exception oop and pc are in rax, and rdx
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  // no other registers need to be preserved, so invalidate them
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
   453
  __ invalidate_registers(false, true, true, false, true, true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  // check that there is really an exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  __ verify_not_null_oop(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
   458
  // search an exception handler (rax: exception oop, rdx: throwing pc)
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
   459
  __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::handle_exception_nofpu_id)));
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
   460
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
   461
  __ stop("should not reach here");
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
   462
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  assert(code_offset() - offset <= exception_handler_size, "overflow");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  __ end_a_stub();
4752
67a506670cd0 6921352: JSR 292 needs its own deopt handler
twisti
parents: 4749
diff changeset
   465
67a506670cd0 6921352: JSR 292 needs its own deopt handler
twisti
parents: 4749
diff changeset
   466
  return offset;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
4752
67a506670cd0 6921352: JSR 292 needs its own deopt handler
twisti
parents: 4749
diff changeset
   469
5334
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   470
// Emit the code to remove the frame from the stack in the exception
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   471
// unwind path.
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   472
int LIR_Assembler::emit_unwind_handler() {
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   473
#ifndef PRODUCT
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   474
  if (CommentedAssembly) {
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   475
    _masm->block_comment("Unwind handler");
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   476
  }
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   477
#endif
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   478
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   479
  int offset = code_offset();
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   480
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   481
  // Fetch the exception from TLS and clear out exception related thread state
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   482
  __ get_thread(rsi);
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   483
  __ movptr(rax, Address(rsi, JavaThread::exception_oop_offset()));
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   484
  __ movptr(Address(rsi, JavaThread::exception_oop_offset()), (int32_t)NULL_WORD);
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   485
  __ movptr(Address(rsi, JavaThread::exception_pc_offset()), (int32_t)NULL_WORD);
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   486
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   487
  __ bind(_unwind_handler_entry);
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   488
  __ verify_not_null_oop(rax);
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   489
  if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) {
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   490
    __ mov(rsi, rax);  // Preserve the exception
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   491
  }
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   492
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   493
  // Preform needed unlocking
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   494
  MonitorExitStub* stub = NULL;
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   495
  if (method()->is_synchronized()) {
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   496
    monitor_address(0, FrameMap::rax_opr);
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   497
    stub = new MonitorExitStub(FrameMap::rax_opr, true, 0);
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   498
    __ unlock_object(rdi, rbx, rax, *stub->entry());
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   499
    __ bind(*stub->continuation());
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   500
  }
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   501
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   502
  if (compilation()->env()->dtrace_method_probes()) {
6756
01ac7b1701eb 6988018: dtrace/hotspot/MethodInvocation/MethodInvocation002 crashes with client compiler
never
parents: 6461
diff changeset
   503
    __ get_thread(rax);
01ac7b1701eb 6988018: dtrace/hotspot/MethodInvocation/MethodInvocation002 crashes with client compiler
never
parents: 6461
diff changeset
   504
    __ movptr(Address(rsp, 0), rax);
01ac7b1701eb 6988018: dtrace/hotspot/MethodInvocation/MethodInvocation002 crashes with client compiler
never
parents: 6461
diff changeset
   505
    __ movoop(Address(rsp, sizeof(void*)), method()->constant_encoding());
5334
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   506
    __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_method_exit)));
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   507
  }
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   508
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   509
  if (method()->is_synchronized() || compilation()->env()->dtrace_method_probes()) {
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   510
    __ mov(rax, rsi);  // Restore the exception
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   511
  }
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   512
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   513
  // remove the activation and dispatch to the unwind handler
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   514
  __ remove_frame(initial_frame_size_in_bytes());
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   515
  __ jump(RuntimeAddress(Runtime1::entry_for(Runtime1::unwind_exception_id)));
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   516
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   517
  // Emit the slow path assembly
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   518
  if (stub != NULL) {
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   519
    stub->emit_code(this);
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   520
  }
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   521
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   522
  return offset;
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   523
}
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   524
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
   525
4752
67a506670cd0 6921352: JSR 292 needs its own deopt handler
twisti
parents: 4749
diff changeset
   526
int LIR_Assembler::emit_deopt_handler() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  // if the last instruction is a call (typically to do a throw which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  // is coming at the end after block reordering) the return address
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
  // must still point into the code area in order to avoid assertion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  // failures when searching for the corresponding bci => add a nop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  // (was bug 5/14/1999 - gri)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  __ nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
  // generate code for exception handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  address handler_base = __ start_a_stub(deopt_handler_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  if (handler_base == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
    // not enough space left for the handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
    bailout("deopt handler overflow");
4752
67a506670cd0 6921352: JSR 292 needs its own deopt handler
twisti
parents: 4749
diff changeset
   539
    return -1;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  }
4752
67a506670cd0 6921352: JSR 292 needs its own deopt handler
twisti
parents: 4749
diff changeset
   541
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  int offset = code_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  InternalAddress here(__ pc());
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
   544
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  __ pushptr(here.addr());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  __ jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack()));
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
   547
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  assert(code_offset() - offset <= deopt_handler_size, "overflow");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  __ end_a_stub();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
4752
67a506670cd0 6921352: JSR 292 needs its own deopt handler
twisti
parents: 4749
diff changeset
   551
  return offset;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
// This is the fast version of java.lang.String.compare; it has not
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
// OSR-entry and therefore, we generate a slow version for OSR's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
void LIR_Assembler::emit_string_compare(LIR_Opr arg0, LIR_Opr arg1, LIR_Opr dst, CodeEmitInfo* info) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   558
  __ movptr (rbx, rcx); // receiver is in rcx
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   559
  __ movptr (rax, arg1->as_register());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  // Get addresses of first characters from both Strings
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   562
  __ load_heap_oop(rsi, Address(rax, java_lang_String::value_offset_in_bytes()));
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   563
  __ movptr       (rcx, Address(rax, java_lang_String::offset_offset_in_bytes()));
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   564
  __ lea          (rsi, Address(rsi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  // rbx, may be NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  add_debug_info_for_null_check_here(info);
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   569
  __ load_heap_oop(rdi, Address(rbx, java_lang_String::value_offset_in_bytes()));
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   570
  __ movptr       (rcx, Address(rbx, java_lang_String::offset_offset_in_bytes()));
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   571
  __ lea          (rdi, Address(rdi, rcx, Address::times_2, arrayOopDesc::base_offset_in_bytes(T_CHAR)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
  // compute minimum length (in rax) and difference of lengths (on top of stack)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  if (VM_Version::supports_cmov()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   575
    __ movl     (rbx, Address(rbx, java_lang_String::count_offset_in_bytes()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   576
    __ movl     (rax, Address(rax, java_lang_String::count_offset_in_bytes()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   577
    __ mov      (rcx, rbx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   578
    __ subptr   (rbx, rax); // subtract lengths
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   579
    __ push     (rbx);      // result
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   580
    __ cmov     (Assembler::lessEqual, rax, rcx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
    Label L;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   583
    __ movl     (rbx, Address(rbx, java_lang_String::count_offset_in_bytes()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   584
    __ movl     (rcx, Address(rax, java_lang_String::count_offset_in_bytes()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   585
    __ mov      (rax, rbx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   586
    __ subptr   (rbx, rcx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   587
    __ push     (rbx);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   588
    __ jcc      (Assembler::lessEqual, L);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   589
    __ mov      (rax, rcx);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
    __ bind (L);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  // is minimum length 0?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  Label noLoop, haveResult;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   594
  __ testptr (rax, rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  __ jcc (Assembler::zero, noLoop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  // compare first characters
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1888
diff changeset
   598
  __ load_unsigned_short(rcx, Address(rdi, 0));
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1888
diff changeset
   599
  __ load_unsigned_short(rbx, Address(rsi, 0));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  __ subl(rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  __ jcc(Assembler::notZero, haveResult);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  // starting loop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
  __ decrement(rax); // we already tested index: skip one
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  __ jcc(Assembler::zero, noLoop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  // set rsi.edi to the end of the arrays (arrays have same length)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
  // negate the index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   609
  __ lea(rsi, Address(rsi, rax, Address::times_2, type2aelembytes(T_CHAR)));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   610
  __ lea(rdi, Address(rdi, rax, Address::times_2, type2aelembytes(T_CHAR)));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   611
  __ negptr(rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
  // compare the strings in a loop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  Label loop;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
  __ align(wordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  __ bind(loop);
2148
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1888
diff changeset
   618
  __ load_unsigned_short(rcx, Address(rdi, rax, Address::times_2, 0));
09c7f703773b 6812678: macro assembler needs delayed binding of a few constants (for 6655638)
jrose
parents: 1888
diff changeset
   619
  __ load_unsigned_short(rbx, Address(rsi, rax, Address::times_2, 0));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
  __ subl(rcx, rbx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
  __ jcc(Assembler::notZero, haveResult);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
  __ increment(rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  __ jcc(Assembler::notZero, loop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  // strings are equal up to min length
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  __ bind(noLoop);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   628
  __ pop(rax);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
  return_op(LIR_OprFact::illegalOpr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
  __ bind(haveResult);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
  // leave instruction is going to discard the TOS value
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   633
  __ mov (rax, rcx); // result of call is in rax,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
void LIR_Assembler::return_op(LIR_Opr result) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
  assert(result->is_illegal() || !result->is_single_cpu() || result->as_register() == rax, "word returns are in rax,");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  if (!result->is_illegal() && result->is_float_kind() && !result->is_xmm_register()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
    assert(result->fpu() == 0, "result must already be on TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
  // Pop the stack before the safepoint code
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
   644
  __ remove_frame(initial_frame_size_in_bytes());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  bool result_is_oop = result->is_valid() ? result->is_oop() : false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  // Note: we do not need to round double result; float result has the right precision
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  // the poll sets the condition code, but no data registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  AddressLiteral polling_page(os::get_polling_page() + (SafepointPollOffset % os::vm_page_size()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
                              relocInfo::poll_return_type);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   652
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   653
  // NOTE: the requires that the polling page be reachable else the reloc
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   654
  // goes to the movq that loads the address and not the faulting instruction
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   655
  // which breaks the signal handler code
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   656
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  __ test32(rax, polling_page);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
  __ ret(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
int LIR_Assembler::safepoint_poll(LIR_Opr tmp, CodeEmitInfo* info) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
  AddressLiteral polling_page(os::get_polling_page() + (SafepointPollOffset % os::vm_page_size()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
                              relocInfo::poll_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  if (info != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
    add_debug_info_for_branch(info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
  int offset = __ offset();
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   674
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   675
  // NOTE: the requires that the polling page be reachable else the reloc
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   676
  // goes to the movq that loads the address and not the faulting instruction
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   677
  // which breaks the signal handler code
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   678
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
  __ test32(rax, polling_page);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
  return offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
void LIR_Assembler::move_regs(Register from_reg, Register to_reg) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   685
  if (from_reg != to_reg) __ mov(to_reg, from_reg);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
void LIR_Assembler::swap_reg(Register a, Register b) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   689
  __ xchgptr(a, b);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
void LIR_Assembler::const2reg(LIR_Opr src, LIR_Opr dest, LIR_PatchCode patch_code, CodeEmitInfo* info) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
  assert(src->is_constant(), "should not call otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
  assert(dest->is_register(), "should not call otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  LIR_Const* c = src->as_constant_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  switch (c->type()) {
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   699
    case T_INT: {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   700
      assert(patch_code == lir_patch_none, "no patching handled here");
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   701
      __ movl(dest->as_register(), c->as_jint());
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   702
      break;
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   703
    }
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   704
5048
c31b6243f37e 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 5046
diff changeset
   705
    case T_ADDRESS: {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
      assert(patch_code == lir_patch_none, "no patching handled here");
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   707
      __ movptr(dest->as_register(), c->as_jint());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
    case T_LONG: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
      assert(patch_code == lir_patch_none, "no patching handled here");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   713
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   714
      __ movptr(dest->as_register_lo(), (intptr_t)c->as_jlong());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   715
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   716
      __ movptr(dest->as_register_lo(), c->as_jint_lo());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   717
      __ movptr(dest->as_register_hi(), c->as_jint_hi());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   718
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
    case T_OBJECT: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
      if (patch_code != lir_patch_none) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
        jobject2reg_with_patching(dest->as_register(), info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
        __ movoop(dest->as_register(), c->as_jobject());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
    case T_FLOAT: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
      if (dest->is_single_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
        if (c->is_zero_float()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
          __ xorps(dest->as_xmm_float_reg(), dest->as_xmm_float_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
          __ movflt(dest->as_xmm_float_reg(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
                   InternalAddress(float_constant(c->as_jfloat())));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
        assert(dest->is_single_fpu(), "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
        assert(dest->fpu_regnr() == 0, "dest must be TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
        if (c->is_zero_float()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
          __ fldz();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
        } else if (c->is_one_float()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
          __ fld1();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
          __ fld_s (InternalAddress(float_constant(c->as_jfloat())));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
    case T_DOUBLE: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
      if (dest->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
        if (c->is_zero_double()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
          __ xorpd(dest->as_xmm_double_reg(), dest->as_xmm_double_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
          __ movdbl(dest->as_xmm_double_reg(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
                    InternalAddress(double_constant(c->as_jdouble())));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
        assert(dest->is_double_fpu(), "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
        assert(dest->fpu_regnrLo() == 0, "dest must be TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
        if (c->is_zero_double()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
          __ fldz();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
        } else if (c->is_one_double()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
          __ fld1();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
          __ fld_d (InternalAddress(double_constant(c->as_jdouble())));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
void LIR_Assembler::const2stack(LIR_Opr src, LIR_Opr dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  assert(src->is_constant(), "should not call otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
  assert(dest->is_stack(), "should not call otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
  LIR_Const* c = src->as_constant_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
  switch (c->type()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
    case T_INT:  // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
    case T_FLOAT:
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   788
      __ movl(frame_map()->address_for_slot(dest->single_stack_ix()), c->as_jint_bits());
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   789
      break;
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   790
5048
c31b6243f37e 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 5046
diff changeset
   791
    case T_ADDRESS:
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   792
      __ movptr(frame_map()->address_for_slot(dest->single_stack_ix()), c->as_jint_bits());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
    case T_OBJECT:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
      __ movoop(frame_map()->address_for_slot(dest->single_stack_ix()), c->as_jobject());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
    case T_LONG:  // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
    case T_DOUBLE:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   801
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   802
      __ movptr(frame_map()->address_for_slot(dest->double_stack_ix(),
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   803
                                            lo_word_offset_in_bytes), (intptr_t)c->as_jlong_bits());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   804
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   805
      __ movptr(frame_map()->address_for_slot(dest->double_stack_ix(),
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   806
                                              lo_word_offset_in_bytes), c->as_jint_lo_bits());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   807
      __ movptr(frame_map()->address_for_slot(dest->double_stack_ix(),
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   808
                                              hi_word_offset_in_bytes), c->as_jint_hi_bits());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   809
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   817
void LIR_Assembler::const2mem(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmitInfo* info, bool wide) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  assert(src->is_constant(), "should not call otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  assert(dest->is_address(), "should not call otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
  LIR_Const* c = src->as_constant_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
  LIR_Address* addr = dest->as_address_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   823
  int null_check_here = code_offset();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
  switch (type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
    case T_INT:    // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
    case T_FLOAT:
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   827
      __ movl(as_Address(addr), c->as_jint_bits());
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   828
      break;
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   829
5048
c31b6243f37e 6932496: c1: deoptimization of jsr subroutine fails on sparcv9
roland
parents: 5046
diff changeset
   830
    case T_ADDRESS:
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   831
      __ movptr(as_Address(addr), c->as_jint_bits());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
    case T_OBJECT:  // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
    case T_ARRAY:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
      if (c->as_jobject() == NULL) {
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   837
        if (UseCompressedOops && !wide) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   838
          __ movl(as_Address(addr), (int32_t)NULL_WORD);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   839
        } else {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   840
          __ movptr(as_Address(addr), NULL_WORD);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   841
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
      } else {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   843
        if (is_literal_address(addr)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   844
          ShouldNotReachHere();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   845
          __ movoop(as_Address(addr, noreg), c->as_jobject());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   846
        } else {
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
   847
#ifdef _LP64
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
   848
          __ movoop(rscratch1, c->as_jobject());
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   849
          if (UseCompressedOops && !wide) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   850
            __ encode_heap_oop(rscratch1);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   851
            null_check_here = code_offset();
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   852
            __ movl(as_Address_lo(addr), rscratch1);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   853
          } else {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   854
            null_check_here = code_offset();
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   855
            __ movptr(as_Address_lo(addr), rscratch1);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
   856
          }
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
   857
#else
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   858
          __ movoop(as_Address(addr), c->as_jobject());
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
   859
#endif
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   860
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
    case T_LONG:    // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
    case T_DOUBLE:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   866
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   867
      if (is_literal_address(addr)) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   868
        ShouldNotReachHere();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   869
        __ movptr(as_Address(addr, r15_thread), (intptr_t)c->as_jlong_bits());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   870
      } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   871
        __ movptr(r10, (intptr_t)c->as_jlong_bits());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   872
        null_check_here = code_offset();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   873
        __ movptr(as_Address_lo(addr), r10);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   874
      }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   875
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   876
      // Always reachable in 32bit so this doesn't produce useless move literal
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   877
      __ movptr(as_Address_hi(addr), c->as_jint_hi_bits());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   878
      __ movptr(as_Address_lo(addr), c->as_jint_lo_bits());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   879
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
    case T_BOOLEAN: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
    case T_BYTE:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
      __ movb(as_Address(addr), c->as_jint() & 0xFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
    case T_CHAR:    // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
    case T_SHORT:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
      __ movw(as_Address(addr), c->as_jint() & 0xFFFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  };
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   895
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   896
  if (info != NULL) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   897
    add_debug_info_for_null_check(null_check_here, info);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   898
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
}
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 LIR_Assembler::reg2reg(LIR_Opr src, LIR_Opr dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  assert(src->is_register(), "should not call otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
  assert(dest->is_register(), "should not call otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
  // move between cpu-registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
  if (dest->is_single_cpu()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   908
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   909
    if (src->type() == T_LONG) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   910
      // Can do LONG -> OBJECT
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   911
      move_regs(src->as_register_lo(), dest->as_register());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   912
      return;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   913
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   914
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
    assert(src->is_single_cpu(), "must match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
    if (src->type() == T_OBJECT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
      __ verify_oop(src->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
    move_regs(src->as_register(), dest->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
  } else if (dest->is_double_cpu()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   922
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   923
    if (src->type() == T_OBJECT || src->type() == T_ARRAY) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   924
      // Surprising to me but we can see move of a long to t_object
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   925
      __ verify_oop(src->as_register());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   926
      move_regs(src->as_register(), dest->as_register_lo());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   927
      return;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   928
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   929
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
    assert(src->is_double_cpu(), "must match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
    Register f_lo = src->as_register_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
    Register f_hi = src->as_register_hi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
    Register t_lo = dest->as_register_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
    Register t_hi = dest->as_register_hi();
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   935
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   936
    assert(f_hi == f_lo, "must be same");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   937
    assert(t_hi == t_lo, "must be same");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   938
    move_regs(f_lo, t_lo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   939
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
    assert(f_lo != f_hi && t_lo != t_hi, "invalid register allocation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   942
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
    if (f_lo == t_hi && f_hi == t_lo) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
      swap_reg(f_lo, f_hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
    } else if (f_hi == t_lo) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
      assert(f_lo != t_hi, "overwriting register");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
      move_regs(f_hi, t_hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
      move_regs(f_lo, t_lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
      assert(f_hi != t_lo, "overwriting register");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
      move_regs(f_lo, t_lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
      move_regs(f_hi, t_hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
    }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   954
#endif // LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
    // special moves from fpu-register to xmm-register
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
    // necessary for method results
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
  } else if (src->is_single_xmm() && !dest->is_single_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
    __ movflt(Address(rsp, 0), src->as_xmm_float_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
    __ fld_s(Address(rsp, 0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
  } else if (src->is_double_xmm() && !dest->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
    __ movdbl(Address(rsp, 0), src->as_xmm_double_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
    __ fld_d(Address(rsp, 0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
  } else if (dest->is_single_xmm() && !src->is_single_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
    __ fstp_s(Address(rsp, 0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
    __ movflt(dest->as_xmm_float_reg(), Address(rsp, 0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
  } else if (dest->is_double_xmm() && !src->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
    __ fstp_d(Address(rsp, 0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
    __ movdbl(dest->as_xmm_double_reg(), Address(rsp, 0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
    // move between xmm-registers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
  } else if (dest->is_single_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
    assert(src->is_single_xmm(), "must match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
    __ movflt(dest->as_xmm_float_reg(), src->as_xmm_float_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
  } else if (dest->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
    assert(src->is_double_xmm(), "must match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
    __ movdbl(dest->as_xmm_double_reg(), src->as_xmm_double_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
    // move between fpu-registers (no instruction necessary because of fpu-stack)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
  } else if (dest->is_single_fpu() || dest->is_double_fpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
    assert(src->is_single_fpu() || src->is_double_fpu(), "must match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
    assert(src->fpu() == dest->fpu(), "currently should be nothing to do");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
void LIR_Assembler::reg2stack(LIR_Opr src, LIR_Opr dest, BasicType type, bool pop_fpu_stack) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
  assert(src->is_register(), "should not call otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
  assert(dest->is_stack(), "should not call otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
  if (src->is_single_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
    Address dst = frame_map()->address_for_slot(dest->single_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
    if (type == T_OBJECT || type == T_ARRAY) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
      __ verify_oop(src->as_register());
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   996
      __ movptr (dst, src->as_register());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   997
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
   998
      __ movl (dst, src->as_register());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
  } else if (src->is_double_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
    Address dstLO = frame_map()->address_for_slot(dest->double_stack_ix(), lo_word_offset_in_bytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
    Address dstHI = frame_map()->address_for_slot(dest->double_stack_ix(), hi_word_offset_in_bytes);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1004
    __ movptr (dstLO, src->as_register_lo());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1005
    NOT_LP64(__ movptr (dstHI, src->as_register_hi()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
  } else if (src->is_single_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
    Address dst_addr = frame_map()->address_for_slot(dest->single_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
    __ movflt(dst_addr, src->as_xmm_float_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
  } else if (src->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
    Address dst_addr = frame_map()->address_for_slot(dest->double_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
    __ movdbl(dst_addr, src->as_xmm_double_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
  } else if (src->is_single_fpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
    assert(src->fpu_regnr() == 0, "argument must be on TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
    Address dst_addr = frame_map()->address_for_slot(dest->single_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
    if (pop_fpu_stack)     __ fstp_s (dst_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
    else                   __ fst_s  (dst_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
  } else if (src->is_double_fpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
    assert(src->fpu_regnrLo() == 0, "argument must be on TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
    Address dst_addr = frame_map()->address_for_slot(dest->double_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
    if (pop_fpu_stack)     __ fstp_d (dst_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
    else                   __ fst_d  (dst_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1033
void LIR_Assembler::reg2mem(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool pop_fpu_stack, bool wide, bool /* unaligned */) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  LIR_Address* to_addr = dest->as_address_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
  PatchingStub* patch = NULL;
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1036
  Register compressed_src = rscratch1;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
  if (type == T_ARRAY || type == T_OBJECT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
    __ verify_oop(src->as_register());
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1040
#ifdef _LP64
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1041
    if (UseCompressedOops && !wide) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1042
      __ movptr(compressed_src, src->as_register());
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1043
      __ encode_heap_oop(compressed_src);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1044
    }
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1045
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  }
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1047
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
  if (patch_code != lir_patch_none) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
    patch = new PatchingStub(_masm, PatchingStub::access_field_id);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1050
    Address toa = as_Address(to_addr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1051
    assert(toa.disp() != 0, "must have");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
  }
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1053
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1054
  int null_check_here = code_offset();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
  switch (type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
    case T_FLOAT: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
      if (src->is_single_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
        __ movflt(as_Address(to_addr), src->as_xmm_float_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
        assert(src->is_single_fpu(), "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
        assert(src->fpu_regnr() == 0, "argument must be on TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
        if (pop_fpu_stack)      __ fstp_s(as_Address(to_addr));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
        else                    __ fst_s (as_Address(to_addr));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
    case T_DOUBLE: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
      if (src->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
        __ movdbl(as_Address(to_addr), src->as_xmm_double_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
        assert(src->is_double_fpu(), "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
        assert(src->fpu_regnrLo() == 0, "argument must be on TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
        if (pop_fpu_stack)      __ fstp_d(as_Address(to_addr));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
        else                    __ fst_d (as_Address(to_addr));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
    case T_ARRAY:   // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
    case T_OBJECT:  // fall through
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1082
      if (UseCompressedOops && !wide) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1083
        __ movl(as_Address(to_addr), compressed_src);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1084
      } else {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1085
        __ movptr(as_Address(to_addr), src->as_register());
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1086
      }
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1087
      break;
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1088
    case T_ADDRESS:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1089
      __ movptr(as_Address(to_addr), src->as_register());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1090
      break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
    case T_INT:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
      __ movl(as_Address(to_addr), src->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
    case T_LONG: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
      Register from_lo = src->as_register_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
      Register from_hi = src->as_register_hi();
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1098
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1099
      __ movptr(as_Address_lo(to_addr), from_lo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1100
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
      Register base = to_addr->base()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
      Register index = noreg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
      if (to_addr->index()->is_register()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
        index = to_addr->index()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
      if (base == from_lo || index == from_lo) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
        assert(base != from_hi, "can't be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
        assert(index == noreg || (index != base && index != from_hi), "can't handle this");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
        __ movl(as_Address_hi(to_addr), from_hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
        if (patch != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
          patching_epilog(patch, lir_patch_high, base, info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
          patch = new PatchingStub(_masm, PatchingStub::access_field_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
          patch_code = lir_patch_low;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
        __ movl(as_Address_lo(to_addr), from_lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
        assert(index == noreg || (index != base && index != from_lo), "can't handle this");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
        __ movl(as_Address_lo(to_addr), from_lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
        if (patch != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
          patching_epilog(patch, lir_patch_low, base, info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
          patch = new PatchingStub(_masm, PatchingStub::access_field_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
          patch_code = lir_patch_high;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
        __ movl(as_Address_hi(to_addr), from_hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
      }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1126
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
    case T_BYTE:    // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
    case T_BOOLEAN: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
      Register src_reg = src->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
      Address dst_addr = as_Address(to_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
      assert(VM_Version::is_P6() || src_reg->has_byte_register(), "must use byte registers if not P6");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
      __ movb(dst_addr, src_reg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
    case T_CHAR:    // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
    case T_SHORT:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
      __ movw(as_Address(to_addr), src->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
  }
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1147
  if (info != NULL) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1148
    add_debug_info_for_null_check(null_check_here, info);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1149
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
  if (patch_code != lir_patch_none) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
    patching_epilog(patch, patch_code, to_addr->base()->as_register(), info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
void LIR_Assembler::stack2reg(LIR_Opr src, LIR_Opr dest, BasicType type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
  assert(src->is_stack(), "should not call otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
  assert(dest->is_register(), "should not call otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
  if (dest->is_single_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
    if (type == T_ARRAY || type == T_OBJECT) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1163
      __ movptr(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
      __ verify_oop(dest->as_register());
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1165
    } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1166
      __ movl(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
  } else if (dest->is_double_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
    Address src_addr_LO = frame_map()->address_for_slot(src->double_stack_ix(), lo_word_offset_in_bytes);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
    Address src_addr_HI = frame_map()->address_for_slot(src->double_stack_ix(), hi_word_offset_in_bytes);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1172
    __ movptr(dest->as_register_lo(), src_addr_LO);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1173
    NOT_LP64(__ movptr(dest->as_register_hi(), src_addr_HI));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
  } else if (dest->is_single_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
    Address src_addr = frame_map()->address_for_slot(src->single_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
    __ movflt(dest->as_xmm_float_reg(), src_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
  } else if (dest->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
    Address src_addr = frame_map()->address_for_slot(src->double_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
    __ movdbl(dest->as_xmm_double_reg(), src_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
  } else if (dest->is_single_fpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
    assert(dest->fpu_regnr() == 0, "dest must be TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
    Address src_addr = frame_map()->address_for_slot(src->single_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
    __ fld_s(src_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
  } else if (dest->is_double_fpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
    assert(dest->fpu_regnrLo() == 0, "dest must be TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
    Address src_addr = frame_map()->address_for_slot(src->double_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
    __ fld_d(src_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
void LIR_Assembler::stack2stack(LIR_Opr src, LIR_Opr dest, BasicType type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
  if (src->is_single_stack()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1201
    if (type == T_OBJECT || type == T_ARRAY) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1202
      __ pushptr(frame_map()->address_for_slot(src ->single_stack_ix()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1203
      __ popptr (frame_map()->address_for_slot(dest->single_stack_ix()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1204
    } else {
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
  1205
#ifndef _LP64
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1206
      __ pushl(frame_map()->address_for_slot(src ->single_stack_ix()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1207
      __ popl (frame_map()->address_for_slot(dest->single_stack_ix()));
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
  1208
#else
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
  1209
      //no pushl on 64bits
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
  1210
      __ movl(rscratch1, frame_map()->address_for_slot(src ->single_stack_ix()));
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
  1211
      __ movl(frame_map()->address_for_slot(dest->single_stack_ix()), rscratch1);
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
  1212
#endif
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1213
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
  } else if (src->is_double_stack()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1216
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1217
    __ pushptr(frame_map()->address_for_slot(src ->double_stack_ix()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1218
    __ popptr (frame_map()->address_for_slot(dest->double_stack_ix()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1219
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
    __ pushl(frame_map()->address_for_slot(src ->double_stack_ix(), 0));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1221
    // push and pop the part at src + wordSize, adding wordSize for the previous push
1125
0e9a5f36b566 6746320: Hotspot regression test for 6512111 fails in -Xmixed mode
never
parents: 1066
diff changeset
  1222
    __ pushl(frame_map()->address_for_slot(src ->double_stack_ix(), 2 * wordSize));
0e9a5f36b566 6746320: Hotspot regression test for 6512111 fails in -Xmixed mode
never
parents: 1066
diff changeset
  1223
    __ popl (frame_map()->address_for_slot(dest->double_stack_ix(), 2 * wordSize));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
    __ popl (frame_map()->address_for_slot(dest->double_stack_ix(), 0));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1225
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1233
void LIR_Assembler::mem2reg(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool wide, bool /* unaligned */) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
  assert(src->is_address(), "should not call otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
  assert(dest->is_register(), "should not call otherwise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
  LIR_Address* addr = src->as_address_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
  Address from_addr = as_Address(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
  switch (type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
    case T_BOOLEAN: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
    case T_BYTE:    // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
    case T_CHAR:    // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
    case T_SHORT:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
      if (!VM_Version::is_P6() && !from_addr.uses(dest->as_register())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
        // on pre P6 processors we may get partial register stalls
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
        // so blow away the value of to_rinfo before loading a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
        // partial word into it.  Do it here so that it precedes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
        // the potential patch point below.
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1250
        __ xorptr(dest->as_register(), dest->as_register());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
  PatchingStub* patch = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
  if (patch_code != lir_patch_none) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
    patch = new PatchingStub(_masm, PatchingStub::access_field_id);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1258
    assert(from_addr.disp() != 0, "must have");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
  if (info != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
    add_debug_info_for_null_check_here(info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1262
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
  switch (type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
    case T_FLOAT: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1266
      if (dest->is_single_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
        __ movflt(dest->as_xmm_float_reg(), from_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
        assert(dest->is_single_fpu(), "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
        assert(dest->fpu_regnr() == 0, "dest must be TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
        __ fld_s(from_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
    case T_DOUBLE: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
      if (dest->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
        __ movdbl(dest->as_xmm_double_reg(), from_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
        assert(dest->is_double_fpu(), "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
        assert(dest->fpu_regnrLo() == 0, "dest must be TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
        __ fld_d(from_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
    case T_OBJECT:  // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
    case T_ARRAY:   // fall through
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1289
      if (UseCompressedOops && !wide) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1290
        __ movl(dest->as_register(), from_addr);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1291
      } else {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1292
        __ movptr(dest->as_register(), from_addr);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1293
      }
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1294
      break;
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1295
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1296
    case T_ADDRESS:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1297
      __ movptr(dest->as_register(), from_addr);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1298
      break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
    case T_INT:
5354
30df1bf62cca 6946892: c1 shouldn't sign-extend to upper 32bits on x64
iveresov
parents: 5334
diff changeset
  1300
      __ movl(dest->as_register(), from_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
    case T_LONG: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
      Register to_lo = dest->as_register_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
      Register to_hi = dest->as_register_hi();
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1306
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1307
      __ movptr(to_lo, as_Address_lo(addr));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1308
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
      Register base = addr->base()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
      Register index = noreg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
      if (addr->index()->is_register()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
        index = addr->index()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
      if ((base == to_lo && index == to_hi) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
          (base == to_hi && index == to_lo)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
        // addresses with 2 registers are only formed as a result of
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1317
        // array access so this code will never have to deal with
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
        // patches or null checks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
        assert(info == NULL && patch == NULL, "must be");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1320
        __ lea(to_hi, as_Address(addr));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
        __ movl(to_lo, Address(to_hi, 0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
        __ movl(to_hi, Address(to_hi, BytesPerWord));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
      } else if (base == to_lo || index == to_lo) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
        assert(base != to_hi, "can't be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
        assert(index == noreg || (index != base && index != to_hi), "can't handle this");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
        __ movl(to_hi, as_Address_hi(addr));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
        if (patch != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
          patching_epilog(patch, lir_patch_high, base, info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
          patch = new PatchingStub(_masm, PatchingStub::access_field_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
          patch_code = lir_patch_low;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
        __ movl(to_lo, as_Address_lo(addr));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
        assert(index == noreg || (index != base && index != to_lo), "can't handle this");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
        __ movl(to_lo, as_Address_lo(addr));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
        if (patch != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
          patching_epilog(patch, lir_patch_low, base, info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
          patch = new PatchingStub(_masm, PatchingStub::access_field_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
          patch_code = lir_patch_high;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
        __ movl(to_hi, as_Address_hi(addr));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1342
      }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1343
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
    case T_BOOLEAN: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
    case T_BYTE: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
      Register dest_reg = dest->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
      assert(VM_Version::is_P6() || dest_reg->has_byte_register(), "must use byte registers if not P6");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
      if (VM_Version::is_P6() || from_addr.uses(dest_reg)) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1352
        __ movsbl(dest_reg, from_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
        __ movb(dest_reg, from_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
        __ shll(dest_reg, 24);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
        __ sarl(dest_reg, 24);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
    case T_CHAR: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
      Register dest_reg = dest->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
      assert(VM_Version::is_P6() || dest_reg->has_byte_register(), "must use byte registers if not P6");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
      if (VM_Version::is_P6() || from_addr.uses(dest_reg)) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1365
        __ movzwl(dest_reg, from_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
        __ movw(dest_reg, from_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1369
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
    case T_SHORT: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
      Register dest_reg = dest->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
      if (VM_Version::is_P6() || from_addr.uses(dest_reg)) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1375
        __ movswl(dest_reg, from_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
        __ movw(dest_reg, from_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
        __ shll(dest_reg, 16);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
        __ sarl(dest_reg, 16);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1380
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1383
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1384
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1385
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
  if (patch != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
    patching_epilog(patch, patch_code, addr->base()->as_register(), info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1390
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1391
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
  if (type == T_ARRAY || type == T_OBJECT) {
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1393
#ifdef _LP64
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1394
    if (UseCompressedOops && !wide) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1395
      __ decode_heap_oop(dest->as_register());
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1396
    }
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1397
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
    __ verify_oop(dest->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
void LIR_Assembler::prefetchr(LIR_Opr src) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
  LIR_Address* addr = src->as_address_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
  Address from_addr = as_Address(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
  if (VM_Version::supports_sse()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
    switch (ReadPrefetchInstr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
      case 0:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
        __ prefetchnta(from_addr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
      case 1:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
        __ prefetcht0(from_addr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
      case 2:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
        __ prefetcht2(from_addr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
      default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
        ShouldNotReachHere(); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
  } else if (VM_Version::supports_3dnow()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
    __ prefetchr(from_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
void LIR_Assembler::prefetchw(LIR_Opr src) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
  LIR_Address* addr = src->as_address_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
  Address from_addr = as_Address(addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1428
  if (VM_Version::supports_sse()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1429
    switch (AllocatePrefetchInstr) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1430
      case 0:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
        __ prefetchnta(from_addr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1432
      case 1:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
        __ prefetcht0(from_addr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
      case 2:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1435
        __ prefetcht2(from_addr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1436
      case 3:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
        __ prefetchw(from_addr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
      default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
        ShouldNotReachHere(); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
  } else if (VM_Version::supports_3dnow()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
    __ prefetchw(from_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1445
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1446
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1447
NEEDS_CLEANUP; // This could be static?
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
Address::ScaleFactor LIR_Assembler::array_element_size(BasicType type) const {
202
dc13bf0e5d5d 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 1
diff changeset
  1449
  int elem_size = type2aelembytes(type);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
  switch (elem_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
    case 1: return Address::times_1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
    case 2: return Address::times_2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
    case 4: return Address::times_4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
    case 8: return Address::times_8;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
  return Address::no_scale;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
void LIR_Assembler::emit_op3(LIR_Op3* op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
  switch (op->code()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
    case lir_idiv:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
    case lir_irem:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
      arithmetic_idiv(op->code(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
                      op->in_opr1(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
                      op->in_opr2(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
                      op->in_opr3(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
                      op->result_opr(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
                      op->info());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
    default:      ShouldNotReachHere(); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1475
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1476
void LIR_Assembler::emit_opBranch(LIR_OpBranch* op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
  assert(op->block() == NULL || op->block()->label() == op->label(), "wrong label");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1479
  if (op->block() != NULL)  _branch_target_blocks.append(op->block());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1480
  if (op->ublock() != NULL) _branch_target_blocks.append(op->ublock());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
  if (op->cond() == lir_cond_always) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
    if (op->info() != NULL) add_debug_info_for_branch(op->info());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
    __ jmp (*(op->label()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1486
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1487
    Assembler::Condition acond = Assembler::zero;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
    if (op->code() == lir_cond_float_branch) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
      assert(op->ublock() != NULL, "must have unordered successor");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1490
      __ jcc(Assembler::parity, *(op->ublock()->label()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1491
      switch(op->cond()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
        case lir_cond_equal:        acond = Assembler::equal;      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
        case lir_cond_notEqual:     acond = Assembler::notEqual;   break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
        case lir_cond_less:         acond = Assembler::below;      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
        case lir_cond_lessEqual:    acond = Assembler::belowEqual; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
        case lir_cond_greaterEqual: acond = Assembler::aboveEqual; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1497
        case lir_cond_greater:      acond = Assembler::above;      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
        default:                         ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1500
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1501
      switch (op->cond()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1502
        case lir_cond_equal:        acond = Assembler::equal;       break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
        case lir_cond_notEqual:     acond = Assembler::notEqual;    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1504
        case lir_cond_less:         acond = Assembler::less;        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1505
        case lir_cond_lessEqual:    acond = Assembler::lessEqual;   break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
        case lir_cond_greaterEqual: acond = Assembler::greaterEqual;break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
        case lir_cond_greater:      acond = Assembler::greater;     break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
        case lir_cond_belowEqual:   acond = Assembler::belowEqual;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
        case lir_cond_aboveEqual:   acond = Assembler::aboveEqual;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
        default:                         ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1511
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1512
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1513
    __ jcc(acond,*(op->label()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1514
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1516
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
void LIR_Assembler::emit_opConvert(LIR_OpConvert* op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1518
  LIR_Opr src  = op->in_opr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
  LIR_Opr dest = op->result_opr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
  switch (op->bytecode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1522
    case Bytecodes::_i2l:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1523
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1524
      __ movl2ptr(dest->as_register_lo(), src->as_register());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1525
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1526
      move_regs(src->as_register(), dest->as_register_lo());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1527
      move_regs(src->as_register(), dest->as_register_hi());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
      __ sarl(dest->as_register_hi(), 31);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1529
#endif // LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1530
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1531
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1532
    case Bytecodes::_l2i:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1533
      move_regs(src->as_register_lo(), dest->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1534
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1535
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1536
    case Bytecodes::_i2b:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1537
      move_regs(src->as_register(), dest->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1538
      __ sign_extend_byte(dest->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1539
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1540
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1541
    case Bytecodes::_i2c:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1542
      move_regs(src->as_register(), dest->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1543
      __ andl(dest->as_register(), 0xFFFF);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1544
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1545
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1546
    case Bytecodes::_i2s:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1547
      move_regs(src->as_register(), dest->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1548
      __ sign_extend_short(dest->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1549
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1550
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1551
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1552
    case Bytecodes::_f2d:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1553
    case Bytecodes::_d2f:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1554
      if (dest->is_single_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1555
        __ cvtsd2ss(dest->as_xmm_float_reg(), src->as_xmm_double_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1556
      } else if (dest->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1557
        __ cvtss2sd(dest->as_xmm_double_reg(), src->as_xmm_float_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1558
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1559
        assert(src->fpu() == dest->fpu(), "register must be equal");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1560
        // do nothing (float result is rounded later through spilling)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1561
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1562
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
    case Bytecodes::_i2f:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
    case Bytecodes::_i2d:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1566
      if (dest->is_single_xmm()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1567
        __ cvtsi2ssl(dest->as_xmm_float_reg(), src->as_register());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1568
      } else if (dest->is_double_xmm()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1569
        __ cvtsi2sdl(dest->as_xmm_double_reg(), src->as_register());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1570
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1571
        assert(dest->fpu() == 0, "result must be on TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
        __ movl(Address(rsp, 0), src->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1573
        __ fild_s(Address(rsp, 0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1575
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1576
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1577
    case Bytecodes::_f2i:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1578
    case Bytecodes::_d2i:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1579
      if (src->is_single_xmm()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1580
        __ cvttss2sil(dest->as_register(), src->as_xmm_float_reg());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1581
      } else if (src->is_double_xmm()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1582
        __ cvttsd2sil(dest->as_register(), src->as_xmm_double_reg());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1583
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1584
        assert(src->fpu() == 0, "input must be on TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1585
        __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_trunc()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1586
        __ fist_s(Address(rsp, 0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1587
        __ movl(dest->as_register(), Address(rsp, 0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1588
        __ fldcw(ExternalAddress(StubRoutines::addr_fpu_cntrl_wrd_std()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1589
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1590
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1591
      // IA32 conversion instructions do not match JLS for overflow, underflow and NaN -> fixup in stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1592
      assert(op->stub() != NULL, "stub required");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1593
      __ cmpl(dest->as_register(), 0x80000000);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1594
      __ jcc(Assembler::equal, *op->stub()->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1595
      __ bind(*op->stub()->continuation());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1596
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1597
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1598
    case Bytecodes::_l2f:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1599
    case Bytecodes::_l2d:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1600
      assert(!dest->is_xmm_register(), "result in xmm register not supported (no SSE instruction present)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1601
      assert(dest->fpu() == 0, "result must be on TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1602
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1603
      __ movptr(Address(rsp, 0),            src->as_register_lo());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1604
      NOT_LP64(__ movl(Address(rsp, BytesPerWord), src->as_register_hi()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1605
      __ fild_d(Address(rsp, 0));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1606
      // float result is rounded later through spilling
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1607
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1608
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1609
    case Bytecodes::_f2l:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1610
    case Bytecodes::_d2l:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1611
      assert(!src->is_xmm_register(), "input in xmm register not supported (no SSE instruction present)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1612
      assert(src->fpu() == 0, "input must be on TOS");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1613
      assert(dest == FrameMap::long0_opr, "runtime stub places result in these registers");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1614
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1615
      // instruction sequence too long to inline it here
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1616
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1617
        __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::fpu2long_stub_id)));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1618
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1619
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1620
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1621
    default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1622
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1623
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1624
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1625
void LIR_Assembler::emit_alloc_obj(LIR_OpAllocObj* op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1626
  if (op->init_check()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1627
    __ cmpl(Address(op->klass()->as_register(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1628
                    instanceKlass::init_state_offset_in_bytes() + sizeof(oopDesc)),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1629
            instanceKlass::fully_initialized);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1630
    add_debug_info_for_null_check_here(op->stub()->info());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1631
    __ jcc(Assembler::notEqual, *op->stub()->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1632
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1633
  __ allocate_object(op->obj()->as_register(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1634
                     op->tmp1()->as_register(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1635
                     op->tmp2()->as_register(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1636
                     op->header_size(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1637
                     op->object_size(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1638
                     op->klass()->as_register(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1639
                     *op->stub()->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1640
  __ bind(*op->stub()->continuation());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1641
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1642
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1643
void LIR_Assembler::emit_alloc_array(LIR_OpAllocArray* op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1644
  if (UseSlowPath ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1645
      (!UseFastNewObjectArray && (op->type() == T_OBJECT || op->type() == T_ARRAY)) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1646
      (!UseFastNewTypeArray   && (op->type() != T_OBJECT && op->type() != T_ARRAY))) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1647
    __ jmp(*op->stub()->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1648
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1649
    Register len =  op->len()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1650
    Register tmp1 = op->tmp1()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1651
    Register tmp2 = op->tmp2()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1652
    Register tmp3 = op->tmp3()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1653
    if (len == tmp1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1654
      tmp1 = tmp3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1655
    } else if (len == tmp2) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1656
      tmp2 = tmp3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1657
    } else if (len == tmp3) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1658
      // everything is ok
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1659
    } else {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1660
      __ mov(tmp3, len);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1661
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1662
    __ allocate_array(op->obj()->as_register(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1663
                      len,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1664
                      tmp1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1665
                      tmp2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1666
                      arrayOopDesc::header_size(op->type()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1667
                      array_element_size(op->type()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1668
                      op->klass()->as_register(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1669
                      *op->stub()->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1670
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1671
  __ bind(*op->stub()->continuation());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1672
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1673
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1674
void LIR_Assembler::type_profile_helper(Register mdo,
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1675
                                        ciMethodData *md, ciProfileData *data,
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1676
                                        Register recv, Label* update_done) {
6478
75ef8813e3e2 6988779: c1_LIRAssembler_x86.cpp crashes VS2010 compiler
iveresov
parents: 6461
diff changeset
  1677
  for (uint i = 0; i < ReceiverTypeData::row_limit(); i++) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1678
    Label next_test;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1679
    // See if the receiver is receiver[n].
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1680
    __ cmpptr(recv, Address(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_offset(i))));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1681
    __ jccb(Assembler::notEqual, next_test);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1682
    Address data_addr(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_count_offset(i)));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1683
    __ addptr(data_addr, DataLayout::counter_increment);
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1684
    __ jmp(*update_done);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1685
    __ bind(next_test);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1686
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1687
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1688
  // Didn't find receiver; find next empty slot and fill it in
6478
75ef8813e3e2 6988779: c1_LIRAssembler_x86.cpp crashes VS2010 compiler
iveresov
parents: 6461
diff changeset
  1689
  for (uint i = 0; i < ReceiverTypeData::row_limit(); i++) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1690
    Label next_test;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1691
    Address recv_addr(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_offset(i)));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1692
    __ cmpptr(recv_addr, (intptr_t)NULL_WORD);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1693
    __ jccb(Assembler::notEqual, next_test);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1694
    __ movptr(recv_addr, recv);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1695
    __ movptr(Address(mdo, md->byte_offset_of_slot(data, ReceiverTypeData::receiver_count_offset(i))), DataLayout::counter_increment);
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1696
    __ jmp(*update_done);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1697
    __ bind(next_test);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1698
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1699
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1700
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1701
void LIR_Assembler::emit_typecheck_helper(LIR_OpTypeCheck *op, Label* success, Label* failure, Label* obj_is_null) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1702
  // we always need a stub for the failure case.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1703
  CodeStub* stub = op->stub();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1704
  Register obj = op->object()->as_register();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1705
  Register k_RInfo = op->tmp1()->as_register();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1706
  Register klass_RInfo = op->tmp2()->as_register();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1707
  Register dst = op->result_opr()->as_register();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1708
  ciKlass* k = op->klass();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1709
  Register Rtmp1 = noreg;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1710
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1711
  // check if it needs to be profiled
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1712
  ciMethodData* md;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1713
  ciProfileData* data;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1714
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1715
  if (op->should_profile()) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1716
    ciMethod* method = op->profiled_method();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1717
    assert(method != NULL, "Should have method");
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1718
    int bci = op->profiled_bci();
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7427
diff changeset
  1719
    md = method->method_data_or_null();
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7427
diff changeset
  1720
    assert(md != NULL, "Sanity");
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1721
    data = md->bci_to_data(bci);
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1722
    assert(data != NULL,                "need data for type check");
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1723
    assert(data->is_ReceiverTypeData(), "need ReceiverTypeData for type check");
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1724
  }
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1725
  Label profile_cast_success, profile_cast_failure;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1726
  Label *success_target = op->should_profile() ? &profile_cast_success : success;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1727
  Label *failure_target = op->should_profile() ? &profile_cast_failure : failure;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1728
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1729
  if (obj == k_RInfo) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1730
    k_RInfo = dst;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1731
  } else if (obj == klass_RInfo) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1732
    klass_RInfo = dst;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1733
  }
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1734
  if (k->is_loaded() && !UseCompressedOops) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1735
    select_different_registers(obj, dst, k_RInfo, klass_RInfo);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1736
  } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1737
    Rtmp1 = op->tmp3()->as_register();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1738
    select_different_registers(obj, dst, k_RInfo, klass_RInfo, Rtmp1);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1739
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1740
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1741
  assert_different_registers(obj, k_RInfo, klass_RInfo);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1742
  if (!k->is_loaded()) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1743
    jobject2reg_with_patching(k_RInfo, op->info_for_patch());
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1744
  } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1745
#ifdef _LP64
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1746
    __ movoop(k_RInfo, k->constant_encoding());
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1747
#endif // _LP64
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1748
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1749
  assert(obj != k_RInfo, "must be different");
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1750
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1751
  __ cmpptr(obj, (int32_t)NULL_WORD);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1752
  if (op->should_profile()) {
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1753
    Label not_null;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1754
    __ jccb(Assembler::notEqual, not_null);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1755
    // Object is null; update MDO and exit
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1756
    Register mdo  = klass_RInfo;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1757
    __ movoop(mdo, md->constant_encoding());
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1758
    Address data_addr(mdo, md->byte_offset_of_slot(data, DataLayout::header_offset()));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1759
    int header_bits = DataLayout::flag_mask_to_header_mask(BitData::null_seen_byte_constant());
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1760
    __ orl(data_addr, header_bits);
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1761
    __ jmp(*obj_is_null);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1762
    __ bind(not_null);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1763
  } else {
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1764
    __ jcc(Assembler::equal, *obj_is_null);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1765
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1766
  __ verify_oop(obj);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1767
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1768
  if (op->fast_check()) {
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1769
    // get object class
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1770
    // not a safepoint as obj null check happens earlier
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1771
#ifdef _LP64
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1772
    if (UseCompressedOops) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1773
      __ load_klass(Rtmp1, obj);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1774
      __ cmpptr(k_RInfo, Rtmp1);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1775
    } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1776
      __ cmpptr(k_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1777
    }
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1778
#else
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1779
    if (k->is_loaded()) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1780
      __ cmpoop(Address(obj, oopDesc::klass_offset_in_bytes()), k->constant_encoding());
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1781
    } else {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1782
      __ cmpptr(k_RInfo, Address(obj, oopDesc::klass_offset_in_bytes()));
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1783
    }
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1784
#endif
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1785
    __ jcc(Assembler::notEqual, *failure_target);
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1786
    // successful cast, fall through to profile or jump
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1787
  } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1788
    // get object class
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1789
    // not a safepoint as obj null check happens earlier
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1790
    __ load_klass(klass_RInfo, obj);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1791
    if (k->is_loaded()) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1792
      // See if we get an immediate positive hit
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1793
#ifdef _LP64
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1794
      __ cmpptr(k_RInfo, Address(klass_RInfo, k->super_check_offset()));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1795
#else
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1796
      __ cmpoop(Address(klass_RInfo, k->super_check_offset()), k->constant_encoding());
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1797
#endif // _LP64
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1798
      if (sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes() != k->super_check_offset()) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1799
        __ jcc(Assembler::notEqual, *failure_target);
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1800
        // successful cast, fall through to profile or jump
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1801
      } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1802
        // See if we get an immediate positive hit
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1803
        __ jcc(Assembler::equal, *success_target);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1804
        // check for self
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1805
#ifdef _LP64
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1806
        __ cmpptr(klass_RInfo, k_RInfo);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1807
#else
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1808
        __ cmpoop(klass_RInfo, k->constant_encoding());
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1809
#endif // _LP64
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1810
        __ jcc(Assembler::equal, *success_target);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1811
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1812
        __ push(klass_RInfo);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1813
#ifdef _LP64
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1814
        __ push(k_RInfo);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1815
#else
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1816
        __ pushoop(k->constant_encoding());
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1817
#endif // _LP64
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1818
        __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id)));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1819
        __ pop(klass_RInfo);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1820
        __ pop(klass_RInfo);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1821
        // result is a boolean
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1822
        __ cmpl(klass_RInfo, 0);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1823
        __ jcc(Assembler::equal, *failure_target);
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1824
        // successful cast, fall through to profile or jump
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1825
      }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1826
    } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1827
      // perform the fast part of the checking logic
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1828
      __ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, success_target, failure_target, NULL);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1829
      // call out-of-line instance of __ check_klass_subtype_slow_path(...):
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1830
      __ push(klass_RInfo);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1831
      __ push(k_RInfo);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1832
      __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id)));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1833
      __ pop(klass_RInfo);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1834
      __ pop(k_RInfo);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1835
      // result is a boolean
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1836
      __ cmpl(k_RInfo, 0);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1837
      __ jcc(Assembler::equal, *failure_target);
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1838
      // successful cast, fall through to profile or jump
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1839
    }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1840
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1841
  if (op->should_profile()) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1842
    Register mdo  = klass_RInfo, recv = k_RInfo;
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1843
    __ bind(profile_cast_success);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1844
    __ movoop(mdo, md->constant_encoding());
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1845
    __ load_klass(recv, obj);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1846
    Label update_done;
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1847
    type_profile_helper(mdo, md, data, recv, success);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1848
    __ jmp(*success);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1849
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1850
    __ bind(profile_cast_failure);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1851
    __ movoop(mdo, md->constant_encoding());
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1852
    Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1853
    __ subptr(counter_addr, DataLayout::counter_increment);
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1854
    __ jmp(*failure);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1855
  }
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1856
  __ jmp(*success);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  1857
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1858
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1859
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1860
void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1861
  LIR_Code code = op->code();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1862
  if (code == lir_store_check) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1863
    Register value = op->object()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1864
    Register array = op->array()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1865
    Register k_RInfo = op->tmp1()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1866
    Register klass_RInfo = op->tmp2()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1867
    Register Rtmp1 = op->tmp3()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1868
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1869
    CodeStub* stub = op->stub();
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1870
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1871
    // check if it needs to be profiled
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1872
    ciMethodData* md;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1873
    ciProfileData* data;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1874
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1875
    if (op->should_profile()) {
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1876
      ciMethod* method = op->profiled_method();
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1877
      assert(method != NULL, "Should have method");
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1878
      int bci = op->profiled_bci();
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7427
diff changeset
  1879
      md = method->method_data_or_null();
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7427
diff changeset
  1880
      assert(md != NULL, "Sanity");
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1881
      data = md->bci_to_data(bci);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1882
      assert(data != NULL,                "need data for type check");
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1883
      assert(data->is_ReceiverTypeData(), "need ReceiverTypeData for type check");
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1884
    }
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1885
    Label profile_cast_success, profile_cast_failure, done;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1886
    Label *success_target = op->should_profile() ? &profile_cast_success : &done;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1887
    Label *failure_target = op->should_profile() ? &profile_cast_failure : stub->entry();
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1888
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1889
    __ cmpptr(value, (int32_t)NULL_WORD);
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1890
    if (op->should_profile()) {
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1891
      Label not_null;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1892
      __ jccb(Assembler::notEqual, not_null);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1893
      // Object is null; update MDO and exit
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1894
      Register mdo  = klass_RInfo;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1895
      __ movoop(mdo, md->constant_encoding());
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1896
      Address data_addr(mdo, md->byte_offset_of_slot(data, DataLayout::header_offset()));
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1897
      int header_bits = DataLayout::flag_mask_to_header_mask(BitData::null_seen_byte_constant());
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1898
      __ orl(data_addr, header_bits);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1899
      __ jmp(done);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1900
      __ bind(not_null);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1901
    } else {
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1902
      __ jcc(Assembler::equal, done);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1903
    }
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1904
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1905
    add_debug_info_for_null_check_here(op->info_for_exception());
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1906
    __ load_klass(k_RInfo, array);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1907
    __ load_klass(klass_RInfo, value);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1908
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1909
    // get instance klass (it's already uncompressed)
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1910
    __ movptr(k_RInfo, Address(k_RInfo, objArrayKlass::element_klass_offset_in_bytes() + sizeof(oopDesc)));
2256
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2148
diff changeset
  1911
    // perform the fast part of the checking logic
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1912
    __ check_klass_subtype_fast_path(klass_RInfo, k_RInfo, Rtmp1, success_target, failure_target, NULL);
2256
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2148
diff changeset
  1913
    // call out-of-line instance of __ check_klass_subtype_slow_path(...):
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1914
    __ push(klass_RInfo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1915
    __ push(k_RInfo);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1916
    __ call(RuntimeAddress(Runtime1::entry_for(Runtime1::slow_subtype_check_id)));
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1917
    __ pop(klass_RInfo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1918
    __ pop(k_RInfo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1919
    // result is a boolean
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1920
    __ cmpl(k_RInfo, 0);
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1921
    __ jcc(Assembler::equal, *failure_target);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1922
    // fall through to the success case
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1923
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1924
    if (op->should_profile()) {
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1925
      Register mdo  = klass_RInfo, recv = k_RInfo;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1926
      __ bind(profile_cast_success);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1927
      __ movoop(mdo, md->constant_encoding());
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1928
      __ load_klass(recv, value);
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1929
      Label update_done;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1930
      type_profile_helper(mdo, md, data, recv, &done);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1931
      __ jmpb(done);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1932
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1933
      __ bind(profile_cast_failure);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1934
      __ movoop(mdo, md->constant_encoding());
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1935
      Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()));
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1936
      __ subptr(counter_addr, DataLayout::counter_increment);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1937
      __ jmp(*stub->entry());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1938
    }
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1939
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1940
    __ bind(done);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1941
  } else
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1942
    if (code == lir_checkcast) {
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1943
      Register obj = op->object()->as_register();
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1944
      Register dst = op->result_opr()->as_register();
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1945
      Label success;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1946
      emit_typecheck_helper(op, &success, op->stub()->entry(), &success);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1947
      __ bind(success);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1948
      if (dst != obj) {
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1949
        __ mov(dst, obj);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1950
      }
6461
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1951
    } else
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1952
      if (code == lir_instanceof) {
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1953
        Register obj = op->object()->as_register();
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1954
        Register dst = op->result_opr()->as_register();
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1955
        Label success, failure, done;
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1956
        emit_typecheck_helper(op, &success, &failure, &failure);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1957
        __ bind(failure);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1958
        __ xorptr(dst, dst);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1959
        __ jmpb(done);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1960
        __ bind(success);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1961
        __ movptr(dst, 1);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1962
        __ bind(done);
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1963
      } else {
cfc616b49f58 6919069: client compiler needs to capture more profile information for tiered work
iveresov
parents: 6460
diff changeset
  1964
        ShouldNotReachHere();
2256
82d4e10b7c6b 6813212: factor duplicated assembly code for general subclass check (for 6655638)
jrose
parents: 2148
diff changeset
  1965
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1966
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1967
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1968
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1969
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1970
void LIR_Assembler::emit_compare_and_swap(LIR_OpCompareAndSwap* op) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1971
  if (LP64_ONLY(false &&) op->code() == lir_cas_long && VM_Version::supports_cx8()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1972
    assert(op->cmp_value()->as_register_lo() == rax, "wrong register");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1973
    assert(op->cmp_value()->as_register_hi() == rdx, "wrong register");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1974
    assert(op->new_value()->as_register_lo() == rbx, "wrong register");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1975
    assert(op->new_value()->as_register_hi() == rcx, "wrong register");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1976
    Register addr = op->addr()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1977
    if (os::is_MP()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1978
      __ lock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1979
    }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1980
    NOT_LP64(__ cmpxchg8(Address(addr, 0)));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1981
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1982
  } else if (op->code() == lir_cas_int || op->code() == lir_cas_obj ) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1983
    NOT_LP64(assert(op->addr()->is_single_cpu(), "must be single");)
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1984
    Register addr = (op->addr()->is_single_cpu() ? op->addr()->as_register() : op->addr()->as_register_lo());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1985
    Register newval = op->new_value()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1986
    Register cmpval = op->cmp_value()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1987
    assert(cmpval == rax, "wrong register");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1988
    assert(newval != NULL, "new val must be register");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1989
    assert(cmpval != newval, "cmp and new values must be in different registers");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1990
    assert(cmpval != addr, "cmp and addr must be in different registers");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1991
    assert(newval != addr, "new value and addr must be in different registers");
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1992
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  1993
    if ( op->code() == lir_cas_obj) {
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1994
#ifdef _LP64
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1995
      if (UseCompressedOops) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1996
        __ encode_heap_oop(cmpval);
7438
6e2a9ad88dba 7005241: C1: SEGV in java.util.concurrent.LinkedTransferQueue.xfer() with compressed oops
iveresov
parents: 7432
diff changeset
  1997
        __ mov(rscratch1, newval);
6e2a9ad88dba 7005241: C1: SEGV in java.util.concurrent.LinkedTransferQueue.xfer() with compressed oops
iveresov
parents: 7432
diff changeset
  1998
        __ encode_heap_oop(rscratch1);
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1999
        if (os::is_MP()) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2000
          __ lock();
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2001
        }
7438
6e2a9ad88dba 7005241: C1: SEGV in java.util.concurrent.LinkedTransferQueue.xfer() with compressed oops
iveresov
parents: 7432
diff changeset
  2002
        // cmpval (rax) is implicitly used by this instruction
6e2a9ad88dba 7005241: C1: SEGV in java.util.concurrent.LinkedTransferQueue.xfer() with compressed oops
iveresov
parents: 7432
diff changeset
  2003
        __ cmpxchgl(rscratch1, Address(addr, 0));
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2004
      } else
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2005
#endif
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2006
      {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2007
        if (os::is_MP()) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2008
          __ lock();
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2009
        }
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2010
        __ cmpxchgptr(newval, Address(addr, 0));
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2011
      }
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2012
    } else {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2013
      assert(op->code() == lir_cas_int, "lir_cas_int expected");
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2014
      if (os::is_MP()) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2015
        __ lock();
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  2016
      }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2017
      __ cmpxchgl(newval, Address(addr, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2018
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2019
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2020
  } else if (op->code() == lir_cas_long) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2021
    Register addr = (op->addr()->is_single_cpu() ? op->addr()->as_register() : op->addr()->as_register_lo());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2022
    Register newval = op->new_value()->as_register_lo();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2023
    Register cmpval = op->cmp_value()->as_register_lo();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2024
    assert(cmpval == rax, "wrong register");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2025
    assert(newval != NULL, "new val must be register");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2026
    assert(cmpval != newval, "cmp and new values must be in different registers");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2027
    assert(cmpval != addr, "cmp and addr must be in different registers");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2028
    assert(newval != addr, "new value and addr must be in different registers");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2029
    if (os::is_MP()) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2030
      __ lock();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2031
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2032
    __ cmpxchgq(newval, Address(addr, 0));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2033
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
    Unimplemented();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2037
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2038
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2039
void LIR_Assembler::cmove(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2040
  Assembler::Condition acond, ncond;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
  switch (condition) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2042
    case lir_cond_equal:        acond = Assembler::equal;        ncond = Assembler::notEqual;     break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
    case lir_cond_notEqual:     acond = Assembler::notEqual;     ncond = Assembler::equal;        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2044
    case lir_cond_less:         acond = Assembler::less;         ncond = Assembler::greaterEqual; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
    case lir_cond_lessEqual:    acond = Assembler::lessEqual;    ncond = Assembler::greater;      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
    case lir_cond_greaterEqual: acond = Assembler::greaterEqual; ncond = Assembler::less;         break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2047
    case lir_cond_greater:      acond = Assembler::greater;      ncond = Assembler::lessEqual;    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
    case lir_cond_belowEqual:   acond = Assembler::belowEqual;   ncond = Assembler::above;        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
    case lir_cond_aboveEqual:   acond = Assembler::aboveEqual;   ncond = Assembler::below;        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2050
    default:                    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2052
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2053
  if (opr1->is_cpu_register()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2054
    reg2reg(opr1, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2055
  } else if (opr1->is_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2056
    stack2reg(opr1, result, result->type());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2057
  } else if (opr1->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2058
    const2reg(opr1, result, lir_patch_none, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2059
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2060
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2061
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2062
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2063
  if (VM_Version::supports_cmov() && !opr2->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2064
    // optimized version that does not require a branch
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2065
    if (opr2->is_single_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2066
      assert(opr2->cpu_regnr() != result->cpu_regnr(), "opr2 already overwritten by previous move");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2067
      __ cmov(ncond, result->as_register(), opr2->as_register());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2068
    } else if (opr2->is_double_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2069
      assert(opr2->cpu_regnrLo() != result->cpu_regnrLo() && opr2->cpu_regnrLo() != result->cpu_regnrHi(), "opr2 already overwritten by previous move");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2070
      assert(opr2->cpu_regnrHi() != result->cpu_regnrLo() && opr2->cpu_regnrHi() != result->cpu_regnrHi(), "opr2 already overwritten by previous move");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2071
      __ cmovptr(ncond, result->as_register_lo(), opr2->as_register_lo());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2072
      NOT_LP64(__ cmovptr(ncond, result->as_register_hi(), opr2->as_register_hi());)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2073
    } else if (opr2->is_single_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2074
      __ cmovl(ncond, result->as_register(), frame_map()->address_for_slot(opr2->single_stack_ix()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2075
    } else if (opr2->is_double_stack()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2076
      __ cmovptr(ncond, result->as_register_lo(), frame_map()->address_for_slot(opr2->double_stack_ix(), lo_word_offset_in_bytes));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2077
      NOT_LP64(__ cmovptr(ncond, result->as_register_hi(), frame_map()->address_for_slot(opr2->double_stack_ix(), hi_word_offset_in_bytes));)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2078
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2079
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2080
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2081
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2082
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2083
    Label skip;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2084
    __ jcc (acond, skip);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2085
    if (opr2->is_cpu_register()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2086
      reg2reg(opr2, result);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2087
    } else if (opr2->is_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2088
      stack2reg(opr2, result, result->type());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2089
    } else if (opr2->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2090
      const2reg(opr2, result, lir_patch_none, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2091
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2092
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2093
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2094
    __ bind(skip);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2095
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2096
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2097
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2098
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2099
void LIR_Assembler::arith_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dest, CodeEmitInfo* info, bool pop_fpu_stack) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2100
  assert(info == NULL, "should never be used, idiv/irem and ldiv/lrem not handled by this method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2101
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2102
  if (left->is_single_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2103
    assert(left == dest, "left and dest must be equal");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2104
    Register lreg = left->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2106
    if (right->is_single_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2107
      // cpu register - cpu register
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2108
      Register rreg = right->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2109
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2110
        case lir_add: __ addl (lreg, rreg); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2111
        case lir_sub: __ subl (lreg, rreg); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2112
        case lir_mul: __ imull(lreg, rreg); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2113
        default:      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2114
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2115
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2116
    } else if (right->is_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2117
      // cpu register - stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2118
      Address raddr = frame_map()->address_for_slot(right->single_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2119
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2120
        case lir_add: __ addl(lreg, raddr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2121
        case lir_sub: __ subl(lreg, raddr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2122
        default:      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2123
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2124
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2125
    } else if (right->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2126
      // cpu register - constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2127
      jint c = right->as_constant_ptr()->as_jint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2128
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2129
        case lir_add: {
6460
6f5143b00f4c 6984056: C1: incorrect code for integer constant addition on x64
iveresov
parents: 6453
diff changeset
  2130
          __ incrementl(lreg, c);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2131
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2132
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2133
        case lir_sub: {
6460
6f5143b00f4c 6984056: C1: incorrect code for integer constant addition on x64
iveresov
parents: 6453
diff changeset
  2134
          __ decrementl(lreg, c);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2135
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2136
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2137
        default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2138
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2139
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2140
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2141
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2142
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2143
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2144
  } else if (left->is_double_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2145
    assert(left == dest, "left and dest must be equal");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2146
    Register lreg_lo = left->as_register_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2147
    Register lreg_hi = left->as_register_hi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2148
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2149
    if (right->is_double_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2150
      // cpu register - cpu register
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2151
      Register rreg_lo = right->as_register_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2152
      Register rreg_hi = right->as_register_hi();
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2153
      NOT_LP64(assert_different_registers(lreg_lo, lreg_hi, rreg_lo, rreg_hi));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2154
      LP64_ONLY(assert_different_registers(lreg_lo, rreg_lo));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2155
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2156
        case lir_add:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2157
          __ addptr(lreg_lo, rreg_lo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2158
          NOT_LP64(__ adcl(lreg_hi, rreg_hi));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2159
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2160
        case lir_sub:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2161
          __ subptr(lreg_lo, rreg_lo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2162
          NOT_LP64(__ sbbl(lreg_hi, rreg_hi));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2163
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2164
        case lir_mul:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2165
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2166
          __ imulq(lreg_lo, rreg_lo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2167
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2168
          assert(lreg_lo == rax && lreg_hi == rdx, "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2169
          __ imull(lreg_hi, rreg_lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2170
          __ imull(rreg_hi, lreg_lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2171
          __ addl (rreg_hi, lreg_hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2172
          __ mull (rreg_lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2173
          __ addl (lreg_hi, rreg_hi);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2174
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2175
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2176
        default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2177
          ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2178
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2179
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2180
    } else if (right->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2181
      // cpu register - constant
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2182
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2183
      jlong c = right->as_constant_ptr()->as_jlong_bits();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2184
      __ movptr(r10, (intptr_t) c);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2185
      switch (code) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2186
        case lir_add:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2187
          __ addptr(lreg_lo, r10);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2188
          break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2189
        case lir_sub:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2190
          __ subptr(lreg_lo, r10);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2191
          break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2192
        default:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2193
          ShouldNotReachHere();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2194
      }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2195
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2196
      jint c_lo = right->as_constant_ptr()->as_jint_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2197
      jint c_hi = right->as_constant_ptr()->as_jint_hi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2198
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2199
        case lir_add:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2200
          __ addptr(lreg_lo, c_lo);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2201
          __ adcl(lreg_hi, c_hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2202
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2203
        case lir_sub:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2204
          __ subptr(lreg_lo, c_lo);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2205
          __ sbbl(lreg_hi, c_hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2206
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2207
        default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2208
          ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2209
      }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2210
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2211
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2212
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2213
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2214
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2215
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2216
  } else if (left->is_single_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2217
    assert(left == dest, "left and dest must be equal");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2218
    XMMRegister lreg = left->as_xmm_float_reg();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2219
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2220
    if (right->is_single_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2221
      XMMRegister rreg = right->as_xmm_float_reg();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2222
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2223
        case lir_add: __ addss(lreg, rreg);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2224
        case lir_sub: __ subss(lreg, rreg);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2225
        case lir_mul_strictfp: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2226
        case lir_mul: __ mulss(lreg, rreg);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2227
        case lir_div_strictfp: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2228
        case lir_div: __ divss(lreg, rreg);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2229
        default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2230
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2231
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2232
      Address raddr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2233
      if (right->is_single_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2234
        raddr = frame_map()->address_for_slot(right->single_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2235
      } else if (right->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2236
        // hack for now
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2237
        raddr = __ as_Address(InternalAddress(float_constant(right->as_jfloat())));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2238
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2239
        ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2240
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2241
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2242
        case lir_add: __ addss(lreg, raddr);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2243
        case lir_sub: __ subss(lreg, raddr);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2244
        case lir_mul_strictfp: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2245
        case lir_mul: __ mulss(lreg, raddr);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2246
        case lir_div_strictfp: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2247
        case lir_div: __ divss(lreg, raddr);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2248
        default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2249
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2250
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2251
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2252
  } else if (left->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2253
    assert(left == dest, "left and dest must be equal");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2254
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2255
    XMMRegister lreg = left->as_xmm_double_reg();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2256
    if (right->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2257
      XMMRegister rreg = right->as_xmm_double_reg();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2258
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2259
        case lir_add: __ addsd(lreg, rreg);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2260
        case lir_sub: __ subsd(lreg, rreg);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2261
        case lir_mul_strictfp: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2262
        case lir_mul: __ mulsd(lreg, rreg);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2263
        case lir_div_strictfp: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2264
        case lir_div: __ divsd(lreg, rreg);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2265
        default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2266
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2267
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2268
      Address raddr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2269
      if (right->is_double_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2270
        raddr = frame_map()->address_for_slot(right->double_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2271
      } else if (right->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2272
        // hack for now
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2273
        raddr = __ as_Address(InternalAddress(double_constant(right->as_jdouble())));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2274
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2275
        ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2276
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2277
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2278
        case lir_add: __ addsd(lreg, raddr);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2279
        case lir_sub: __ subsd(lreg, raddr);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2280
        case lir_mul_strictfp: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2281
        case lir_mul: __ mulsd(lreg, raddr);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2282
        case lir_div_strictfp: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2283
        case lir_div: __ divsd(lreg, raddr);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
        default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2285
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2286
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2287
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2288
  } else if (left->is_single_fpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2289
    assert(dest->is_single_fpu(),  "fpu stack allocation required");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2290
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2291
    if (right->is_single_fpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2292
      arith_fpu_implementation(code, left->fpu_regnr(), right->fpu_regnr(), dest->fpu_regnr(), pop_fpu_stack);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2293
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2294
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2295
      assert(left->fpu_regnr() == 0, "left must be on TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2296
      assert(dest->fpu_regnr() == 0, "dest must be on TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2297
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2298
      Address raddr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2299
      if (right->is_single_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2300
        raddr = frame_map()->address_for_slot(right->single_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2301
      } else if (right->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2302
        address const_addr = float_constant(right->as_jfloat());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2303
        assert(const_addr != NULL, "incorrect float/double constant maintainance");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2304
        // hack for now
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2305
        raddr = __ as_Address(InternalAddress(const_addr));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2306
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2307
        ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2308
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2309
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2310
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2311
        case lir_add: __ fadd_s(raddr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2312
        case lir_sub: __ fsub_s(raddr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2313
        case lir_mul_strictfp: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2314
        case lir_mul: __ fmul_s(raddr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2315
        case lir_div_strictfp: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2316
        case lir_div: __ fdiv_s(raddr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2317
        default:      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2318
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2319
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2320
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2321
  } else if (left->is_double_fpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2322
    assert(dest->is_double_fpu(),  "fpu stack allocation required");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2323
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2324
    if (code == lir_mul_strictfp || code == lir_div_strictfp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2325
      // Double values require special handling for strictfp mul/div on x86
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2326
      __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias1()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2327
      __ fmulp(left->fpu_regnrLo() + 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2328
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2329
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2330
    if (right->is_double_fpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2331
      arith_fpu_implementation(code, left->fpu_regnrLo(), right->fpu_regnrLo(), dest->fpu_regnrLo(), pop_fpu_stack);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2332
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2333
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2334
      assert(left->fpu_regnrLo() == 0, "left must be on TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2335
      assert(dest->fpu_regnrLo() == 0, "dest must be on TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2336
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2337
      Address raddr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2338
      if (right->is_double_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2339
        raddr = frame_map()->address_for_slot(right->double_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2340
      } else if (right->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2341
        // hack for now
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2342
        raddr = __ as_Address(InternalAddress(double_constant(right->as_jdouble())));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2343
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2344
        ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2345
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2346
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2347
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2348
        case lir_add: __ fadd_d(raddr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2349
        case lir_sub: __ fsub_d(raddr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2350
        case lir_mul_strictfp: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2351
        case lir_mul: __ fmul_d(raddr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2352
        case lir_div_strictfp: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2353
        case lir_div: __ fdiv_d(raddr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2354
        default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2355
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2356
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2357
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2358
    if (code == lir_mul_strictfp || code == lir_div_strictfp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2359
      // Double values require special handling for strictfp mul/div on x86
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2360
      __ fld_x(ExternalAddress(StubRoutines::addr_fpu_subnormal_bias2()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2361
      __ fmulp(dest->fpu_regnrLo() + 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2362
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2363
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2364
  } else if (left->is_single_stack() || left->is_address()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2365
    assert(left == dest, "left and dest must be equal");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2366
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2367
    Address laddr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2368
    if (left->is_single_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2369
      laddr = frame_map()->address_for_slot(left->single_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2370
    } else if (left->is_address()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2371
      laddr = as_Address(left->as_address_ptr());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2372
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2373
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2374
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2375
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2376
    if (right->is_single_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2377
      Register rreg = right->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2378
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2379
        case lir_add: __ addl(laddr, rreg); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2380
        case lir_sub: __ subl(laddr, rreg); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2381
        default:      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2382
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2383
    } else if (right->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2384
      jint c = right->as_constant_ptr()->as_jint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2385
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2386
        case lir_add: {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2387
          __ incrementl(laddr, c);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2388
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2389
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2390
        case lir_sub: {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2391
          __ decrementl(laddr, c);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2392
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2393
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2394
        default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2395
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2396
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2397
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2398
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2399
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2400
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2401
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2402
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2403
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2404
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2405
void LIR_Assembler::arith_fpu_implementation(LIR_Code code, int left_index, int right_index, int dest_index, bool pop_fpu_stack) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2406
  assert(pop_fpu_stack  || (left_index     == dest_index || right_index     == dest_index), "invalid LIR");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2407
  assert(!pop_fpu_stack || (left_index - 1 == dest_index || right_index - 1 == dest_index), "invalid LIR");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2408
  assert(left_index == 0 || right_index == 0, "either must be on top of stack");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2409
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2410
  bool left_is_tos = (left_index == 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2411
  bool dest_is_tos = (dest_index == 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2412
  int non_tos_index = (left_is_tos ? right_index : left_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2413
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2414
  switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2415
    case lir_add:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2416
      if (pop_fpu_stack)       __ faddp(non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2417
      else if (dest_is_tos)    __ fadd (non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2418
      else                     __ fadda(non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2419
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2420
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2421
    case lir_sub:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2422
      if (left_is_tos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2423
        if (pop_fpu_stack)     __ fsubrp(non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2424
        else if (dest_is_tos)  __ fsub  (non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2425
        else                   __ fsubra(non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2426
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2427
        if (pop_fpu_stack)     __ fsubp (non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2428
        else if (dest_is_tos)  __ fsubr (non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2429
        else                   __ fsuba (non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2430
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2431
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2432
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2433
    case lir_mul_strictfp: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2434
    case lir_mul:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2435
      if (pop_fpu_stack)       __ fmulp(non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2436
      else if (dest_is_tos)    __ fmul (non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2437
      else                     __ fmula(non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2438
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2439
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2440
    case lir_div_strictfp: // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2441
    case lir_div:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2442
      if (left_is_tos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2443
        if (pop_fpu_stack)     __ fdivrp(non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2444
        else if (dest_is_tos)  __ fdiv  (non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2445
        else                   __ fdivra(non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2446
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2447
        if (pop_fpu_stack)     __ fdivp (non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2448
        else if (dest_is_tos)  __ fdivr (non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2449
        else                   __ fdiva (non_tos_index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2450
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2451
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2452
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2453
    case lir_rem:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2454
      assert(left_is_tos && dest_is_tos && right_index == 1, "must be guaranteed by FPU stack allocation");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2455
      __ fremr(noreg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2456
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2457
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2458
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2459
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2460
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2461
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2462
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2463
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2464
void LIR_Assembler::intrinsic_op(LIR_Code code, LIR_Opr value, LIR_Opr unused, LIR_Opr dest, LIR_Op* op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2465
  if (value->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2466
    switch(code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2467
      case lir_abs :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2468
        {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2469
          if (dest->as_xmm_double_reg() != value->as_xmm_double_reg()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2470
            __ movdbl(dest->as_xmm_double_reg(), value->as_xmm_double_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2471
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2472
          __ andpd(dest->as_xmm_double_reg(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2473
                    ExternalAddress((address)double_signmask_pool));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2474
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2475
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2476
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2477
      case lir_sqrt: __ sqrtsd(dest->as_xmm_double_reg(), value->as_xmm_double_reg()); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2478
      // all other intrinsics are not available in the SSE instruction set, so FPU is used
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2479
      default      : ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2480
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2481
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2482
  } else if (value->is_double_fpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2483
    assert(value->fpu_regnrLo() == 0 && dest->fpu_regnrLo() == 0, "both must be on TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2484
    switch(code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2485
      case lir_log   : __ flog() ; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2486
      case lir_log10 : __ flog10() ; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2487
      case lir_abs   : __ fabs() ; break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2488
      case lir_sqrt  : __ fsqrt(); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2489
      case lir_sin   :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2490
        // Should consider not saving rbx, if not necessary
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2491
        __ trigfunc('s', op->as_Op2()->fpu_stack_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2492
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2493
      case lir_cos :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2494
        // Should consider not saving rbx, if not necessary
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2495
        assert(op->as_Op2()->fpu_stack_size() <= 6, "sin and cos need two free stack slots");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2496
        __ trigfunc('c', op->as_Op2()->fpu_stack_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2497
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2498
      case lir_tan :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2499
        // Should consider not saving rbx, if not necessary
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2500
        __ trigfunc('t', op->as_Op2()->fpu_stack_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2501
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2502
      default      : ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2503
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2504
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2505
    Unimplemented();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2506
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2507
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2508
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2509
void LIR_Assembler::logic_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dst) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2510
  // assert(left->destroys_register(), "check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2511
  if (left->is_single_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2512
    Register reg = left->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2513
    if (right->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2514
      int val = right->as_constant_ptr()->as_jint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2515
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2516
        case lir_logic_and: __ andl (reg, val); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2517
        case lir_logic_or:  __ orl  (reg, val); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2518
        case lir_logic_xor: __ xorl (reg, val); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2519
        default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2520
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2521
    } else if (right->is_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2522
      // added support for stack operands
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2523
      Address raddr = frame_map()->address_for_slot(right->single_stack_ix());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2524
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2525
        case lir_logic_and: __ andl (reg, raddr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2526
        case lir_logic_or:  __ orl  (reg, raddr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2527
        case lir_logic_xor: __ xorl (reg, raddr); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2528
        default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2529
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2530
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2531
      Register rright = right->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2532
      switch (code) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2533
        case lir_logic_and: __ andptr (reg, rright); break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2534
        case lir_logic_or : __ orptr  (reg, rright); break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2535
        case lir_logic_xor: __ xorptr (reg, rright); break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2536
        default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2537
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2538
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2539
    move_regs(reg, dst->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2540
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2541
    Register l_lo = left->as_register_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2542
    Register l_hi = left->as_register_hi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2543
    if (right->is_constant()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2544
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2545
      __ mov64(rscratch1, right->as_constant_ptr()->as_jlong());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2546
      switch (code) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2547
        case lir_logic_and:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2548
          __ andq(l_lo, rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2549
          break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2550
        case lir_logic_or:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2551
          __ orq(l_lo, rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2552
          break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2553
        case lir_logic_xor:
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2554
          __ xorq(l_lo, rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2555
          break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2556
        default: ShouldNotReachHere();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2557
      }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2558
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2559
      int r_lo = right->as_constant_ptr()->as_jint_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2560
      int r_hi = right->as_constant_ptr()->as_jint_hi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2561
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2562
        case lir_logic_and:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2563
          __ andl(l_lo, r_lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2564
          __ andl(l_hi, r_hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2565
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2566
        case lir_logic_or:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2567
          __ orl(l_lo, r_lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2568
          __ orl(l_hi, r_hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2569
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2570
        case lir_logic_xor:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2571
          __ xorl(l_lo, r_lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2572
          __ xorl(l_hi, r_hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2573
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2574
        default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2575
      }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2576
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2577
    } else {
5695
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
  2578
#ifdef _LP64
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
  2579
      Register r_lo;
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
  2580
      if (right->type() == T_OBJECT || right->type() == T_ARRAY) {
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
  2581
        r_lo = right->as_register();
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
  2582
      } else {
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
  2583
        r_lo = right->as_register_lo();
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
  2584
      }
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
  2585
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2586
      Register r_lo = right->as_register_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2587
      Register r_hi = right->as_register_hi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2588
      assert(l_lo != r_hi, "overwriting registers");
5695
7fbbde5b4e3e 6955349: C1: Make G1 barriers work with x64
iveresov
parents: 5687
diff changeset
  2589
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2590
      switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2591
        case lir_logic_and:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2592
          __ andptr(l_lo, r_lo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2593
          NOT_LP64(__ andptr(l_hi, r_hi);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2594
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2595
        case lir_logic_or:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2596
          __ orptr(l_lo, r_lo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2597
          NOT_LP64(__ orptr(l_hi, r_hi);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2598
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2599
        case lir_logic_xor:
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2600
          __ xorptr(l_lo, r_lo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2601
          NOT_LP64(__ xorptr(l_hi, r_hi);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2602
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2603
        default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2604
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2605
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2606
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2607
    Register dst_lo = dst->as_register_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2608
    Register dst_hi = dst->as_register_hi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2609
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2610
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2611
    move_regs(l_lo, dst_lo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2612
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2613
    if (dst_lo == l_hi) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2614
      assert(dst_hi != l_lo, "overwriting registers");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2615
      move_regs(l_hi, dst_hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2616
      move_regs(l_lo, dst_lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2617
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2618
      assert(dst_lo != l_hi, "overwriting registers");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2619
      move_regs(l_lo, dst_lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2620
      move_regs(l_hi, dst_hi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2621
    }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2622
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2623
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2624
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2625
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2626
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2627
// we assume that rax, and rdx can be overwritten
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2628
void LIR_Assembler::arithmetic_idiv(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr temp, LIR_Opr result, CodeEmitInfo* info) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2629
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2630
  assert(left->is_single_cpu(),   "left must be register");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2631
  assert(right->is_single_cpu() || right->is_constant(),  "right must be register or constant");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2632
  assert(result->is_single_cpu(), "result must be register");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2633
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2634
  //  assert(left->destroys_register(), "check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2635
  //  assert(right->destroys_register(), "check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2636
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2637
  Register lreg = left->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2638
  Register dreg = result->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2639
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2640
  if (right->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2641
    int divisor = right->as_constant_ptr()->as_jint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2642
    assert(divisor > 0 && is_power_of_2(divisor), "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2643
    if (code == lir_idiv) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2644
      assert(lreg == rax, "must be rax,");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2645
      assert(temp->as_register() == rdx, "tmp register must be rdx");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2646
      __ cdql(); // sign extend into rdx:rax
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2647
      if (divisor == 2) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2648
        __ subl(lreg, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2649
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2650
        __ andl(rdx, divisor - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2651
        __ addl(lreg, rdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2652
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2653
      __ sarl(lreg, log2_intptr(divisor));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2654
      move_regs(lreg, dreg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2655
    } else if (code == lir_irem) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2656
      Label done;
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2657
      __ mov(dreg, lreg);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2658
      __ andl(dreg, 0x80000000 | (divisor - 1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2659
      __ jcc(Assembler::positive, done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2660
      __ decrement(dreg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2661
      __ orl(dreg, ~(divisor - 1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2662
      __ increment(dreg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2663
      __ bind(done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2664
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2665
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2666
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2667
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2668
    Register rreg = right->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2669
    assert(lreg == rax, "left register must be rax,");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2670
    assert(rreg != rdx, "right register must not be rdx");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2671
    assert(temp->as_register() == rdx, "tmp register must be rdx");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2672
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2673
    move_regs(lreg, rax);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2674
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2675
    int idivl_offset = __ corrected_idivl(rreg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2676
    add_debug_info_for_div0(idivl_offset, info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2677
    if (code == lir_irem) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2678
      move_regs(rdx, dreg); // result is in rdx
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2679
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2680
      move_regs(rax, dreg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2681
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2682
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2683
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2684
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2685
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2686
void LIR_Assembler::comp_op(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Op2* op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2687
  if (opr1->is_single_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2688
    Register reg1 = opr1->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2689
    if (opr2->is_single_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2690
      // cpu register - cpu register
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2691
      if (opr1->type() == T_OBJECT || opr1->type() == T_ARRAY) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2692
        __ cmpptr(reg1, opr2->as_register());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2693
      } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2694
        assert(opr2->type() != T_OBJECT && opr2->type() != T_ARRAY, "cmp int, oop?");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2695
        __ cmpl(reg1, opr2->as_register());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2696
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2697
    } else if (opr2->is_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2698
      // cpu register - stack
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2699
      if (opr1->type() == T_OBJECT || opr1->type() == T_ARRAY) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2700
        __ cmpptr(reg1, frame_map()->address_for_slot(opr2->single_stack_ix()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2701
      } else {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2702
        __ cmpl(reg1, frame_map()->address_for_slot(opr2->single_stack_ix()));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2703
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2704
    } else if (opr2->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2705
      // cpu register - constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2706
      LIR_Const* c = opr2->as_constant_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2707
      if (c->type() == T_INT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2708
        __ cmpl(reg1, c->as_jint());
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2709
      } else if (c->type() == T_OBJECT || c->type() == T_ARRAY) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2710
        // In 64bit oops are single register
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2711
        jobject o = c->as_jobject();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2712
        if (o == NULL) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2713
          __ cmpptr(reg1, (int32_t)NULL_WORD);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2714
        } else {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2715
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2716
          __ movoop(rscratch1, o);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2717
          __ cmpptr(reg1, rscratch1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2718
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2719
          __ cmpoop(reg1, c->as_jobject());
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2720
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2721
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2722
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2723
        ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2724
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2725
      // cpu register - address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2726
    } else if (opr2->is_address()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2727
      if (op->info() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2728
        add_debug_info_for_null_check_here(op->info());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2729
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2730
      __ cmpl(reg1, as_Address(opr2->as_address_ptr()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2731
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2732
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2733
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2734
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2735
  } else if(opr1->is_double_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2736
    Register xlo = opr1->as_register_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2737
    Register xhi = opr1->as_register_hi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2738
    if (opr2->is_double_cpu()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2739
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2740
      __ cmpptr(xlo, opr2->as_register_lo());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2741
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2742
      // cpu register - cpu register
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2743
      Register ylo = opr2->as_register_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2744
      Register yhi = opr2->as_register_hi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2745
      __ subl(xlo, ylo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2746
      __ sbbl(xhi, yhi);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2747
      if (condition == lir_cond_equal || condition == lir_cond_notEqual) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2748
        __ orl(xhi, xlo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2749
      }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2750
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2751
    } else if (opr2->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2752
      // cpu register - constant 0
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2753
      assert(opr2->as_jlong() == (jlong)0, "only handles zero");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2754
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2755
      __ cmpptr(xlo, (int32_t)opr2->as_jlong());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2756
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2757
      assert(condition == lir_cond_equal || condition == lir_cond_notEqual, "only handles equals case");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2758
      __ orl(xhi, xlo);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2759
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2760
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2761
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2762
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2763
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2764
  } else if (opr1->is_single_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2765
    XMMRegister reg1 = opr1->as_xmm_float_reg();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2766
    if (opr2->is_single_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2767
      // xmm register - xmm register
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2768
      __ ucomiss(reg1, opr2->as_xmm_float_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2769
    } else if (opr2->is_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2770
      // xmm register - stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2771
      __ ucomiss(reg1, frame_map()->address_for_slot(opr2->single_stack_ix()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2772
    } else if (opr2->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2773
      // xmm register - constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2774
      __ ucomiss(reg1, InternalAddress(float_constant(opr2->as_jfloat())));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2775
    } else if (opr2->is_address()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2776
      // xmm register - address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2777
      if (op->info() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2778
        add_debug_info_for_null_check_here(op->info());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2779
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2780
      __ ucomiss(reg1, as_Address(opr2->as_address_ptr()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2781
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2782
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2783
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2784
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2785
  } else if (opr1->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2786
    XMMRegister reg1 = opr1->as_xmm_double_reg();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2787
    if (opr2->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2788
      // xmm register - xmm register
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2789
      __ ucomisd(reg1, opr2->as_xmm_double_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2790
    } else if (opr2->is_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2791
      // xmm register - stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2792
      __ ucomisd(reg1, frame_map()->address_for_slot(opr2->double_stack_ix()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2793
    } else if (opr2->is_constant()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2794
      // xmm register - constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2795
      __ ucomisd(reg1, InternalAddress(double_constant(opr2->as_jdouble())));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2796
    } else if (opr2->is_address()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2797
      // xmm register - address
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2798
      if (op->info() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2799
        add_debug_info_for_null_check_here(op->info());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2800
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2801
      __ ucomisd(reg1, as_Address(opr2->pointer()->as_address()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2802
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2803
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2804
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2805
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2806
  } else if(opr1->is_single_fpu() || opr1->is_double_fpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2807
    assert(opr1->is_fpu_register() && opr1->fpu() == 0, "currently left-hand side must be on TOS (relax this restriction)");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2808
    assert(opr2->is_fpu_register(), "both must be registers");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2809
    __ fcmp(noreg, opr2->fpu(), op->fpu_pop_count() > 0, op->fpu_pop_count() > 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2810
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2811
  } else if (opr1->is_address() && opr2->is_constant()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2812
    LIR_Const* c = opr2->as_constant_ptr();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2813
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2814
    if (c->type() == T_OBJECT || c->type() == T_ARRAY) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2815
      assert(condition == lir_cond_equal || condition == lir_cond_notEqual, "need to reverse");
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2816
      __ movoop(rscratch1, c->as_jobject());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2817
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2818
#endif // LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2819
    if (op->info() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2820
      add_debug_info_for_null_check_here(op->info());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2821
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2822
    // special case: address - constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2823
    LIR_Address* addr = opr1->as_address_ptr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2824
    if (c->type() == T_INT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2825
      __ cmpl(as_Address(addr), c->as_jint());
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2826
    } else if (c->type() == T_OBJECT || c->type() == T_ARRAY) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2827
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2828
      // %%% Make this explode if addr isn't reachable until we figure out a
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2829
      // better strategy by giving noreg as the temp for as_Address
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2830
      __ cmpptr(rscratch1, as_Address(addr, noreg));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2831
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2832
      __ cmpoop(as_Address(addr), c->as_jobject());
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2833
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2834
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2835
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2836
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2837
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2838
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2839
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2840
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2841
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2842
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2843
void LIR_Assembler::comp_fl2i(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dst, LIR_Op2* op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2844
  if (code == lir_cmp_fd2i || code == lir_ucmp_fd2i) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2845
    if (left->is_single_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2846
      assert(right->is_single_xmm(), "must match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2847
      __ cmpss2int(left->as_xmm_float_reg(), right->as_xmm_float_reg(), dst->as_register(), code == lir_ucmp_fd2i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2848
    } else if (left->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2849
      assert(right->is_double_xmm(), "must match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2850
      __ cmpsd2int(left->as_xmm_double_reg(), right->as_xmm_double_reg(), dst->as_register(), code == lir_ucmp_fd2i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2851
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2852
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2853
      assert(left->is_single_fpu() || left->is_double_fpu(), "must be");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2854
      assert(right->is_single_fpu() || right->is_double_fpu(), "must match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2855
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2856
      assert(left->fpu() == 0, "left must be on TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2857
      __ fcmp2int(dst->as_register(), code == lir_ucmp_fd2i, right->fpu(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2858
                  op->fpu_pop_count() > 0, op->fpu_pop_count() > 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2859
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2860
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2861
    assert(code == lir_cmp_l2i, "check");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2862
#ifdef _LP64
5253
d2c37eee9a65 6942223: c1 64 bit fixes
iveresov
parents: 5052
diff changeset
  2863
    Label done;
d2c37eee9a65 6942223: c1 64 bit fixes
iveresov
parents: 5052
diff changeset
  2864
    Register dest = dst->as_register();
d2c37eee9a65 6942223: c1 64 bit fixes
iveresov
parents: 5052
diff changeset
  2865
    __ cmpptr(left->as_register_lo(), right->as_register_lo());
d2c37eee9a65 6942223: c1 64 bit fixes
iveresov
parents: 5052
diff changeset
  2866
    __ movl(dest, -1);
d2c37eee9a65 6942223: c1 64 bit fixes
iveresov
parents: 5052
diff changeset
  2867
    __ jccb(Assembler::less, done);
d2c37eee9a65 6942223: c1 64 bit fixes
iveresov
parents: 5052
diff changeset
  2868
    __ set_byte_if_not_zero(dest);
d2c37eee9a65 6942223: c1 64 bit fixes
iveresov
parents: 5052
diff changeset
  2869
    __ movzbl(dest, dest);
d2c37eee9a65 6942223: c1 64 bit fixes
iveresov
parents: 5052
diff changeset
  2870
    __ bind(done);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2871
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2872
    __ lcmp2int(left->as_register_hi(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2873
                left->as_register_lo(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2874
                right->as_register_hi(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2875
                right->as_register_lo());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2876
    move_regs(left->as_register_hi(), dst->as_register());
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2877
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2878
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2879
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2880
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2881
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2882
void LIR_Assembler::align_call(LIR_Code code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2883
  if (os::is_MP()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2884
    // make sure that the displacement word of the call ends up word aligned
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2885
    int offset = __ offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2886
    switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2887
      case lir_static_call:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2888
      case lir_optvirtual_call:
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
  2889
      case lir_dynamic_call:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2890
        offset += NativeCall::displacement_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2891
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2892
      case lir_icvirtual_call:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2893
        offset += NativeCall::displacement_offset + NativeMovConstReg::instruction_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2894
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2895
      case lir_virtual_call:  // currently, sparc-specific for niagara
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2896
      default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2897
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2898
    while (offset++ % BytesPerWord != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2899
      __ nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2900
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2901
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2902
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2903
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2904
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
  2905
void LIR_Assembler::call(LIR_OpJavaCall* op, relocInfo::relocType rtype) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2906
  assert(!os::is_MP() || (__ offset() + NativeCall::displacement_offset) % BytesPerWord == 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2907
         "must be aligned");
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
  2908
  __ call(AddressLiteral(op->addr(), rtype));
5687
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5404
diff changeset
  2909
  add_call_info(code_offset(), op->info());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2910
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2911
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2912
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
  2913
void LIR_Assembler::ic_call(LIR_OpJavaCall* op) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2914
  RelocationHolder rh = virtual_call_Relocation::spec(pc());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2915
  __ movoop(IC_Klass, (jobject)Universe::non_oop_word());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2916
  assert(!os::is_MP() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2917
         (__ offset() + NativeCall::displacement_offset) % BytesPerWord == 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2918
         "must be aligned");
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
  2919
  __ call(AddressLiteral(op->addr(), rh));
5687
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 5404
diff changeset
  2920
  add_call_info(code_offset(), op->info());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2921
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2922
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2923
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2924
/* Currently, vtable-dispatch is only enabled for sparc platforms */
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
  2925
void LIR_Assembler::vtable_call(LIR_OpJavaCall* op) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2926
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2927
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2928
5046
27e801a857cb 6919934: JSR 292 needs to support x86 C1
twisti
parents: 4898
diff changeset
  2929
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2930
void LIR_Assembler::emit_static_call_stub() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2931
  address call_pc = __ pc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2932
  address stub = __ start_a_stub(call_stub_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2933
  if (stub == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2934
    bailout("static call stub overflow");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2935
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2936
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2937
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2938
  int start = __ offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2939
  if (os::is_MP()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2940
    // make sure that the displacement word of the call ends up word aligned
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2941
    int offset = __ offset() + NativeMovConstReg::instruction_size + NativeCall::displacement_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2942
    while (offset++ % BytesPerWord != 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2943
      __ nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2944
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2945
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2946
  __ relocate(static_stub_Relocation::spec(call_pc));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2947
  __ movoop(rbx, (jobject)NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2948
  // must be set to -1 at code generation time
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2949
  assert(!os::is_MP() || ((__ offset() + 1) % BytesPerWord) == 0, "must be aligned on MP");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2950
  // On 64bit this will die since it will take a movq & jmp, must be only a jmp
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  2951
  __ jump(RuntimeAddress(__ pc()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2952
5402
c51fd0c1d005 6888953: some calls to function-like macros are missing semicolons
jcoomes
parents: 5334
diff changeset
  2953
  assert(__ offset() - start <= call_stub_size, "stub too big");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2954
  __ end_a_stub();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2955
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2956
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2957
5334
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2958
void LIR_Assembler::throw_op(LIR_Opr exceptionPC, LIR_Opr exceptionOop, CodeEmitInfo* info) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2959
  assert(exceptionOop->as_register() == rax, "must match");
5334
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2960
  assert(exceptionPC->as_register() == rdx, "must match");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2961
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2962
  // exception object is not added to oop map by LinearScan
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2963
  // (LinearScan assumes that no oops are in fixed registers)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2964
  info->add_register_oop(exceptionOop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2965
  Runtime1::StubID unwind_id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2966
5334
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2967
  // get current pc information
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2968
  // pc is only needed if the method has an exception handler, the unwind code does not need it.
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2969
  int pc_for_athrow_offset = __ offset();
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2970
  InternalAddress pc_for_athrow(__ pc());
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2971
  __ lea(exceptionPC->as_register(), pc_for_athrow);
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2972
  add_call_info(pc_for_athrow_offset, info); // for exception handler
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2973
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2974
  __ verify_not_null_oop(rax);
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2975
  // search an exception handler (rax: exception oop, rdx: throwing pc)
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2976
  if (compilation()->has_fpu_code()) {
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2977
    unwind_id = Runtime1::handle_exception_id;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2978
  } else {
5334
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2979
    unwind_id = Runtime1::handle_exception_nofpu_id;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2980
  }
5334
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2981
  __ call(RuntimeAddress(Runtime1::entry_for(unwind_id)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2982
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2983
  // enough room for two byte trap
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2984
  __ nop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2985
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2986
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2987
5334
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2988
void LIR_Assembler::unwind_op(LIR_Opr exceptionOop) {
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2989
  assert(exceptionOop->as_register() == rax, "must match");
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2990
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2991
  __ jmp(_unwind_handler_entry);
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2992
}
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2993
b2d040a8d375 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 5253
diff changeset
  2994
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2995
void LIR_Assembler::shift_op(LIR_Code code, LIR_Opr left, LIR_Opr count, LIR_Opr dest, LIR_Opr tmp) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2996
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2997
  // optimized version for linear scan:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2998
  // * count must be already in ECX (guaranteed by LinearScan)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2999
  // * left and dest must be equal
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3000
  // * tmp must be unused
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3001
  assert(count->as_register() == SHIFT_count, "count must be in ECX");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3002
  assert(left == dest, "left and dest must be equal");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3003
  assert(tmp->is_illegal(), "wasting a register if tmp is allocated");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3004
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3005
  if (left->is_single_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3006
    Register value = left->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3007
    assert(value != SHIFT_count, "left cannot be ECX");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3008
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3009
    switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3010
      case lir_shl:  __ shll(value); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3011
      case lir_shr:  __ sarl(value); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3012
      case lir_ushr: __ shrl(value); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3013
      default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3014
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3015
  } else if (left->is_double_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3016
    Register lo = left->as_register_lo();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3017
    Register hi = left->as_register_hi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3018
    assert(lo != SHIFT_count && hi != SHIFT_count, "left cannot be ECX");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3019
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3020
    switch (code) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3021
      case lir_shl:  __ shlptr(lo);        break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3022
      case lir_shr:  __ sarptr(lo);        break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3023
      case lir_ushr: __ shrptr(lo);        break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3024
      default: ShouldNotReachHere();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3025
    }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3026
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3027
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3028
    switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3029
      case lir_shl:  __ lshl(hi, lo);        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3030
      case lir_shr:  __ lshr(hi, lo, true);  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3031
      case lir_ushr: __ lshr(hi, lo, false); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3032
      default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3033
    }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3034
#endif // LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3035
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3036
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3037
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3038
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3039
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3040
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3041
void LIR_Assembler::shift_op(LIR_Code code, LIR_Opr left, jint count, LIR_Opr dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3042
  if (dest->is_single_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3043
    // first move left into dest so that left is not destroyed by the shift
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3044
    Register value = dest->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3045
    count = count & 0x1F; // Java spec
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3046
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3047
    move_regs(left->as_register(), value);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3048
    switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3049
      case lir_shl:  __ shll(value, count); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3050
      case lir_shr:  __ sarl(value, count); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3051
      case lir_ushr: __ shrl(value, count); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3052
      default: ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3053
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3054
  } else if (dest->is_double_cpu()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3055
#ifndef _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3056
    Unimplemented();
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3057
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3058
    // first move left into dest so that left is not destroyed by the shift
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3059
    Register value = dest->as_register_lo();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3060
    count = count & 0x1F; // Java spec
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3061
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3062
    move_regs(left->as_register_lo(), value);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3063
    switch (code) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3064
      case lir_shl:  __ shlptr(value, count); break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3065
      case lir_shr:  __ sarptr(value, count); break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3066
      case lir_ushr: __ shrptr(value, count); break;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3067
      default: ShouldNotReachHere();
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
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3070
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3071
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3072
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3073
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3074
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3075
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3076
void LIR_Assembler::store_parameter(Register r, int offset_from_rsp_in_words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3077
  assert(offset_from_rsp_in_words >= 0, "invalid offset from rsp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3078
  int offset_from_rsp_in_bytes = offset_from_rsp_in_words * BytesPerWord;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3079
  assert(offset_from_rsp_in_bytes < frame_map()->reserved_argument_area_size(), "invalid offset");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3080
  __ movptr (Address(rsp, offset_from_rsp_in_bytes), r);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3081
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3082
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3083
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3084
void LIR_Assembler::store_parameter(jint c,     int offset_from_rsp_in_words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3085
  assert(offset_from_rsp_in_words >= 0, "invalid offset from rsp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3086
  int offset_from_rsp_in_bytes = offset_from_rsp_in_words * BytesPerWord;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3087
  assert(offset_from_rsp_in_bytes < frame_map()->reserved_argument_area_size(), "invalid offset");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3088
  __ movptr (Address(rsp, offset_from_rsp_in_bytes), c);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3089
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3090
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3091
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3092
void LIR_Assembler::store_parameter(jobject o,  int offset_from_rsp_in_words) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3093
  assert(offset_from_rsp_in_words >= 0, "invalid offset from rsp");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3094
  int offset_from_rsp_in_bytes = offset_from_rsp_in_words * BytesPerWord;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3095
  assert(offset_from_rsp_in_bytes < frame_map()->reserved_argument_area_size(), "invalid offset");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3096
  __ movoop (Address(rsp, offset_from_rsp_in_bytes), o);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3097
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3098
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3099
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3100
// This code replaces a call to arraycopy; no exception may
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3101
// be thrown in this code, they must be thrown in the System.arraycopy
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3102
// activation frame; we could save some checks if this would not be the case
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3103
void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3104
  ciArrayKlass* default_type = op->expected_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3105
  Register src = op->src()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3106
  Register dst = op->dst()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3107
  Register src_pos = op->src_pos()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3108
  Register dst_pos = op->dst_pos()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3109
  Register length  = op->length()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3110
  Register tmp = op->tmp()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3111
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3112
  CodeStub* stub = op->stub();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3113
  int flags = op->flags();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3114
  BasicType basic_type = default_type != NULL ? default_type->element_type()->basic_type() : T_ILLEGAL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3115
  if (basic_type == T_ARRAY) basic_type = T_OBJECT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3116
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3117
  // if we don't know anything or it's an object array, just go through the generic arraycopy
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3118
  if (default_type == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3119
    Label done;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3120
    // save outgoing arguments on stack in case call to System.arraycopy is needed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3121
    // HACK ALERT. This code used to push the parameters in a hardwired fashion
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3122
    // for interpreter calling conventions. Now we have to do it in new style conventions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3123
    // For the moment until C1 gets the new register allocator I just force all the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3124
    // args to the right place (except the register args) and then on the back side
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3125
    // reload the register args properly if we go slow path. Yuck
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3126
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3127
    // These are proper for the calling convention
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3128
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3129
    store_parameter(length, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3130
    store_parameter(dst_pos, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3131
    store_parameter(dst, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3132
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3133
    // these are just temporary placements until we need to reload
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3134
    store_parameter(src_pos, 3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3135
    store_parameter(src, 4);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3136
    NOT_LP64(assert(src == rcx && src_pos == rdx, "mismatch in calling convention");)
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
    address entry = CAST_FROM_FN_PTR(address, Runtime1::arraycopy);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3139
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3140
    // pass arguments: may push as this is not a safepoint; SP must be fix at each safepoint
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3141
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3142
    // The arguments are in java calling convention so we can trivially shift them to C
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3143
    // convention
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3144
    assert_different_registers(c_rarg0, j_rarg1, j_rarg2, j_rarg3, j_rarg4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3145
    __ mov(c_rarg0, j_rarg0);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3146
    assert_different_registers(c_rarg1, j_rarg2, j_rarg3, j_rarg4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3147
    __ mov(c_rarg1, j_rarg1);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3148
    assert_different_registers(c_rarg2, j_rarg3, j_rarg4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3149
    __ mov(c_rarg2, j_rarg2);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3150
    assert_different_registers(c_rarg3, j_rarg4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3151
    __ mov(c_rarg3, j_rarg3);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3152
#ifdef _WIN64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3153
    // Allocate abi space for args but be sure to keep stack aligned
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3154
    __ subptr(rsp, 6*wordSize);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3155
    store_parameter(j_rarg4, 4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3156
    __ call(RuntimeAddress(entry));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3157
    __ addptr(rsp, 6*wordSize);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3158
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3159
    __ mov(c_rarg4, j_rarg4);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3160
    __ call(RuntimeAddress(entry));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3161
#endif // _WIN64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3162
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3163
    __ push(length);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3164
    __ push(dst_pos);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3165
    __ push(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3166
    __ push(src_pos);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3167
    __ push(src);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3168
    __ call_VM_leaf(entry, 5); // removes pushed parameter from the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3169
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3170
#endif // _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3171
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3172
    __ cmpl(rax, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3173
    __ jcc(Assembler::equal, *stub->continuation());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3174
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3175
    // Reload values from the stack so they are where the stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3176
    // expects them.
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3177
    __ movptr   (dst,     Address(rsp, 0*BytesPerWord));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3178
    __ movptr   (dst_pos, Address(rsp, 1*BytesPerWord));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3179
    __ movptr   (length,  Address(rsp, 2*BytesPerWord));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3180
    __ movptr   (src_pos, Address(rsp, 3*BytesPerWord));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3181
    __ movptr   (src,     Address(rsp, 4*BytesPerWord));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3182
    __ jmp(*stub->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3183
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3184
    __ bind(*stub->continuation());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3185
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3186
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3187
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3188
  assert(default_type != NULL && default_type->is_array_klass() && default_type->is_loaded(), "must be true at this point");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3189
202
dc13bf0e5d5d 6633953: type2aelembytes{T_ADDRESS} should be 8 bytes in 64 bit VM
kvn
parents: 1
diff changeset
  3190
  int elem_size = type2aelembytes(basic_type);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3191
  int shift_amount;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3192
  Address::ScaleFactor scale;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3193
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3194
  switch (elem_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3195
    case 1 :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3196
      shift_amount = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3197
      scale = Address::times_1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3198
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3199
    case 2 :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3200
      shift_amount = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3201
      scale = Address::times_2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3202
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3203
    case 4 :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3204
      shift_amount = 2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3205
      scale = Address::times_4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3206
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3207
    case 8 :
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3208
      shift_amount = 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3209
      scale = Address::times_8;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3210
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3211
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3212
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3213
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3214
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3215
  Address src_length_addr = Address(src, arrayOopDesc::length_offset_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3216
  Address dst_length_addr = Address(dst, arrayOopDesc::length_offset_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3217
  Address src_klass_addr = Address(src, oopDesc::klass_offset_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3218
  Address dst_klass_addr = Address(dst, oopDesc::klass_offset_in_bytes());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3219
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3220
  // length and pos's are all sign extended at this point on 64bit
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3221
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3222
  // test for NULL
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3223
  if (flags & LIR_OpArrayCopy::src_null_check) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3224
    __ testptr(src, src);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3225
    __ jcc(Assembler::zero, *stub->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3226
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3227
  if (flags & LIR_OpArrayCopy::dst_null_check) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3228
    __ testptr(dst, dst);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3229
    __ jcc(Assembler::zero, *stub->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3230
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3231
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3232
  // check if negative
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3233
  if (flags & LIR_OpArrayCopy::src_pos_positive_check) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3234
    __ testl(src_pos, src_pos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3235
    __ jcc(Assembler::less, *stub->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3236
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3237
  if (flags & LIR_OpArrayCopy::dst_pos_positive_check) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3238
    __ testl(dst_pos, dst_pos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3239
    __ jcc(Assembler::less, *stub->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3240
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3241
  if (flags & LIR_OpArrayCopy::length_positive_check) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3242
    __ testl(length, length);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3243
    __ jcc(Assembler::less, *stub->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3244
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3245
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3246
  if (flags & LIR_OpArrayCopy::src_range_check) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3247
    __ lea(tmp, Address(src_pos, length, Address::times_1, 0));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3248
    __ cmpl(tmp, src_length_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3249
    __ jcc(Assembler::above, *stub->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3250
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3251
  if (flags & LIR_OpArrayCopy::dst_range_check) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3252
    __ lea(tmp, Address(dst_pos, length, Address::times_1, 0));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3253
    __ cmpl(tmp, dst_length_addr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3254
    __ jcc(Assembler::above, *stub->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3255
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3256
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3257
  if (flags & LIR_OpArrayCopy::type_check) {
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3258
    if (UseCompressedOops) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3259
      __ movl(tmp, src_klass_addr);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3260
      __ cmpl(tmp, dst_klass_addr);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3261
    } else {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3262
      __ movptr(tmp, src_klass_addr);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3263
      __ cmpptr(tmp, dst_klass_addr);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3264
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3265
    __ jcc(Assembler::notEqual, *stub->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3266
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3267
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3268
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3269
  if (basic_type != T_OBJECT || !(flags & LIR_OpArrayCopy::type_check)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3270
    // Sanity check the known type with the incoming class.  For the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3271
    // primitive case the types must match exactly with src.klass and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3272
    // dst.klass each exactly matching the default type.  For the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3273
    // object array case, if no type check is needed then either the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3274
    // dst type is exactly the expected type and the src type is a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3275
    // subtype which we can't check or src is the same array as dst
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3276
    // but not necessarily exactly of type default_type.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3277
    Label known_ok, halt;
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 2867
diff changeset
  3278
    __ movoop(tmp, default_type->constant_encoding());
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3279
#ifdef _LP64
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3280
    if (UseCompressedOops) {
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3281
      __ encode_heap_oop(tmp);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3282
    }
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3283
#endif
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3284
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3285
    if (basic_type != T_OBJECT) {
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3286
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3287
      if (UseCompressedOops) __ cmpl(tmp, dst_klass_addr);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3288
      else                   __ cmpptr(tmp, dst_klass_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3289
      __ jcc(Assembler::notEqual, halt);
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3290
      if (UseCompressedOops) __ cmpl(tmp, src_klass_addr);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3291
      else                   __ cmpptr(tmp, src_klass_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3292
      __ jcc(Assembler::equal, known_ok);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3293
    } else {
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3294
      if (UseCompressedOops) __ cmpl(tmp, dst_klass_addr);
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3295
      else                   __ cmpptr(tmp, dst_klass_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3296
      __ jcc(Assembler::equal, known_ok);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3297
      __ cmpptr(src, dst);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3298
      __ jcc(Assembler::equal, known_ok);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3299
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3300
    __ bind(halt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3301
    __ stop("incorrect type information in arraycopy");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3302
    __ bind(known_ok);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3303
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3304
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3305
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3306
  if (shift_amount > 0 && basic_type != T_OBJECT) {
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3307
    __ shlptr(length, shift_amount);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3308
  }
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3309
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3310
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3311
  assert_different_registers(c_rarg0, dst, dst_pos, length);
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
  3312
  __ movl2ptr(src_pos, src_pos); //higher 32bits must be null
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3313
  __ lea(c_rarg0, Address(src, src_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type)));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3314
  assert_different_registers(c_rarg1, length);
4430
95b539dfa1e8 6769124: various 64-bit fixes for c1
roland
parents: 3908
diff changeset
  3315
  __ movl2ptr(dst_pos, dst_pos); //higher 32bits must be null
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3316
  __ lea(c_rarg1, Address(dst, dst_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type)));
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3317
  __ mov(c_rarg2, length);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3318
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3319
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3320
  __ lea(tmp, Address(src, src_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3321
  store_parameter(tmp, 0);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3322
  __ lea(tmp, Address(dst, dst_pos, scale, arrayOopDesc::base_offset_in_bytes(basic_type)));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3323
  store_parameter(tmp, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3324
  store_parameter(length, 2);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3325
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3326
  if (basic_type == T_OBJECT) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3327
    __ call_VM_leaf(CAST_FROM_FN_PTR(address, Runtime1::oop_arraycopy), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3328
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3329
    __ call_VM_leaf(CAST_FROM_FN_PTR(address, Runtime1::primitive_arraycopy), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3330
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3331
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3332
  __ bind(*stub->continuation());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3333
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3334
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3335
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3336
void LIR_Assembler::emit_lock(LIR_OpLock* op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3337
  Register obj = op->obj_opr()->as_register();  // may not be an oop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3338
  Register hdr = op->hdr_opr()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3339
  Register lock = op->lock_opr()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3340
  if (!UseFastLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3341
    __ jmp(*op->stub()->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3342
  } else if (op->code() == lir_lock) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3343
    Register scratch = noreg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3344
    if (UseBiasedLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3345
      scratch = op->scratch_opr()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3346
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3347
    assert(BasicLock::displaced_header_offset_in_bytes() == 0, "lock_reg must point to the displaced header");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3348
    // add debug info for NullPointerException only if one is possible
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3349
    int null_check_offset = __ lock_object(hdr, obj, lock, scratch, *op->stub()->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3350
    if (op->info() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3351
      add_debug_info_for_null_check(null_check_offset, op->info());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3352
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3353
    // done
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3354
  } else if (op->code() == lir_unlock) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3355
    assert(BasicLock::displaced_header_offset_in_bytes() == 0, "lock_reg must point to the displaced header");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3356
    __ unlock_object(hdr, obj, lock, *op->stub()->entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3357
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3358
    Unimplemented();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3359
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3360
  __ bind(*op->stub()->continuation());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3361
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3362
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3363
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3364
void LIR_Assembler::emit_profile_call(LIR_OpProfileCall* op) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3365
  ciMethod* method = op->profiled_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3366
  int bci          = op->profiled_bci();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3367
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3368
  // Update counter for all call types
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7427
diff changeset
  3369
  ciMethodData* md = method->method_data_or_null();
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7427
diff changeset
  3370
  assert(md != NULL, "Sanity");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3371
  ciProfileData* data = md->bci_to_data(bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3372
  assert(data->is_CounterData(), "need CounterData for calls");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3373
  assert(op->mdo()->is_single_cpu(),  "mdo must be allocated");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3374
  Register mdo  = op->mdo()->as_register();
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 2867
diff changeset
  3375
  __ movoop(mdo, md->constant_encoding());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3376
  Address counter_addr(mdo, md->byte_offset_of_slot(data, CounterData::count_offset()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3377
  Bytecodes::Code bc = method->java_code_at_bci(bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3378
  // Perform additional virtual call profiling for invokevirtual and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3379
  // invokeinterface bytecodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3380
  if ((bc == Bytecodes::_invokevirtual || bc == Bytecodes::_invokeinterface) &&
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  3381
      C1ProfileVirtualCalls) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3382
    assert(op->recv()->is_single_cpu(), "recv must be allocated");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3383
    Register recv = op->recv()->as_register();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3384
    assert_different_registers(mdo, recv);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3385
    assert(data->is_VirtualCallData(), "need VirtualCallData for virtual calls");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3386
    ciKlass* known_klass = op->known_holder();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  3387
    if (C1OptimizeVirtualCallProfiling && known_klass != NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3388
      // We know the type that will be seen at this call site; we can
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3389
      // statically update the methodDataOop rather than needing to do
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3390
      // dynamic tests on the receiver type
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3391
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3392
      // NOTE: we should probably put a lock around this search to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3393
      // avoid collisions by concurrent compilations
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3394
      ciVirtualCallData* vc_data = (ciVirtualCallData*) data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3395
      uint i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3396
      for (i = 0; i < VirtualCallData::row_limit(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3397
        ciKlass* receiver = vc_data->receiver(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3398
        if (known_klass->equals(receiver)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3399
          Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)));
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  3400
          __ addptr(data_addr, DataLayout::counter_increment);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3401
          return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3402
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3403
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3404
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3405
      // Receiver type not found in profile data; select an empty slot
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3406
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3407
      // Note that this is less efficient than it should be because it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3408
      // always does a write to the receiver part of the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3409
      // VirtualCallData rather than just the first time
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3410
      for (i = 0; i < VirtualCallData::row_limit(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3411
        ciKlass* receiver = vc_data->receiver(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3412
        if (receiver == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3413
          Address recv_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_offset(i)));
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 2867
diff changeset
  3414
          __ movoop(recv_addr, known_klass->constant_encoding());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3415
          Address data_addr(mdo, md->byte_offset_of_slot(data, VirtualCallData::receiver_count_offset(i)));
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  3416
          __ addptr(data_addr, DataLayout::counter_increment);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3417
          return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3418
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3419
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3420
    } else {
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  3421
      __ load_klass(recv, recv);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3422
      Label update_done;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  3423
      type_profile_helper(mdo, md, data, recv, &update_done);
4754
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4752
diff changeset
  3424
      // Receiver did not match any saved receiver and there is no empty row for it.
4892
e977b527544a 6923002: assert(false,"this call site should not be polymorphic")
kvn
parents: 4754
diff changeset
  3425
      // Increment total counter to indicate polymorphic case.
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  3426
      __ addptr(counter_addr, DataLayout::counter_increment);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3427
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3428
      __ bind(update_done);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3429
    }
4754
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4752
diff changeset
  3430
  } else {
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4752
diff changeset
  3431
    // Static call
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 5702
diff changeset
  3432
    __ addptr(counter_addr, DataLayout::counter_increment);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3433
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3434
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3435
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3436
void LIR_Assembler::emit_delay(LIR_OpDelay*) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3437
  Unimplemented();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3438
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3439
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3440
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3441
void LIR_Assembler::monitor_address(int monitor_no, LIR_Opr dst) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3442
  __ lea(dst->as_register(), frame_map()->address_for_monitor_lock(monitor_no));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3443
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3444
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3445
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3446
void LIR_Assembler::align_backward_branch_target() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3447
  __ align(BytesPerWord);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3448
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3449
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3450
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3451
void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3452
  if (left->is_single_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3453
    __ negl(left->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3454
    move_regs(left->as_register(), dest->as_register());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3455
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3456
  } else if (left->is_double_cpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3457
    Register lo = left->as_register_lo();
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3458
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3459
    Register dst = dest->as_register_lo();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3460
    __ movptr(dst, lo);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3461
    __ negptr(dst);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3462
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3463
    Register hi = left->as_register_hi();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3464
    __ lneg(hi, lo);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3465
    if (dest->as_register_lo() == hi) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3466
      assert(dest->as_register_hi() != lo, "destroying register");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3467
      move_regs(hi, dest->as_register_hi());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3468
      move_regs(lo, dest->as_register_lo());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3469
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3470
      move_regs(lo, dest->as_register_lo());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3471
      move_regs(hi, dest->as_register_hi());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3472
    }
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3473
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3474
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3475
  } else if (dest->is_single_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3476
    if (left->as_xmm_float_reg() != dest->as_xmm_float_reg()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3477
      __ movflt(dest->as_xmm_float_reg(), left->as_xmm_float_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3478
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3479
    __ xorps(dest->as_xmm_float_reg(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3480
             ExternalAddress((address)float_signflip_pool));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3481
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3482
  } else if (dest->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3483
    if (left->as_xmm_double_reg() != dest->as_xmm_double_reg()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3484
      __ movdbl(dest->as_xmm_double_reg(), left->as_xmm_double_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3485
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3486
    __ xorpd(dest->as_xmm_double_reg(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3487
             ExternalAddress((address)double_signflip_pool));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3488
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3489
  } else if (left->is_single_fpu() || left->is_double_fpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3490
    assert(left->fpu() == 0, "arg must be on TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3491
    assert(dest->fpu() == 0, "dest must be TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3492
    __ fchs();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3493
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3494
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3495
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3496
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3497
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3498
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3499
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3500
void LIR_Assembler::leal(LIR_Opr addr, LIR_Opr dest) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3501
  assert(addr->is_address() && dest->is_register(), "check");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3502
  Register reg;
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3503
  reg = dest->as_pointer_register();
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3504
  __ lea(reg, as_Address(addr->as_address_ptr()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3505
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3506
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3507
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3508
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3509
void LIR_Assembler::rt_call(LIR_Opr result, address dest, const LIR_OprList* args, LIR_Opr tmp, CodeEmitInfo* info) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3510
  assert(!tmp->is_valid(), "don't need temporary");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3511
  __ call(RuntimeAddress(dest));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3512
  if (info != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3513
    add_call_info_here(info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3514
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3515
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3516
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3517
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3518
void LIR_Assembler::volatile_move_op(LIR_Opr src, LIR_Opr dest, BasicType type, CodeEmitInfo* info) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3519
  assert(type == T_LONG, "only for volatile long fields");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3520
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3521
  if (info != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3522
    add_debug_info_for_null_check_here(info);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3523
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3524
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3525
  if (src->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3526
    if (dest->is_double_cpu()) {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3527
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3528
      __ movdq(dest->as_register_lo(), src->as_xmm_double_reg());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3529
#else
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3530
      __ movdl(dest->as_register_lo(), src->as_xmm_double_reg());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3531
      __ psrlq(src->as_xmm_double_reg(), 32);
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3532
      __ movdl(dest->as_register_hi(), src->as_xmm_double_reg());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3533
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3534
    } else if (dest->is_double_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3535
      __ movdbl(frame_map()->address_for_slot(dest->double_stack_ix()), src->as_xmm_double_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3536
    } else if (dest->is_address()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3537
      __ movdbl(as_Address(dest->as_address_ptr()), src->as_xmm_double_reg());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3538
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3539
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3540
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3541
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3542
  } else if (dest->is_double_xmm()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3543
    if (src->is_double_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3544
      __ movdbl(dest->as_xmm_double_reg(), frame_map()->address_for_slot(src->double_stack_ix()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3545
    } else if (src->is_address()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3546
      __ movdbl(dest->as_xmm_double_reg(), as_Address(src->as_address_ptr()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3547
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3548
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3549
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3550
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3551
  } else if (src->is_double_fpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3552
    assert(src->fpu_regnrLo() == 0, "must be TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3553
    if (dest->is_double_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3554
      __ fistp_d(frame_map()->address_for_slot(dest->double_stack_ix()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3555
    } else if (dest->is_address()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3556
      __ fistp_d(as_Address(dest->as_address_ptr()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3557
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3558
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3559
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3560
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3561
  } else if (dest->is_double_fpu()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3562
    assert(dest->fpu_regnrLo() == 0, "must be TOS");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3563
    if (src->is_double_stack()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3564
      __ fild_d(frame_map()->address_for_slot(src->double_stack_ix()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3565
    } else if (src->is_address()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3566
      __ fild_d(as_Address(src->as_address_ptr()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3567
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3568
      ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3569
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3570
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3571
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3572
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3573
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3574
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3575
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3576
void LIR_Assembler::membar() {
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3577
  // QQQ sparc TSO uses this,
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3578
  __ membar( Assembler::Membar_mask_bits(Assembler::StoreLoad));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3579
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3580
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3581
void LIR_Assembler::membar_acquire() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3582
  // No x86 machines currently require load fences
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3583
  // __ load_fence();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3584
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3585
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3586
void LIR_Assembler::membar_release() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3587
  // No x86 machines currently require store fences
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3588
  // __ store_fence();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3589
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3590
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3591
void LIR_Assembler::get_thread(LIR_Opr result_reg) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3592
  assert(result_reg->is_register(), "check");
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3593
#ifdef _LP64
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3594
  // __ get_thread(result_reg->as_register_lo());
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3595
  __ mov(result_reg->as_register(), r15_thread);
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3596
#else
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3597
  __ get_thread(result_reg->as_register());
1066
717c3345024f 5108146: Merge i486 and amd64 cpu directories
never
parents: 670
diff changeset
  3598
#endif // _LP64
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3599
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3600
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3601
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3602
void LIR_Assembler::peephole(LIR_List*) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3603
  // do nothing for now
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3604
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3605
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3606
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3607
#undef __