hotspot/src/cpu/sparc/vm/assembler_sparc.hpp
author morris
Fri, 07 Jun 2013 16:46:37 -0700
changeset 18097 acd70736bd60
parent 15116 af423dcb739c
child 22234 da823d78ad65
permissions -rw-r--r--
8008407: remove SPARC V8 support Summary: Removed most of the SPARC V8 instructions Reviewed-by: kvn, twisti
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
11637
030466036615 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 11190
diff changeset
     2
 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5542
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5542
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: 5542
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: 7112
diff changeset
    25
#ifndef CPU_SPARC_VM_ASSEMBLER_SPARC_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7112
diff changeset
    26
#define CPU_SPARC_VM_ASSEMBLER_SPARC_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7112
diff changeset
    27
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents: 13969
diff changeset
    28
#include "asm/register.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
// The SPARC Assembler: Pure assembler doing NO optimizations on the instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
// level; i.e., what you write
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
// is what you get. The Assembler is generating code into a CodeBuffer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
class Assembler : public AbstractAssembler  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
  friend class AbstractAssembler;
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2534
diff changeset
    36
  friend class AddressLiteral;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
  // code patchers need various routines like inv_wdisp()
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
  friend class NativeInstruction;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
  friend class NativeGeneralJump;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
  friend class Relocation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  friend class Label;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  // op carries format info; see page 62 & 267
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  enum ops {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
    call_op   = 1, // fmt 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
    branch_op = 0, // also sethi (fmt2)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
    arith_op  = 2, // fmt 3, arith & misc
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
    ldst_op   = 3  // fmt 3, load/store
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  enum op2s {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
    bpr_op2   = 3,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
    fb_op2    = 6,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
    fbp_op2   = 5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
    br_op2    = 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
    bp_op2    = 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
    sethi_op2 = 4
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  enum op3s {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
    // selected op3s
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
    add_op3      = 0x00,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
    and_op3      = 0x01,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
    or_op3       = 0x02,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
    xor_op3      = 0x03,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
    sub_op3      = 0x04,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
    andn_op3     = 0x05,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
    orn_op3      = 0x06,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
    xnor_op3     = 0x07,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
    addc_op3     = 0x08,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
    mulx_op3     = 0x09,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
    umul_op3     = 0x0a,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
    smul_op3     = 0x0b,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
    subc_op3     = 0x0c,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
    udivx_op3    = 0x0d,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
    udiv_op3     = 0x0e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
    sdiv_op3     = 0x0f,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
    addcc_op3    = 0x10,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
    andcc_op3    = 0x11,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
    orcc_op3     = 0x12,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
    xorcc_op3    = 0x13,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
    subcc_op3    = 0x14,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
    andncc_op3   = 0x15,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
    orncc_op3    = 0x16,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
    xnorcc_op3   = 0x17,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
    addccc_op3   = 0x18,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
    umulcc_op3   = 0x1a,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
    smulcc_op3   = 0x1b,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
    subccc_op3   = 0x1c,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
    udivcc_op3   = 0x1e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
    sdivcc_op3   = 0x1f,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
    taddcc_op3   = 0x20,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
    tsubcc_op3   = 0x21,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
    taddcctv_op3 = 0x22,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
    tsubcctv_op3 = 0x23,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
    mulscc_op3   = 0x24,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
    sll_op3      = 0x25,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
    sllx_op3     = 0x25,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
    srl_op3      = 0x26,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
    srlx_op3     = 0x26,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
    sra_op3      = 0x27,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
    srax_op3     = 0x27,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
    rdreg_op3    = 0x28,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
    membar_op3   = 0x28,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
    flushw_op3   = 0x2b,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
    movcc_op3    = 0x2c,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
    sdivx_op3    = 0x2d,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
    popc_op3     = 0x2e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
    movr_op3     = 0x2f,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
    sir_op3      = 0x30,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
    wrreg_op3    = 0x30,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
    saved_op3    = 0x31,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
    fpop1_op3    = 0x34,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
    fpop2_op3    = 0x35,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    impdep1_op3  = 0x36,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
    impdep2_op3  = 0x37,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
    jmpl_op3     = 0x38,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
    rett_op3     = 0x39,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
    trap_op3     = 0x3a,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
    flush_op3    = 0x3b,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
    save_op3     = 0x3c,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
    restore_op3  = 0x3d,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    done_op3     = 0x3e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    retry_op3    = 0x3e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    lduw_op3     = 0x00,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    ldub_op3     = 0x01,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    lduh_op3     = 0x02,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    ldd_op3      = 0x03,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    stw_op3      = 0x04,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    stb_op3      = 0x05,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
    sth_op3      = 0x06,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
    std_op3      = 0x07,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    ldsw_op3     = 0x08,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
    ldsb_op3     = 0x09,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
    ldsh_op3     = 0x0a,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
    ldx_op3      = 0x0b,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
    stx_op3      = 0x0e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
    swap_op3     = 0x0f,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
    stwa_op3     = 0x14,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
    stxa_op3     = 0x1e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
    ldf_op3      = 0x20,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
    ldfsr_op3    = 0x21,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
    ldqf_op3     = 0x22,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
    lddf_op3     = 0x23,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    stf_op3      = 0x24,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
    stfsr_op3    = 0x25,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
    stqf_op3     = 0x26,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
    stdf_op3     = 0x27,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
    prefetch_op3 = 0x2d,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
    casa_op3     = 0x3c,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
    casxa_op3    = 0x3e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
10027
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   167
    mftoi_op3    = 0x36,
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   168
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
    alt_bit_op3  = 0x10,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
     cc_bit_op3  = 0x10
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  enum opfs {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
    // selected opfs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
    fmovs_opf   = 0x01,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
    fmovd_opf   = 0x02,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
    fnegs_opf   = 0x05,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
    fnegd_opf   = 0x06,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
    fadds_opf   = 0x41,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
    faddd_opf   = 0x42,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
    fsubs_opf   = 0x45,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
    fsubd_opf   = 0x46,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
    fmuls_opf   = 0x49,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
    fmuld_opf   = 0x4a,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
    fdivs_opf   = 0x4d,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
    fdivd_opf   = 0x4e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
    fcmps_opf   = 0x51,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
    fcmpd_opf   = 0x52,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
    fstox_opf   = 0x81,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
    fdtox_opf   = 0x82,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
    fxtos_opf   = 0x84,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
    fxtod_opf   = 0x88,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
    fitos_opf   = 0xc4,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
    fdtos_opf   = 0xc6,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
    fitod_opf   = 0xc8,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
    fstod_opf   = 0xc9,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
    fstoi_opf   = 0xd1,
10027
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   203
    fdtoi_opf   = 0xd2,
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   204
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   205
    mdtox_opf   = 0x110,
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   206
    mstouw_opf  = 0x111,
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   207
    mstosw_opf  = 0x113,
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   208
    mxtod_opf   = 0x118,
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   209
    mwtos_opf   = 0x119
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   212
  enum RCondition {  rc_z = 1,  rc_lez = 2,  rc_lz = 3, rc_nz = 5, rc_gz = 6, rc_gez = 7, rc_last = rc_gez  };
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  enum Condition {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
     // for FBfcc & FBPfcc instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
    f_never                     = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
    f_notEqual                  = 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
    f_notZero                   = 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
    f_lessOrGreater             = 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
    f_unorderedOrLess           = 3,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    f_less                      = 4,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
    f_unorderedOrGreater        = 5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
    f_greater                   = 6,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
    f_unordered                 = 7,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
    f_always                    = 8,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
    f_equal                     = 9,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
    f_zero                      = 9,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
    f_unorderedOrEqual          = 10,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
    f_greaterOrEqual            = 11,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
    f_unorderedOrGreaterOrEqual = 12,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
    f_lessOrEqual               = 13,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
    f_unorderedOrLessOrEqual    = 14,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
    f_ordered                   = 15,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
    // V8 coproc, pp 123 v8 manual
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
    cp_always  = 8,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
    cp_never   = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
    cp_3       = 7,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    cp_2       = 6,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
    cp_2or3    = 5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
    cp_1       = 4,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
    cp_1or3    = 3,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
    cp_1or2    = 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
    cp_1or2or3 = 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
    cp_0       = 9,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    cp_0or3    = 10,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
    cp_0or2    = 11,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
    cp_0or2or3 = 12,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
    cp_0or1    = 13,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
    cp_0or1or3 = 14,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
    cp_0or1or2 = 15,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
    // for integers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
    never                 =  0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    equal                 =  1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
    zero                  =  1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
    lessEqual             =  2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
    less                  =  3,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
    lessEqualUnsigned     =  4,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
    lessUnsigned          =  5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
    carrySet              =  5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
    negative              =  6,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
    overflowSet           =  7,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
    always                =  8,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
    notEqual              =  9,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
    notZero               =  9,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    greater               =  10,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    greaterEqual          =  11,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
    greaterUnsigned       =  12,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    greaterEqualUnsigned  =  13,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
    carryClear            =  13,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
    positive              =  14,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
    overflowClear         =  15
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  enum CC {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
    icc  = 0,  xcc  = 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
    // ptr_cc is the correct condition code for a pointer or intptr_t:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
    ptr_cc = NOT_LP64(icc) LP64_ONLY(xcc),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
    fcc0 = 0,  fcc1 = 1, fcc2 = 2, fcc3 = 3
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  enum PrefetchFcn {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
    severalReads = 0,  oneRead = 1,  severalWritesAndPossiblyReads = 2, oneWrite = 3, page = 4
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  // Helper functions for groups of instructions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  enum Predict { pt = 1, pn = 0 }; // pt = predict taken
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  enum Membar_mask_bits { // page 184, v9
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
    StoreStore = 1 << 3,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
    LoadStore  = 1 << 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
    StoreLoad  = 1 << 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
    LoadLoad   = 1 << 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
    Sync       = 1 << 6,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
    MemIssue   = 1 << 5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
    Lookaside  = 1 << 4
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
7892
ff4948f95c49 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 7700
diff changeset
   306
  static bool is_in_wdisp_range(address a, address b, int nbits) {
ff4948f95c49 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 7700
diff changeset
   307
    intptr_t d = intptr_t(b) - intptr_t(a);
ff4948f95c49 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 7700
diff changeset
   308
    return is_simm(d, nbits + 2);
ff4948f95c49 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 7700
diff changeset
   309
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   311
  address target_distance(Label& L) {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   312
    // Assembler::target(L) should be called only when
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   313
    // a branch instruction is emitted since non-bound
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   314
    // labels record current pc() as a branch address.
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   315
    if (L.is_bound()) return target(L);
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   316
    // Return current address for non-bound labels.
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   317
    return pc();
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   318
  }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   319
6774
a224d6a24120 6991512: G1 barriers fail with 64bit C1
iveresov
parents: 6772
diff changeset
   320
  // test if label is in simm16 range in words (wdisp16).
a224d6a24120 6991512: G1 barriers fail with 64bit C1
iveresov
parents: 6772
diff changeset
   321
  bool is_in_wdisp16_range(Label& L) {
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   322
    return is_in_wdisp_range(target_distance(L), pc(), 16);
7892
ff4948f95c49 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 7700
diff changeset
   323
  }
ff4948f95c49 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 7700
diff changeset
   324
  // test if the distance between two addresses fits in simm30 range in words
ff4948f95c49 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 7700
diff changeset
   325
  static bool is_in_wdisp30_range(address a, address b) {
ff4948f95c49 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 7700
diff changeset
   326
    return is_in_wdisp_range(a, b, 30);
6774
a224d6a24120 6991512: G1 barriers fail with 64bit C1
iveresov
parents: 6772
diff changeset
   327
  }
a224d6a24120 6991512: G1 barriers fail with 64bit C1
iveresov
parents: 6772
diff changeset
   328
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  enum ASIs { // page 72, v9
10501
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 10267
diff changeset
   330
    ASI_PRIMARY            = 0x80,
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 10267
diff changeset
   331
    ASI_PRIMARY_NOFAULT    = 0x82,
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 10267
diff changeset
   332
    ASI_PRIMARY_LITTLE     = 0x88,
10267
8bdeec886dc4 7079329: Adjust allocation prefetching for T4
kvn
parents: 10264
diff changeset
   333
    // Block initializing store
8bdeec886dc4 7079329: Adjust allocation prefetching for T4
kvn
parents: 10264
diff changeset
   334
    ASI_ST_BLKINIT_PRIMARY = 0xE2,
8bdeec886dc4 7079329: Adjust allocation prefetching for T4
kvn
parents: 10264
diff changeset
   335
    // Most-Recently-Used (MRU) BIS variant
8bdeec886dc4 7079329: Adjust allocation prefetching for T4
kvn
parents: 10264
diff changeset
   336
    ASI_ST_BLKINIT_MRU_PRIMARY = 0xF2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
    // add more from book as needed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  // helpers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  // x is supposed to fit in a field "nbits" wide
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
  // and be sign-extended. Check the range.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  static void assert_signed_range(intptr_t x, int nbits) {
9976
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9176
diff changeset
   347
    assert(nbits == 32 || (-(1 << nbits-1) <= x  &&  x < ( 1 << nbits-1)),
6fef34e63df1 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 9176
diff changeset
   348
           err_msg("value out of range: x=" INTPTR_FORMAT ", nbits=%d", x, nbits));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  static void assert_signed_word_disp_range(intptr_t x, int nbits) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
    assert( (x & 3) == 0, "not word aligned");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
    assert_signed_range(x, nbits + 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
  static void assert_unsigned_const(int x, int nbits) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
    assert( juint(x)  <  juint(1 << nbits), "unsigned constant out of range");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  // fields: note bits numbered from LSB = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
  //  fields known by inclusive bit range
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  static int fmask(juint hi_bit, juint lo_bit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
    assert( hi_bit >= lo_bit  &&  0 <= lo_bit  &&  hi_bit < 32, "bad bits");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
    return (1 << ( hi_bit-lo_bit + 1 )) - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  // inverse of u_field
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
  static int inv_u_field(int x, int hi_bit, int lo_bit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
    juint r = juint(x) >> lo_bit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
    r &= fmask( hi_bit, lo_bit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
    return int(r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  // signed version: extract from field and sign-extend
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  static int inv_s_field(int x, int hi_bit, int lo_bit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
    int sign_shift = 31 - hi_bit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
    return inv_u_field( ((x << sign_shift) >> sign_shift), hi_bit, lo_bit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  // given a field that ranges from hi_bit to lo_bit (inclusive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  // LSB = 0), and an unsigned value for the field,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
  // shift it into the field
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  static int u_field(int x, int hi_bit, int lo_bit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
    assert( ( x & ~fmask(hi_bit, lo_bit))  == 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
            "value out of range");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
    int r = x << lo_bit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
    assert( inv_u_field(r, hi_bit, lo_bit) == x, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
    return r;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
  // make sure this is inlined as it will reduce code size significantly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  #define u_field(x, hi_bit, lo_bit)   ((x) << (lo_bit))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
  static int inv_op(  int x ) { return inv_u_field(x, 31, 30); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  static int inv_op2( int x ) { return inv_u_field(x, 24, 22); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  static int inv_op3( int x ) { return inv_u_field(x, 24, 19); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  static int inv_cond( int x ){ return inv_u_field(x, 28, 25); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
  static bool inv_immed( int x ) { return (x & Assembler::immed(true)) != 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
  static Register inv_rd(  int x ) { return as_Register(inv_u_field(x, 29, 25)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
  static Register inv_rs1( int x ) { return as_Register(inv_u_field(x, 18, 14)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  static Register inv_rs2( int x ) { return as_Register(inv_u_field(x,  4,  0)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  static int op(       int         x)  { return  u_field(x,             31, 30); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
  static int rd(       Register    r)  { return  u_field(r->encoding(), 29, 25); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  static int fcn(      int         x)  { return  u_field(x,             29, 25); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  static int op3(      int         x)  { return  u_field(x,             24, 19); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  static int rs1(      Register    r)  { return  u_field(r->encoding(), 18, 14); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
  static int rs2(      Register    r)  { return  u_field(r->encoding(),  4,  0); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  static int annul(    bool        a)  { return  u_field(a ? 1 : 0,     29, 29); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
  static int cond(     int         x)  { return  u_field(x,             28, 25); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
  static int cond_mov( int         x)  { return  u_field(x,             17, 14); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  static int rcond(    RCondition  x)  { return  u_field(x,             12, 10); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  static int op2(      int         x)  { return  u_field(x,             24, 22); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  static int predict(  bool        p)  { return  u_field(p ? 1 : 0,     19, 19); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  static int branchcc( CC       fcca)  { return  u_field(fcca,          21, 20); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  static int cmpcc(    CC       fcca)  { return  u_field(fcca,          26, 25); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  static int imm_asi(  int         x)  { return  u_field(x,             12,  5); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  static int immed(    bool        i)  { return  u_field(i ? 1 : 0,     13, 13); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  static int opf_low6( int         w)  { return  u_field(w,             10,  5); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  static int opf_low5( int         w)  { return  u_field(w,              9,  5); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  static int trapcc(   CC         cc)  { return  u_field(cc,            12, 11); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  static int sx(       int         i)  { return  u_field(i,             12, 12); } // shift x=1 means 64-bit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  static int opf(      int         x)  { return  u_field(x,             13,  5); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   434
  static bool is_cbcond( int x ) {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   435
    return (VM_Version::has_cbcond() && (inv_cond(x) > rc_last) &&
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   436
            inv_op(x) == branch_op && inv_op2(x) == bpr_op2);
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   437
  }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   438
  static bool is_cxb( int x ) {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   439
    assert(is_cbcond(x), "wrong instruction");
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   440
    return (x & (1<<21)) != 0;
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   441
  }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   442
  static int cond_cbcond( int         x)  { return  u_field((((x & 8)<<1) + 8 + (x & 7)), 29, 25); }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   443
  static int inv_cond_cbcond(int      x)  {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   444
    assert(is_cbcond(x), "wrong instruction");
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   445
    return inv_u_field(x, 27, 25) | (inv_u_field(x, 29, 29)<<3);
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   446
  }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   447
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  static int opf_cc(   CC          c, bool useFloat ) { return u_field((useFloat ? 0 : 4) + c, 13, 11); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  static int mov_cc(   CC          c, bool useFloat ) { return u_field(useFloat ? 0 : 1,  18, 18) | u_field(c, 12, 11); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
  static int fd( FloatRegister r,  FloatRegisterImpl::Width fwa) { return u_field(r->encoding(fwa), 29, 25); };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  static int fs1(FloatRegister r,  FloatRegisterImpl::Width fwa) { return u_field(r->encoding(fwa), 18, 14); };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  static int fs2(FloatRegister r,  FloatRegisterImpl::Width fwa) { return u_field(r->encoding(fwa),  4,  0); };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  // some float instructions use this encoding on the op3 field
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  static int alt_op3(int op, FloatRegisterImpl::Width w) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
    int r;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
    switch(w) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
     case FloatRegisterImpl::S: r = op + 0;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
     case FloatRegisterImpl::D: r = op + 3;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
     case FloatRegisterImpl::Q: r = op + 2;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
     default: ShouldNotReachHere(); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
    return op3(r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  // compute inverse of simm
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  static int inv_simm(int x, int nbits) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
    return (int)(x << (32 - nbits)) >> (32 - nbits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  static int inv_simm13( int x ) { return inv_simm(x, 13); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  // signed immediate, in low bits, nbits long
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  static int simm(int x, int nbits) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
    assert_signed_range(x, nbits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
    return x  &  (( 1 << nbits ) - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  // compute inverse of wdisp16
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  static intptr_t inv_wdisp16(int x, intptr_t pos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
    int lo = x & (( 1 << 14 ) - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
    int hi = (x >> 20) & 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
    if (hi >= 2) hi |= ~1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
    return (((hi << 14) | lo) << 2) + pos;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
  // word offset, 14 bits at LSend, 2 bits at B21, B20
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  static int wdisp16(intptr_t x, intptr_t off) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
    intptr_t xx = x - off;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
    assert_signed_word_disp_range(xx, 16);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
    int r =  (xx >> 2) & ((1 << 14) - 1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
           |  (  ( (xx>>(2+14)) & 3 )  <<  20 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
    assert( inv_wdisp16(r, off) == x,  "inverse is not inverse");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
    return r;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   499
  // compute inverse of wdisp10
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   500
  static intptr_t inv_wdisp10(int x, intptr_t pos) {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   501
    assert(is_cbcond(x), "wrong instruction");
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   502
    int lo = inv_u_field(x, 12, 5);
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   503
    int hi = (x >> 19) & 3;
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   504
    if (hi >= 2) hi |= ~1;
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   505
    return (((hi << 8) | lo) << 2) + pos;
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   506
  }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   507
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   508
  // word offset for cbcond, 8 bits at [B12,B5], 2 bits at [B20,B19]
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   509
  static int wdisp10(intptr_t x, intptr_t off) {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   510
    assert(VM_Version::has_cbcond(), "This CPU does not have CBCOND instruction");
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   511
    intptr_t xx = x - off;
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   512
    assert_signed_word_disp_range(xx, 10);
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   513
    int r =  ( ( (xx >>  2   ) & ((1 << 8) - 1) ) <<  5 )
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   514
           | ( ( (xx >> (2+8)) & 3              ) << 19 );
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   515
    // Have to fake cbcond instruction to pass assert in inv_wdisp10()
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   516
    assert(inv_wdisp10((r | op(branch_op) | cond_cbcond(rc_last+1) | op2(bpr_op2)), off) == x,  "inverse is not inverse");
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   517
    return r;
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   518
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  // word displacement in low-order nbits bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  static intptr_t inv_wdisp( int x, intptr_t pos, int nbits ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
    int pre_sign_extend = x & (( 1 << nbits ) - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
    int r =  pre_sign_extend >= ( 1 << (nbits-1) )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
       ?   pre_sign_extend | ~(( 1 << nbits ) - 1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
       :   pre_sign_extend;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
    return (r << 2) + pos;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  static int wdisp( intptr_t x, intptr_t off, int nbits ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
    intptr_t xx = x - off;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
    assert_signed_word_disp_range(xx, nbits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
    int r =  (xx >> 2) & (( 1 << nbits ) - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
    assert( inv_wdisp( r, off, nbits )  ==  x, "inverse not inverse");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
    return r;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  // Extract the top 32 bits in a 64 bit word
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  static int32_t hi32( int64_t x ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
    int32_t r = int32_t( (uint64_t)x >> 32 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
    return r;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  // given a sethi instruction, extract the constant, left-justified
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  static int inv_hi22( int x ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
    return x << 10;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  // create an imm22 field, given a 32-bit left-justified constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  static int hi22( int x ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
    int r = int( juint(x) >> 10 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
    assert( (r & ~((1 << 22) - 1))  ==  0, "just checkin'");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
    return r;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
  // create a low10 __value__ (not a field) for a given a 32-bit constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
  static int low10( int x ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
    return x & ((1 << 10) - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
10027
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   562
  // instruction only in VIS3
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   563
  static void vis3_only() { assert( VM_Version::has_vis3(), "This instruction only works on SPARC with VIS3"); }
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   564
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  // instruction only in v9
18097
acd70736bd60 8008407: remove SPARC V8 support
morris
parents: 15116
diff changeset
   566
  static void v9_only() { } // do nothing
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  // instruction deprecated in v9
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  static void v9_dep()  { } // do nothing for now
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  // v8 has no CC field
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  static void v8_no_cc(CC cc)  { if (cc)  v9_only(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  // Simple delay-slot scheme:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  // In order to check the programmer, the assembler keeps track of deley slots.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  // It forbids CTIs in delay slots (conservative, but should be OK).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  // Also, when putting an instruction into a delay slot, you must say
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
  // asm->delayed()->add(...), in order to check that you don't omit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  // delay-slot instructions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
  // To implement this, we use a simple FSA
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
  #define CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
#ifdef CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  enum Delay_state { no_delay, at_delay_slot, filling_delay_slot } delay_state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  // Tells assembler next instruction must NOT be in delay slot.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  // Use at start of multinstruction macros.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  void assert_not_delayed() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
    // This is a separate overloading to avoid creation of string constants
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
    // in non-asserted code--with some compilers this pollutes the object code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
#ifdef CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
    assert_not_delayed("next instruction should not be a delay slot");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
  void assert_not_delayed(const char* msg) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
#ifdef CHECK_DELAY
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 4009
diff changeset
   602
    assert(delay_state == no_delay, msg);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
  // Delay slot helpers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  // cti is called when emitting control-transfer instruction,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
  // BEFORE doing the emitting.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
  // Only effective when assertion-checking is enabled.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
  void cti() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
#ifdef CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
    assert_not_delayed("cti should not be in delay slot");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  // called when emitting cti with a delay slot, AFTER emitting
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  void has_delay_slot() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
#ifdef CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
    assert_not_delayed("just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
    delay_state = at_delay_slot;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   625
  // cbcond instruction should not be generated one after an other
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   626
  bool cbcond_before() {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   627
    if (offset() == 0) return false; // it is first instruction
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   628
    int x = *(int*)(intptr_t(pc()) - 4); // previous instruction
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   629
    return is_cbcond(x);
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   630
  }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   631
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   632
  void no_cbcond_before() {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   633
    assert(offset() == 0 || !cbcond_before(), "cbcond should not follow an other cbcond");
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   634
  }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   635
10264
6879f93d268d 7063629: use cbcond in C2 generated code on T4
kvn
parents: 10252
diff changeset
   636
public:
6879f93d268d 7063629: use cbcond in C2 generated code on T4
kvn
parents: 10252
diff changeset
   637
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   638
  bool use_cbcond(Label& L) {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   639
    if (!UseCBCond || cbcond_before()) return false;
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   640
    intptr_t x = intptr_t(target_distance(L)) - intptr_t(pc());
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   641
    assert( (x & 3) == 0, "not word aligned");
11190
d561d41f241a 7003454: order constants in constant table by number of references in code
twisti
parents: 10519
diff changeset
   642
    return is_simm12(x);
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   643
  }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   644
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
  // Tells assembler you know that next instruction is delayed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  Assembler* delayed() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
#ifdef CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
    assert ( delay_state == at_delay_slot, "delayed instruction is not in delay slot");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
    delay_state = filling_delay_slot;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
    return this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
  void flush() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
#ifdef CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
    assert ( delay_state == no_delay, "ending code with a delay slot");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
    AbstractAssembler::flush();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   661
  inline void emit_int32(int);  // shadows AbstractAssembler::emit_int32
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   662
  inline void emit_data(int x) { emit_int32(x); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  inline void emit_data(int, RelocationHolder const&);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
  inline void emit_data(int, relocInfo::relocType rtype);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
  // helper for above fcns
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
  inline void check_delay();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
  // instructions, refer to page numbers in the SPARC Architecture Manual, V9
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
  // pp 135 (addc was addx in v8)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2534
diff changeset
   674
  inline void add(Register s1, Register s2, Register d );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents: 13969
diff changeset
   675
  inline void add(Register s1, int simm13a, Register d );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   677
  void addcc(  Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(add_op3  | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   678
  void addcc(  Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(add_op3  | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   679
  void addc(   Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(addc_op3             ) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   680
  void addc(   Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(addc_op3             ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   681
  void addccc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(addc_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   682
  void addccc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(addc_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   684
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  // pp 136
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   687
  inline void bpr(RCondition c, bool a, Predict p, Register s1, address d, relocInfo::relocType rt = relocInfo::none);
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   688
  inline void bpr(RCondition c, bool a, Predict p, Register s1, Label& L);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
10264
6879f93d268d 7063629: use cbcond in C2 generated code on T4
kvn
parents: 10252
diff changeset
   690
  // compare and branch
6879f93d268d 7063629: use cbcond in C2 generated code on T4
kvn
parents: 10252
diff changeset
   691
  inline void cbcond(Condition c, CC cc, Register s1, Register s2, Label& L);
6879f93d268d 7063629: use cbcond in C2 generated code on T4
kvn
parents: 10252
diff changeset
   692
  inline void cbcond(Condition c, CC cc, Register s1, int simm5, Label& L);
6879f93d268d 7063629: use cbcond in C2 generated code on T4
kvn
parents: 10252
diff changeset
   693
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
 protected: // use MacroAssembler::br instead
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
  // pp 138
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
  inline void fb( Condition c, bool a, address d, relocInfo::relocType rt = relocInfo::none );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
  inline void fb( Condition c, bool a, Label& L );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
  // pp 141
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
  inline void fbp( Condition c, bool a, CC cc, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
  inline void fbp( Condition c, bool a, CC cc, Predict p, Label& L );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
  // pp 144
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
  inline void br( Condition c, bool a, address d, relocInfo::relocType rt = relocInfo::none );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
  inline void br( Condition c, bool a, Label& L );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
  // pp 146
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
  inline void bp( Condition c, bool a, CC cc, Predict p, address d, relocInfo::relocType rt = relocInfo::none );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
  inline void bp( Condition c, bool a, CC cc, Predict p, Label& L );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
  // pp 149
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
  inline void call( address d,  relocInfo::relocType rt = relocInfo::runtime_call_type );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
  inline void call( Label& L,   relocInfo::relocType rt = relocInfo::runtime_call_type );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   721
 public:
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   722
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
  // pp 150
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
  // These instructions compare the contents of s2 with the contents of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  // memory at address in s1. If the values are equal, the contents of memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
  // at address s1 is swapped with the data in d. If the values are not equal,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  // the the contents of memory at s1 is loaded into d, without the swap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   730
  void casa(  Register s1, Register s2, Register d, int ia = -1 ) { v9_only();  emit_int32( op(ldst_op) | rd(d) | op3(casa_op3 ) | rs1(s1) | (ia == -1  ? immed(true) : imm_asi(ia)) | rs2(s2)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   731
  void casxa( Register s1, Register s2, Register d, int ia = -1 ) { v9_only();  emit_int32( op(ldst_op) | rd(d) | op3(casxa_op3) | rs1(s1) | (ia == -1  ? immed(true) : imm_asi(ia)) | rs2(s2)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
  // pp 152
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   735
  void udiv(   Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(udiv_op3             ) | rs1(s1) | rs2(s2)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   736
  void udiv(   Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(udiv_op3             ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   737
  void sdiv(   Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sdiv_op3             ) | rs1(s1) | rs2(s2)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   738
  void sdiv(   Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sdiv_op3             ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   739
  void udivcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(udiv_op3 | cc_bit_op3) | rs1(s1) | rs2(s2)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   740
  void udivcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(udiv_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   741
  void sdivcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sdiv_op3 | cc_bit_op3) | rs1(s1) | rs2(s2)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   742
  void sdivcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sdiv_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
  // pp 155
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   746
  void done()  { v9_only();  cti();  emit_int32( op(arith_op) | fcn(0) | op3(done_op3) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   747
  void retry() { v9_only();  cti();  emit_int32( op(arith_op) | fcn(1) | op3(retry_op3) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  // pp 156
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   751
  void fadd( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | fs1(s1, w) | opf(0x40 + w) | fs2(s2, w)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   752
  void fsub( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | fs1(s1, w) | opf(0x44 + w) | fs2(s2, w)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
  // pp 157
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
18097
acd70736bd60 8008407: remove SPARC V8 support
morris
parents: 15116
diff changeset
   756
  void fcmp(  FloatRegisterImpl::Width w, CC cc, FloatRegister s1, FloatRegister s2) { emit_int32( op(arith_op) | cmpcc(cc) | op3(fpop2_op3) | fs1(s1, w) | opf(0x50 + w) | fs2(s2, w)); }
acd70736bd60 8008407: remove SPARC V8 support
morris
parents: 15116
diff changeset
   757
  void fcmpe( FloatRegisterImpl::Width w, CC cc, FloatRegister s1, FloatRegister s2) { emit_int32( op(arith_op) | cmpcc(cc) | op3(fpop2_op3) | fs1(s1, w) | opf(0x54 + w) | fs2(s2, w)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
  // pp 159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   761
  void ftox( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v9_only();  emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(fpop1_op3) | opf(0x80 + w) | fs2(s, w)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   762
  void ftoi( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) {             emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::S) | op3(fpop1_op3) | opf(0xd0 + w) | fs2(s, w)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
  // pp 160
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   766
  void ftof( FloatRegisterImpl::Width sw, FloatRegisterImpl::Width dw, FloatRegister s, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, dw) | op3(fpop1_op3) | opf(0xc0 + sw + dw*4) | fs2(s, sw)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  // pp 161
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   770
  void fxtof( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { v9_only();  emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x80 + w*4) | fs2(s, FloatRegisterImpl::D)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   771
  void fitof( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) {             emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0xc0 + w*4) | fs2(s, FloatRegisterImpl::S)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  // pp 162
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
18097
acd70736bd60 8008407: remove SPARC V8 support
morris
parents: 15116
diff changeset
   775
  void fmov( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x00 + w) | fs2(s, w)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
18097
acd70736bd60 8008407: remove SPARC V8 support
morris
parents: 15116
diff changeset
   777
  void fneg( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x04 + w) | fs2(s, w)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
18097
acd70736bd60 8008407: remove SPARC V8 support
morris
parents: 15116
diff changeset
   779
  void fabs( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x08 + w) | fs2(s, w)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
  // pp 163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   782
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   783
  void fmul( FloatRegisterImpl::Width w,                            FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w)  | op3(fpop1_op3) | fs1(s1, w)  | opf(0x48 + w)         | fs2(s2, w)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   784
  void fmul( FloatRegisterImpl::Width sw, FloatRegisterImpl::Width dw,  FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, dw) | op3(fpop1_op3) | fs1(s1, sw) | opf(0x60 + sw + dw*4) | fs2(s2, sw)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   785
  void fdiv( FloatRegisterImpl::Width w,                            FloatRegister s1, FloatRegister s2, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w)  | op3(fpop1_op3) | fs1(s1, w)  | opf(0x4c + w)         | fs2(s2, w)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
  // pp 164
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   789
  void fsqrt( FloatRegisterImpl::Width w, FloatRegister s, FloatRegister d ) { emit_int32( op(arith_op) | fd(d, w) | op3(fpop1_op3) | opf(0x28 + w) | fs2(s, w)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
  // pp 165
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
  inline void flush( Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
  inline void flush( Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
  // pp 167
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   798
  void flushw() { v9_only();  emit_int32( op(arith_op) | op3(flushw_op3) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  // pp 168
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   802
  void illtrap( int const22a) { if (const22a != 0) v9_only();  emit_int32( op(branch_op) | u_field(const22a, 21, 0) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
  // v8 unimp == illtrap(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
  // pp 169
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   807
  void impdep1( int id1, int const19a ) { v9_only();  emit_int32( op(arith_op) | fcn(id1) | op3(impdep1_op3) | u_field(const19a, 18, 0)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   808
  void impdep2( int id1, int const19a ) { v9_only();  emit_int32( op(arith_op) | fcn(id1) | op3(impdep2_op3) | u_field(const19a, 18, 0)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
  // pp 170
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
  void jmpl( Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
  void jmpl( Register s1, int simm13a, Register d, RelocationHolder const& rspec = RelocationHolder() );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
  // 171
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2534
diff changeset
   817
  inline void ldf(FloatRegisterImpl::Width w, Register s1, Register s2, FloatRegister d);
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2534
diff changeset
   818
  inline void ldf(FloatRegisterImpl::Width w, Register s1, int simm13a, FloatRegister d, RelocationHolder const& rspec = RelocationHolder());
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2534
diff changeset
   819
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
  inline void ldfsr(  Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
  inline void ldfsr(  Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
  inline void ldxfsr( Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
  inline void ldxfsr( Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
  // 173
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   828
  void ldfa(  FloatRegisterImpl::Width w, Register s1, Register s2, int ia, FloatRegister d ) { v9_only();  emit_int32( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3 | alt_bit_op3, w) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   829
  void ldfa(  FloatRegisterImpl::Width w, Register s1, int simm13a,         FloatRegister d ) { v9_only();  emit_int32( op(ldst_op) | fd(d, w) | alt_op3(ldf_op3 | alt_bit_op3, w) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
  // pp 175, lduw is ld on v8
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
  inline void ldsb(  Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
  inline void ldsb(  Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
  inline void ldsh(  Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
  inline void ldsh(  Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
  inline void ldsw(  Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  inline void ldsw(  Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  inline void ldub(  Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
  inline void ldub(  Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  inline void lduh(  Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
  inline void lduh(  Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
  inline void lduw(  Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
  inline void lduw(  Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
  inline void ldx(   Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
  inline void ldx(   Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  inline void ldd(   Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  inline void ldd(   Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
  // pp 177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   852
  void ldsba(  Register s1, Register s2, int ia, Register d ) {             emit_int32( op(ldst_op) | rd(d) | op3(ldsb_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   853
  void ldsba(  Register s1, int simm13a,         Register d ) {             emit_int32( op(ldst_op) | rd(d) | op3(ldsb_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   854
  void ldsha(  Register s1, Register s2, int ia, Register d ) {             emit_int32( op(ldst_op) | rd(d) | op3(ldsh_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   855
  void ldsha(  Register s1, int simm13a,         Register d ) {             emit_int32( op(ldst_op) | rd(d) | op3(ldsh_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   856
  void ldswa(  Register s1, Register s2, int ia, Register d ) { v9_only();  emit_int32( op(ldst_op) | rd(d) | op3(ldsw_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   857
  void ldswa(  Register s1, int simm13a,         Register d ) { v9_only();  emit_int32( op(ldst_op) | rd(d) | op3(ldsw_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   858
  void lduba(  Register s1, Register s2, int ia, Register d ) {             emit_int32( op(ldst_op) | rd(d) | op3(ldub_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   859
  void lduba(  Register s1, int simm13a,         Register d ) {             emit_int32( op(ldst_op) | rd(d) | op3(ldub_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   860
  void lduha(  Register s1, Register s2, int ia, Register d ) {             emit_int32( op(ldst_op) | rd(d) | op3(lduh_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   861
  void lduha(  Register s1, int simm13a,         Register d ) {             emit_int32( op(ldst_op) | rd(d) | op3(lduh_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   862
  void lduwa(  Register s1, Register s2, int ia, Register d ) {             emit_int32( op(ldst_op) | rd(d) | op3(lduw_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   863
  void lduwa(  Register s1, int simm13a,         Register d ) {             emit_int32( op(ldst_op) | rd(d) | op3(lduw_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   864
  void ldxa(   Register s1, Register s2, int ia, Register d ) { v9_only();  emit_int32( op(ldst_op) | rd(d) | op3(ldx_op3  | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   865
  void ldxa(   Register s1, int simm13a,         Register d ) { v9_only();  emit_int32( op(ldst_op) | rd(d) | op3(ldx_op3  | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
  // pp 181
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   869
  void and3(    Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(and_op3              ) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   870
  void and3(    Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(and_op3              ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   871
  void andcc(   Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(and_op3  | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   872
  void andcc(   Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(and_op3  | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   873
  void andn(    Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(andn_op3             ) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   874
  void andn(    Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(andn_op3             ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   875
  void andncc(  Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(andn_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   876
  void andncc(  Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(andn_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   877
  void or3(     Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(or_op3               ) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   878
  void or3(     Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(or_op3               ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   879
  void orcc(    Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(or_op3   | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   880
  void orcc(    Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(or_op3   | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   881
  void orn(     Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(orn_op3) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   882
  void orn(     Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(orn_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   883
  void orncc(   Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(orn_op3  | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   884
  void orncc(   Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(orn_op3  | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   885
  void xor3(    Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xor_op3              ) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   886
  void xor3(    Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xor_op3              ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   887
  void xorcc(   Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xor_op3  | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   888
  void xorcc(   Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xor_op3  | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   889
  void xnor(    Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xnor_op3             ) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   890
  void xnor(    Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xnor_op3             ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   891
  void xnorcc(  Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xnor_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   892
  void xnorcc(  Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(xnor_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  // pp 183
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   896
  void membar( Membar_mask_bits const7a ) { v9_only(); emit_int32( op(arith_op) | op3(membar_op3) | rs1(O7) | immed(true) | u_field( int(const7a), 6, 0)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
  // pp 185
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   900
  void fmov( FloatRegisterImpl::Width w, Condition c,  bool floatCC, CC cca, FloatRegister s2, FloatRegister d ) { v9_only();  emit_int32( op(arith_op) | fd(d, w) | op3(fpop2_op3) | cond_mov(c) | opf_cc(cca, floatCC) | opf_low6(w) | fs2(s2, w)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
  // pp 189
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   904
  void fmov( FloatRegisterImpl::Width w, RCondition c, Register s1,  FloatRegister s2, FloatRegister d ) { v9_only();  emit_int32( op(arith_op) | fd(d, w) | op3(fpop2_op3) | rs1(s1) | rcond(c) | opf_low5(4 + w) | fs2(s2, w)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
  // pp 191
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   908
  void movcc( Condition c, bool floatCC, CC cca, Register s2, Register d ) { v9_only();  emit_int32( op(arith_op) | rd(d) | op3(movcc_op3) | mov_cc(cca, floatCC) | cond_mov(c) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   909
  void movcc( Condition c, bool floatCC, CC cca, int simm11a, Register d ) { v9_only();  emit_int32( op(arith_op) | rd(d) | op3(movcc_op3) | mov_cc(cca, floatCC) | cond_mov(c) | immed(true) | simm(simm11a, 11) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
  // pp 195
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   913
  void movr( RCondition c, Register s1, Register s2,  Register d ) { v9_only();  emit_int32( op(arith_op) | rd(d) | op3(movr_op3) | rs1(s1) | rcond(c) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   914
  void movr( RCondition c, Register s1, int simm10a,  Register d ) { v9_only();  emit_int32( op(arith_op) | rd(d) | op3(movr_op3) | rs1(s1) | rcond(c) | immed(true) | simm(simm10a, 10) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
  // pp 196
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   918
  void mulx(  Register s1, Register s2, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(mulx_op3 ) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   919
  void mulx(  Register s1, int simm13a, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(mulx_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   920
  void sdivx( Register s1, Register s2, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(sdivx_op3) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   921
  void sdivx( Register s1, int simm13a, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(sdivx_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   922
  void udivx( Register s1, Register s2, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(udivx_op3) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   923
  void udivx( Register s1, int simm13a, Register d ) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(udivx_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
  // pp 197
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   927
  void umul(   Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(umul_op3             ) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   928
  void umul(   Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(umul_op3             ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   929
  void smul(   Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(smul_op3             ) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   930
  void smul(   Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(smul_op3             ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   931
  void umulcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(umul_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   932
  void umulcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(umul_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   933
  void smulcc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(smul_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   934
  void smulcc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(smul_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  // pp 201
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   938
  void nop() { emit_int32( op(branch_op) | op2(sethi_op2) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
  // pp 202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   943
  void popc( Register s,  Register d) { v9_only();  emit_int32( op(arith_op) | rd(d) | op3(popc_op3) | rs2(s)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   944
  void popc( int simm13a, Register d) { v9_only();  emit_int32( op(arith_op) | rd(d) | op3(popc_op3) | immed(true) | simm(simm13a, 13)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
  // pp 203
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   948
  void prefetch(   Register s1, Register s2, PrefetchFcn f) { v9_only();  emit_int32( op(ldst_op) | fcn(f) | op3(prefetch_op3) | rs1(s1) | rs2(s2) ); }
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents: 13969
diff changeset
   949
  void prefetch(   Register s1, int simm13a, PrefetchFcn f) { v9_only();  emit_data( op(ldst_op) | fcn(f) | op3(prefetch_op3) | rs1(s1) | immed(true) | simm(simm13a, 13)); }
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents: 13969
diff changeset
   950
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   951
  void prefetcha(  Register s1, Register s2, int ia, PrefetchFcn f ) { v9_only();  emit_int32( op(ldst_op) | fcn(f) | op3(prefetch_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   952
  void prefetcha(  Register s1, int simm13a,         PrefetchFcn f ) { v9_only();  emit_int32( op(ldst_op) | fcn(f) | op3(prefetch_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
  // pp 208
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
  // not implementing read privileged register
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   958
  inline void rdy(    Register d) { v9_dep();  emit_int32( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(0, 18, 14)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   959
  inline void rdccr(  Register d) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(2, 18, 14)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   960
  inline void rdasi(  Register d) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(3, 18, 14)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   961
  inline void rdtick( Register d) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(4, 18, 14)); } // Spoon!
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   962
  inline void rdpc(   Register d) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(5, 18, 14)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   963
  inline void rdfprs( Register d) { v9_only(); emit_int32( op(arith_op) | rd(d) | op3(rdreg_op3) | u_field(6, 18, 14)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
  // pp 213
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
  inline void rett( Register s1, Register s2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
  inline void rett( Register s1, int simm13a, relocInfo::relocType rt = relocInfo::none);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
  // pp 214
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   972
  void save(    Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(save_op3) | rs1(s1) | rs2(s2) ); }
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 371
diff changeset
   973
  void save(    Register s1, int simm13a, Register d ) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 371
diff changeset
   974
    // make sure frame is at least large enough for the register save area
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 371
diff changeset
   975
    assert(-simm13a >= 16 * wordSize, "frame too small");
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   976
    emit_int32( op(arith_op) | rd(d) | op3(save_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) );
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 371
diff changeset
   977
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   979
  void restore( Register s1 = G0,  Register s2 = G0, Register d = G0 ) { emit_int32( op(arith_op) | rd(d) | op3(restore_op3) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   980
  void restore( Register s1,       int simm13a,      Register d      ) { emit_int32( op(arith_op) | rd(d) | op3(restore_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
  // pp 216
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   984
  void saved()    { v9_only();  emit_int32( op(arith_op) | fcn(0) | op3(saved_op3)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   985
  void restored() { v9_only();  emit_int32( op(arith_op) | fcn(1) | op3(saved_op3)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
  // pp 217
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
  inline void sethi( int imm22a, Register d, RelocationHolder const& rspec = RelocationHolder() );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
  // pp 218
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   992
  void sll(  Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(0) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   993
  void sll(  Register s1, int imm5a,   Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(0) | immed(true) | u_field(imm5a, 4, 0) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   994
  void srl(  Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(0) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   995
  void srl(  Register s1, int imm5a,   Register d ) { emit_int32( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(0) | immed(true) | u_field(imm5a, 4, 0) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   996
  void sra(  Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(0) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   997
  void sra(  Register s1, int imm5a,   Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(0) | immed(true) | u_field(imm5a, 4, 0) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   999
  void sllx( Register s1, Register s2, Register d ) { v9_only();  emit_int32( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1000
  void sllx( Register s1, int imm6a,   Register d ) { v9_only();  emit_int32( op(arith_op) | rd(d) | op3(sll_op3) | rs1(s1) | sx(1) | immed(true) | u_field(imm6a, 5, 0) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1001
  void srlx( Register s1, Register s2, Register d ) { v9_only();  emit_int32( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1002
  void srlx( Register s1, int imm6a,   Register d ) { v9_only();  emit_int32( op(arith_op) | rd(d) | op3(srl_op3) | rs1(s1) | sx(1) | immed(true) | u_field(imm6a, 5, 0) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1003
  void srax( Register s1, Register s2, Register d ) { v9_only();  emit_int32( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1004
  void srax( Register s1, int imm6a,   Register d ) { v9_only();  emit_int32( op(arith_op) | rd(d) | op3(sra_op3) | rs1(s1) | sx(1) | immed(true) | u_field(imm6a, 5, 0) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
  // pp 220
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1008
  void sir( int simm13a ) { emit_int32( op(arith_op) | fcn(15) | op3(sir_op3) | immed(true) | simm(simm13a, 13)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
  // pp 221
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1012
  void stbar() { emit_int32( op(arith_op) | op3(membar_op3) | u_field(15, 18, 14)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
  // pp 222
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
4009
8731c367fa98 6879902: CTW failure jdk6_18/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp:845
twisti
parents: 3905
diff changeset
  1016
  inline void stf(    FloatRegisterImpl::Width w, FloatRegister d, Register s1, Register s2);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
  inline void stf(    FloatRegisterImpl::Width w, FloatRegister d, Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
  inline void stfsr(  Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
  inline void stfsr(  Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
  inline void stxfsr( Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
  inline void stxfsr( Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
  //  pp 224
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1026
  void stfa(  FloatRegisterImpl::Width w, FloatRegister d, Register s1, Register s2, int ia ) { v9_only();  emit_int32( op(ldst_op) | fd(d, w) | alt_op3(stf_op3 | alt_bit_op3, w) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1027
  void stfa(  FloatRegisterImpl::Width w, FloatRegister d, Register s1, int simm13a         ) { v9_only();  emit_int32( op(ldst_op) | fd(d, w) | alt_op3(stf_op3 | alt_bit_op3, w) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
  // p 226
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
  inline void stb(  Register d, Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
  inline void stb(  Register d, Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
  inline void sth(  Register d, Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  inline void sth(  Register d, Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
  inline void stw(  Register d, Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
  inline void stw(  Register d, Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
  inline void stx(  Register d, Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
  inline void stx(  Register d, Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
  inline void std(  Register d, Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  inline void std(  Register d, Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
  // pp 177
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1044
  void stba(  Register d, Register s1, Register s2, int ia ) {             emit_int32( op(ldst_op) | rd(d) | op3(stb_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1045
  void stba(  Register d, Register s1, int simm13a         ) {             emit_int32( op(ldst_op) | rd(d) | op3(stb_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1046
  void stha(  Register d, Register s1, Register s2, int ia ) {             emit_int32( op(ldst_op) | rd(d) | op3(sth_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1047
  void stha(  Register d, Register s1, int simm13a         ) {             emit_int32( op(ldst_op) | rd(d) | op3(sth_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1048
  void stwa(  Register d, Register s1, Register s2, int ia ) {             emit_int32( op(ldst_op) | rd(d) | op3(stw_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1049
  void stwa(  Register d, Register s1, int simm13a         ) {             emit_int32( op(ldst_op) | rd(d) | op3(stw_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1050
  void stxa(  Register d, Register s1, Register s2, int ia ) { v9_only();  emit_int32( op(ldst_op) | rd(d) | op3(stx_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1051
  void stxa(  Register d, Register s1, int simm13a         ) { v9_only();  emit_int32( op(ldst_op) | rd(d) | op3(stx_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1052
  void stda(  Register d, Register s1, Register s2, int ia ) {             emit_int32( op(ldst_op) | rd(d) | op3(std_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1053
  void stda(  Register d, Register s1, int simm13a         ) {             emit_int32( op(ldst_op) | rd(d) | op3(std_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
  // pp 230
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1057
  void sub(    Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sub_op3              ) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1058
  void sub(    Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sub_op3              ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
7433
b418028612ad 6961690: load oops from constant table on SPARC
twisti
parents: 7427
diff changeset
  1059
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1060
  void subcc(  Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sub_op3 | cc_bit_op3 ) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1061
  void subcc(  Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(sub_op3 | cc_bit_op3 ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1062
  void subc(   Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(subc_op3             ) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1063
  void subc(   Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(subc_op3             ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1064
  void subccc( Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(subc_op3 | cc_bit_op3) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1065
  void subccc( Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(subc_op3 | cc_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
  // pp 231
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
  inline void swap( Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
  inline void swap( Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
  // pp 232
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1074
  void swapa(   Register s1, Register s2, int ia, Register d ) { v9_dep();  emit_int32( op(ldst_op) | rd(d) | op3(swap_op3 | alt_bit_op3) | rs1(s1) | imm_asi(ia) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1075
  void swapa(   Register s1, int simm13a,         Register d ) { v9_dep();  emit_int32( op(ldst_op) | rd(d) | op3(swap_op3 | alt_bit_op3) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
  // pp 234, note op in book is wrong, see pp 268
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1079
  void taddcc(    Register s1, Register s2, Register d ) {            emit_int32( op(arith_op) | rd(d) | op3(taddcc_op3  ) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1080
  void taddcc(    Register s1, int simm13a, Register d ) {            emit_int32( op(arith_op) | rd(d) | op3(taddcc_op3  ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
  // pp 235
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1084
  void tsubcc(    Register s1, Register s2, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(tsubcc_op3  ) | rs1(s1) | rs2(s2) ); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1085
  void tsubcc(    Register s1, int simm13a, Register d ) { emit_int32( op(arith_op) | rd(d) | op3(tsubcc_op3  ) | rs1(s1) | immed(true) | simm(simm13a, 13) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
  // pp 237
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
18097
acd70736bd60 8008407: remove SPARC V8 support
morris
parents: 15116
diff changeset
  1089
  void trap( Condition c, CC cc, Register s1, Register s2 ) { emit_int32( op(arith_op) | cond(c) | op3(trap_op3) | rs1(s1) | trapcc(cc) | rs2(s2)); }
acd70736bd60 8008407: remove SPARC V8 support
morris
parents: 15116
diff changeset
  1090
  void trap( Condition c, CC cc, Register s1, int trapa   ) { emit_int32( op(arith_op) | cond(c) | op3(trap_op3) | rs1(s1) | trapcc(cc) | immed(true) | u_field(trapa, 6, 0)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
  // simple uncond. trap
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
  void trap( int trapa ) { trap( always, icc, G0, trapa ); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
  // pp 239 omit write priv register for now
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1096
  inline void wry(    Register d) { v9_dep();  emit_int32( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(0, 29, 25)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1097
  inline void wrccr(Register s) { v9_only(); emit_int32( op(arith_op) | rs1(s) | op3(wrreg_op3) | u_field(2, 29, 25)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1098
  inline void wrccr(Register s, int simm13a) { v9_only(); emit_int32( op(arith_op) |
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
                                                                           rs1(s) |
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
                                                                           op3(wrreg_op3) |
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
                                                                           u_field(2, 29, 25) |
10501
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 10267
diff changeset
  1102
                                                                           immed(true) |
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
                                                                           simm(simm13a, 13)); }
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1104
  inline void wrasi(Register d) { v9_only(); emit_int32( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(3, 29, 25)); }
10501
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 10267
diff changeset
  1105
  // wrasi(d, imm) stores (d xor imm) to asi
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1106
  inline void wrasi(Register d, int simm13a) { v9_only(); emit_int32( op(arith_op) | rs1(d) | op3(wrreg_op3) |
10501
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 10267
diff changeset
  1107
                                               u_field(3, 29, 25) | immed(true) | simm(simm13a, 13)); }
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1108
  inline void wrfprs( Register d) { v9_only(); emit_int32( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(6, 29, 25)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
10027
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
  1110
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
  1111
  // VIS3 instructions
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
  1112
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1113
  void movstosw( FloatRegister s, Register d ) { vis3_only();  emit_int32( op(arith_op) | rd(d) | op3(mftoi_op3) | opf(mstosw_opf) | fs2(s, FloatRegisterImpl::S)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1114
  void movstouw( FloatRegister s, Register d ) { vis3_only();  emit_int32( op(arith_op) | rd(d) | op3(mftoi_op3) | opf(mstouw_opf) | fs2(s, FloatRegisterImpl::S)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1115
  void movdtox(  FloatRegister s, Register d ) { vis3_only();  emit_int32( op(arith_op) | rd(d) | op3(mftoi_op3) | opf(mdtox_opf) | fs2(s, FloatRegisterImpl::D)); }
10027
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
  1116
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1117
  void movwtos( Register s, FloatRegister d ) { vis3_only();  emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::S) | op3(mftoi_op3) | opf(mwtos_opf) | rs2(s)); }
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1118
  void movxtod( Register s, FloatRegister d ) { vis3_only();  emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(mftoi_op3) | opf(mxtod_opf) | rs2(s)); }
10027
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
  1119
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
  // Creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
  Assembler(CodeBuffer* code) : AbstractAssembler(code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
#ifdef CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
    delay_state = no_delay;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7112
diff changeset
  1128
#endif // CPU_SPARC_VM_ASSEMBLER_SPARC_HPP