hotspot/src/cpu/sparc/vm/assembler_sparc.hpp
author kvn
Mon, 29 Jun 2015 00:10:01 -0700
changeset 31515 6aed85dadbe6
parent 31404 63e8fcd70bfc
child 33105 294e48b4f704
permissions -rw-r--r--
8073583: C2 support for CRC32C on SPARC Reviewed-by: jrose, kvn Contributed-by: james.cheng@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
31404
63e8fcd70bfc 8073108: Use x86 and SPARC CPU instructions for GHASH acceleration
ascarpino
parents: 24953
diff changeset
     2
 * Copyright (c) 1997, 2015, 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,
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
    91
    aes4_op3     = 0x19,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
    umulcc_op3   = 0x1a,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
    smulcc_op3   = 0x1b,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
    subccc_op3   = 0x1c,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
    udivcc_op3   = 0x1e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
    sdivcc_op3   = 0x1f,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
    taddcc_op3   = 0x20,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
    tsubcc_op3   = 0x21,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
    taddcctv_op3 = 0x22,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
    tsubcctv_op3 = 0x23,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
    mulscc_op3   = 0x24,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
    sll_op3      = 0x25,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
    sllx_op3     = 0x25,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
    srl_op3      = 0x26,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
    srlx_op3     = 0x26,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
    sra_op3      = 0x27,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
    srax_op3     = 0x27,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
    rdreg_op3    = 0x28,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
    membar_op3   = 0x28,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
    flushw_op3   = 0x2b,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
    movcc_op3    = 0x2c,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
    sdivx_op3    = 0x2d,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
    popc_op3     = 0x2e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
    movr_op3     = 0x2f,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
    sir_op3      = 0x30,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
    wrreg_op3    = 0x30,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
    saved_op3    = 0x31,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
    fpop1_op3    = 0x34,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    fpop2_op3    = 0x35,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
    impdep1_op3  = 0x36,
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   125
    aes3_op3     = 0x36,
24953
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
   126
    sha_op3      = 0x36,
24328
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   127
    alignaddr_op3  = 0x36,
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   128
    faligndata_op3 = 0x36,
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   129
    flog3_op3    = 0x36,
24328
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   130
    edge_op3     = 0x36,
31515
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
   131
    fzero_op3    = 0x36,
24328
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   132
    fsrc_op3     = 0x36,
31515
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
   133
    fnot_op3     = 0x36,
31404
63e8fcd70bfc 8073108: Use x86 and SPARC CPU instructions for GHASH acceleration
ascarpino
parents: 24953
diff changeset
   134
    xmulx_op3    = 0x36,
31515
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
   135
    crc32c_op3   = 0x36,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    impdep2_op3  = 0x37,
24328
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   137
    stpartialf_op3 = 0x37,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    jmpl_op3     = 0x38,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    rett_op3     = 0x39,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
    trap_op3     = 0x3a,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
    flush_op3    = 0x3b,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    save_op3     = 0x3c,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
    restore_op3  = 0x3d,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
    done_op3     = 0x3e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
    retry_op3    = 0x3e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
    lduw_op3     = 0x00,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
    ldub_op3     = 0x01,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
    lduh_op3     = 0x02,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
    ldd_op3      = 0x03,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
    stw_op3      = 0x04,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
    stb_op3      = 0x05,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
    sth_op3      = 0x06,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
    std_op3      = 0x07,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
    ldsw_op3     = 0x08,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
    ldsb_op3     = 0x09,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    ldsh_op3     = 0x0a,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
    ldx_op3      = 0x0b,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
    stx_op3      = 0x0e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
    swap_op3     = 0x0f,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
    stwa_op3     = 0x14,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
    stxa_op3     = 0x1e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
    ldf_op3      = 0x20,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
    ldfsr_op3    = 0x21,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
    ldqf_op3     = 0x22,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
    lddf_op3     = 0x23,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
    stf_op3      = 0x24,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
    stfsr_op3    = 0x25,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
    stqf_op3     = 0x26,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
    stdf_op3     = 0x27,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
    prefetch_op3 = 0x2d,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
    casa_op3     = 0x3c,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
    casxa_op3    = 0x3e,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
10027
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   180
    mftoi_op3    = 0x36,
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   181
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
    alt_bit_op3  = 0x10,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
     cc_bit_op3  = 0x10
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  enum opfs {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
    // selected opfs
24328
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   188
    edge8n_opf         = 0x01,
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   189
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   190
    fmovs_opf          = 0x01,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   191
    fmovd_opf          = 0x02,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   193
    fnegs_opf          = 0x05,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   194
    fnegd_opf          = 0x06,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
24328
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   196
    alignaddr_opf      = 0x18,
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   197
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   198
    fadds_opf          = 0x41,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   199
    faddd_opf          = 0x42,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   200
    fsubs_opf          = 0x45,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   201
    fsubd_opf          = 0x46,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
24328
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   203
    faligndata_opf     = 0x48,
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   204
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   205
    fmuls_opf          = 0x49,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   206
    fmuld_opf          = 0x4a,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   207
    fdivs_opf          = 0x4d,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   208
    fdivd_opf          = 0x4e,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   209
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   210
    fcmps_opf          = 0x51,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   211
    fcmpd_opf          = 0x52,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   213
    fstox_opf          = 0x81,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   214
    fdtox_opf          = 0x82,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   215
    fxtos_opf          = 0x84,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   216
    fxtod_opf          = 0x88,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   217
    fitos_opf          = 0xc4,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   218
    fdtos_opf          = 0xc6,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   219
    fitod_opf          = 0xc8,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   220
    fstod_opf          = 0xc9,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   221
    fstoi_opf          = 0xd1,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   222
    fdtoi_opf          = 0xd2,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   224
    mdtox_opf          = 0x110,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   225
    mstouw_opf         = 0x111,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   226
    mstosw_opf         = 0x113,
31404
63e8fcd70bfc 8073108: Use x86 and SPARC CPU instructions for GHASH acceleration
ascarpino
parents: 24953
diff changeset
   227
    xmulx_opf          = 0x115,
63e8fcd70bfc 8073108: Use x86 and SPARC CPU instructions for GHASH acceleration
ascarpino
parents: 24953
diff changeset
   228
    xmulxhi_opf        = 0x116,
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   229
    mxtod_opf          = 0x118,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   230
    mwtos_opf          = 0x119,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   231
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   232
    aes_kexpand0_opf   = 0x130,
24953
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
   233
    aes_kexpand2_opf   = 0x131,
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
   234
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
   235
    sha1_opf           = 0x141,
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
   236
    sha256_opf         = 0x142,
31515
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
   237
    sha512_opf         = 0x143,
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
   238
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
   239
    crc32c_opf         = 0x147
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   240
  };
10027
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   241
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   242
  enum op5s {
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   243
    aes_eround01_op5     = 0x00,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   244
    aes_eround23_op5     = 0x01,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   245
    aes_dround01_op5     = 0x02,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   246
    aes_dround23_op5     = 0x03,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   247
    aes_eround01_l_op5   = 0x04,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   248
    aes_eround23_l_op5   = 0x05,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   249
    aes_dround01_l_op5   = 0x06,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   250
    aes_dround23_l_op5   = 0x07,
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   251
    aes_kexpand1_op5     = 0x08
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   254
  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
   255
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  enum Condition {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
     // for FBfcc & FBPfcc instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
    f_never                     = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
    f_notEqual                  = 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
    f_notZero                   = 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
    f_lessOrGreater             = 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
    f_unorderedOrLess           = 3,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
    f_less                      = 4,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
    f_unorderedOrGreater        = 5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
    f_greater                   = 6,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
    f_unordered                 = 7,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
    f_always                    = 8,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
    f_equal                     = 9,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
    f_zero                      = 9,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    f_unorderedOrEqual          = 10,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    f_greaterOrEqual            = 11,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
    f_unorderedOrGreaterOrEqual = 12,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    f_lessOrEqual               = 13,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
    f_unorderedOrLessOrEqual    = 14,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
    f_ordered                   = 15,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
    // V8 coproc, pp 123 v8 manual
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
    cp_always  = 8,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
    cp_never   = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
    cp_3       = 7,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
    cp_2       = 6,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
    cp_2or3    = 5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
    cp_1       = 4,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
    cp_1or3    = 3,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
    cp_1or2    = 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
    cp_1or2or3 = 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
    cp_0       = 9,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
    cp_0or3    = 10,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
    cp_0or2    = 11,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
    cp_0or2or3 = 12,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
    cp_0or1    = 13,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
    cp_0or1or3 = 14,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
    cp_0or1or2 = 15,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
    // for integers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
    never                 =  0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
    equal                 =  1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
    zero                  =  1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
    lessEqual             =  2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
    less                  =  3,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
    lessEqualUnsigned     =  4,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
    lessUnsigned          =  5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
    carrySet              =  5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
    negative              =  6,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
    overflowSet           =  7,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
    always                =  8,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
    notEqual              =  9,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
    notZero               =  9,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
    greater               =  10,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
    greaterEqual          =  11,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
    greaterUnsigned       =  12,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
    greaterEqualUnsigned  =  13,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
    carryClear            =  13,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
    positive              =  14,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
    overflowClear         =  15
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  enum CC {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
    icc  = 0,  xcc  = 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
    // ptr_cc is the correct condition code for a pointer or intptr_t:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
    ptr_cc = NOT_LP64(icc) LP64_ONLY(xcc),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    fcc0 = 0,  fcc1 = 1, fcc2 = 2, fcc3 = 3
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  enum PrefetchFcn {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    severalReads = 0,  oneRead = 1,  severalWritesAndPossiblyReads = 2, oneWrite = 3, page = 4
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  // Helper functions for groups of instructions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  enum Predict { pt = 1, pn = 0 }; // pt = predict taken
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
  enum Membar_mask_bits { // page 184, v9
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
    StoreStore = 1 << 3,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
    LoadStore  = 1 << 2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
    StoreLoad  = 1 << 1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
    LoadLoad   = 1 << 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
    Sync       = 1 << 6,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
    MemIssue   = 1 << 5,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
    Lookaside  = 1 << 4
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
7892
ff4948f95c49 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 7700
diff changeset
   348
  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
   349
    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
   350
    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
   351
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   353
  address target_distance(Label& L) {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   354
    // Assembler::target(L) should be called only when
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   355
    // a branch instruction is emitted since non-bound
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   356
    // labels record current pc() as a branch address.
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   357
    if (L.is_bound()) return target(L);
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   358
    // Return current address for non-bound labels.
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   359
    return pc();
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   360
  }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   361
6774
a224d6a24120 6991512: G1 barriers fail with 64bit C1
iveresov
parents: 6772
diff changeset
   362
  // test if label is in simm16 range in words (wdisp16).
a224d6a24120 6991512: G1 barriers fail with 64bit C1
iveresov
parents: 6772
diff changeset
   363
  bool is_in_wdisp16_range(Label& L) {
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   364
    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
   365
  }
ff4948f95c49 7011627: C1: call_RT must support targets that don't fit in wdisp30
iveresov
parents: 7700
diff changeset
   366
  // 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
   367
  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
   368
    return is_in_wdisp_range(a, b, 30);
6774
a224d6a24120 6991512: G1 barriers fail with 64bit C1
iveresov
parents: 6772
diff changeset
   369
  }
a224d6a24120 6991512: G1 barriers fail with 64bit C1
iveresov
parents: 6772
diff changeset
   370
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  enum ASIs { // page 72, v9
10501
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 10267
diff changeset
   372
    ASI_PRIMARY            = 0x80,
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 10267
diff changeset
   373
    ASI_PRIMARY_NOFAULT    = 0x82,
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 10267
diff changeset
   374
    ASI_PRIMARY_LITTLE     = 0x88,
24328
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   375
    // 8x8-bit partial store
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   376
    ASI_PST8_PRIMARY       = 0xC0,
10267
8bdeec886dc4 7079329: Adjust allocation prefetching for T4
kvn
parents: 10264
diff changeset
   377
    // Block initializing store
8bdeec886dc4 7079329: Adjust allocation prefetching for T4
kvn
parents: 10264
diff changeset
   378
    ASI_ST_BLKINIT_PRIMARY = 0xE2,
8bdeec886dc4 7079329: Adjust allocation prefetching for T4
kvn
parents: 10264
diff changeset
   379
    // Most-Recently-Used (MRU) BIS variant
8bdeec886dc4 7079329: Adjust allocation prefetching for T4
kvn
parents: 10264
diff changeset
   380
    ASI_ST_BLKINIT_MRU_PRIMARY = 0xF2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
    // add more from book as needed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  // helpers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  // x is supposed to fit in a field "nbits" wide
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
  // and be sign-extended. Check the range.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
  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
   391
    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
   392
           err_msg("value out of range: x=" INTPTR_FORMAT ", nbits=%d", x, nbits));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  static void assert_signed_word_disp_range(intptr_t x, int nbits) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
    assert( (x & 3) == 0, "not word aligned");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
    assert_signed_range(x, nbits + 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  static void assert_unsigned_const(int x, int nbits) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
    assert( juint(x)  <  juint(1 << nbits), "unsigned constant out of range");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
  // fields: note bits numbered from LSB = 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
  //  fields known by inclusive bit range
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
  static int fmask(juint hi_bit, juint lo_bit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
    assert( hi_bit >= lo_bit  &&  0 <= lo_bit  &&  hi_bit < 32, "bad bits");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
    return (1 << ( hi_bit-lo_bit + 1 )) - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  // inverse of u_field
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
  static int inv_u_field(int x, int hi_bit, int lo_bit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
    juint r = juint(x) >> lo_bit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
    r &= fmask( hi_bit, lo_bit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
    return int(r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  // signed version: extract from field and sign-extend
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  static int inv_s_field(int x, int hi_bit, int lo_bit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
    int sign_shift = 31 - hi_bit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
    return inv_u_field( ((x << sign_shift) >> sign_shift), hi_bit, lo_bit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  // given a field that ranges from hi_bit to lo_bit (inclusive,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
  // LSB = 0), and an unsigned value for the field,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  // shift it into the field
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  static int u_field(int x, int hi_bit, int lo_bit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
    assert( ( x & ~fmask(hi_bit, lo_bit))  == 0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
            "value out of range");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
    int r = x << lo_bit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
    assert( inv_u_field(r, hi_bit, lo_bit) == x, "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
    return r;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  // make sure this is inlined as it will reduce code size significantly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  #define u_field(x, hi_bit, lo_bit)   ((x) << (lo_bit))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  static int inv_op(  int x ) { return inv_u_field(x, 31, 30); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  static int inv_op2( int x ) { return inv_u_field(x, 24, 22); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  static int inv_op3( int x ) { return inv_u_field(x, 24, 19); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
  static int inv_cond( int x ){ return inv_u_field(x, 28, 25); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  static bool inv_immed( int x ) { return (x & Assembler::immed(true)) != 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
  static Register inv_rd(  int x ) { return as_Register(inv_u_field(x, 29, 25)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  static Register inv_rs1( int x ) { return as_Register(inv_u_field(x, 18, 14)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  static Register inv_rs2( int x ) { return as_Register(inv_u_field(x,  4,  0)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  static int op(       int         x)  { return  u_field(x,             31, 30); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  static int rd(       Register    r)  { return  u_field(r->encoding(), 29, 25); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  static int fcn(      int         x)  { return  u_field(x,             29, 25); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  static int op3(      int         x)  { return  u_field(x,             24, 19); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  static int rs1(      Register    r)  { return  u_field(r->encoding(), 18, 14); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  static int rs2(      Register    r)  { return  u_field(r->encoding(),  4,  0); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  static int annul(    bool        a)  { return  u_field(a ? 1 : 0,     29, 29); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
  static int cond(     int         x)  { return  u_field(x,             28, 25); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  static int cond_mov( int         x)  { return  u_field(x,             17, 14); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  static int rcond(    RCondition  x)  { return  u_field(x,             12, 10); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  static int op2(      int         x)  { return  u_field(x,             24, 22); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  static int predict(  bool        p)  { return  u_field(p ? 1 : 0,     19, 19); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
  static int branchcc( CC       fcca)  { return  u_field(fcca,          21, 20); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  static int cmpcc(    CC       fcca)  { return  u_field(fcca,          26, 25); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
  static int imm_asi(  int         x)  { return  u_field(x,             12,  5); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  static int immed(    bool        i)  { return  u_field(i ? 1 : 0,     13, 13); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
  static int opf_low6( int         w)  { return  u_field(w,             10,  5); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  static int opf_low5( int         w)  { return  u_field(w,              9,  5); }
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   474
  static int op5(      int         x)  { return  u_field(x,              8,  5); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  static int trapcc(   CC         cc)  { return  u_field(cc,            12, 11); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  static int sx(       int         i)  { return  u_field(i,             12, 12); } // shift x=1 means 64-bit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
  static int opf(      int         x)  { return  u_field(x,             13,  5); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   479
  static bool is_cbcond( int x ) {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   480
    return (VM_Version::has_cbcond() && (inv_cond(x) > rc_last) &&
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   481
            inv_op(x) == branch_op && inv_op2(x) == bpr_op2);
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   482
  }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   483
  static bool is_cxb( int x ) {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   484
    assert(is_cbcond(x), "wrong instruction");
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   485
    return (x & (1<<21)) != 0;
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   486
  }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   487
  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
   488
  static int inv_cond_cbcond(int      x)  {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   489
    assert(is_cbcond(x), "wrong instruction");
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   490
    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
   491
  }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   492
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  static int opf_cc(   CC          c, bool useFloat ) { return u_field((useFloat ? 0 : 4) + c, 13, 11); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  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
   495
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  static int fd( FloatRegister r,  FloatRegisterImpl::Width fwa) { return u_field(r->encoding(fwa), 29, 25); };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  static int fs1(FloatRegister r,  FloatRegisterImpl::Width fwa) { return u_field(r->encoding(fwa), 18, 14); };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  static int fs2(FloatRegister r,  FloatRegisterImpl::Width fwa) { return u_field(r->encoding(fwa),  4,  0); };
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   499
  static int fs3(FloatRegister r,  FloatRegisterImpl::Width fwa) { return u_field(r->encoding(fwa), 13,  9); };
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  // some float instructions use this encoding on the op3 field
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  static int alt_op3(int op, FloatRegisterImpl::Width w) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
    int r;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
    switch(w) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
     case FloatRegisterImpl::S: r = op + 0;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
     case FloatRegisterImpl::D: r = op + 3;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
     case FloatRegisterImpl::Q: r = op + 2;  break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
     default: ShouldNotReachHere(); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
    return op3(r);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  // compute inverse of simm
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  static int inv_simm(int x, int nbits) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
    return (int)(x << (32 - nbits)) >> (32 - nbits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  static int inv_simm13( int x ) { return inv_simm(x, 13); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
  // signed immediate, in low bits, nbits long
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
  static int simm(int x, int nbits) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
    assert_signed_range(x, nbits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
    return x  &  (( 1 << nbits ) - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
  // compute inverse of wdisp16
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  static intptr_t inv_wdisp16(int x, intptr_t pos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
    int lo = x & (( 1 << 14 ) - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
    int hi = (x >> 20) & 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
    if (hi >= 2) hi |= ~1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
    return (((hi << 14) | lo) << 2) + pos;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  // word offset, 14 bits at LSend, 2 bits at B21, B20
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  static int wdisp16(intptr_t x, intptr_t off) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
    intptr_t xx = x - off;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
    assert_signed_word_disp_range(xx, 16);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
    int r =  (xx >> 2) & ((1 << 14) - 1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
           |  (  ( (xx>>(2+14)) & 3 )  <<  20 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
    assert( inv_wdisp16(r, off) == x,  "inverse is not inverse");
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
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   545
  // compute inverse of wdisp10
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   546
  static intptr_t inv_wdisp10(int x, intptr_t pos) {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   547
    assert(is_cbcond(x), "wrong instruction");
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   548
    int lo = inv_u_field(x, 12, 5);
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   549
    int hi = (x >> 19) & 3;
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   550
    if (hi >= 2) hi |= ~1;
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   551
    return (((hi << 8) | lo) << 2) + pos;
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   552
  }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   553
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   554
  // 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
   555
  static int wdisp10(intptr_t x, intptr_t off) {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   556
    assert(VM_Version::has_cbcond(), "This CPU does not have CBCOND instruction");
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   557
    intptr_t xx = x - off;
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   558
    assert_signed_word_disp_range(xx, 10);
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   559
    int r =  ( ( (xx >>  2   ) & ((1 << 8) - 1) ) <<  5 )
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   560
           | ( ( (xx >> (2+8)) & 3              ) << 19 );
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   561
    // Have to fake cbcond instruction to pass assert in inv_wdisp10()
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   562
    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
   563
    return r;
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   564
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  // word displacement in low-order nbits bits
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
  static intptr_t inv_wdisp( int x, intptr_t pos, int nbits ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
    int pre_sign_extend = x & (( 1 << nbits ) - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
    int r =  pre_sign_extend >= ( 1 << (nbits-1) )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
       ?   pre_sign_extend | ~(( 1 << nbits ) - 1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
       :   pre_sign_extend;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
    return (r << 2) + pos;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  static int wdisp( intptr_t x, intptr_t off, int nbits ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
    intptr_t xx = x - off;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
    assert_signed_word_disp_range(xx, nbits);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
    int r =  (xx >> 2) & (( 1 << nbits ) - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
    assert( inv_wdisp( r, off, nbits )  ==  x, "inverse not inverse");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
    return r;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  // Extract the top 32 bits in a 64 bit word
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  static int32_t hi32( int64_t x ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
    int32_t r = int32_t( (uint64_t)x >> 32 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
    return r;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  // given a sethi instruction, extract the constant, left-justified
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  static int inv_hi22( int x ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
    return x << 10;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  // create an imm22 field, given a 32-bit left-justified constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  static int hi22( int x ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
    int r = int( juint(x) >> 10 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
    assert( (r & ~((1 << 22) - 1))  ==  0, "just checkin'");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
    return r;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
  // create a low10 __value__ (not a field) for a given a 32-bit constant
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  static int low10( int x ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
    return x & ((1 << 10) - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
31515
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
   608
  // create a low12 __value__ (not a field) for a given a 32-bit constant
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
   609
  static int low12( int x ) {
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
   610
    return x & ((1 << 12) - 1);
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
   611
  }
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
   612
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   613
  // AES crypto instructions supported only on certain processors
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   614
  static void aes_only() { assert( VM_Version::has_aes(), "This instruction only works on SPARC with AES instructions support"); }
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   615
24953
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
   616
  // SHA crypto instructions supported only on certain processors
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
   617
  static void sha1_only()   { assert( VM_Version::has_sha1(),   "This instruction only works on SPARC with SHA1"); }
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
   618
  static void sha256_only() { assert( VM_Version::has_sha256(), "This instruction only works on SPARC with SHA256"); }
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
   619
  static void sha512_only() { assert( VM_Version::has_sha512(), "This instruction only works on SPARC with SHA512"); }
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
   620
31515
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
   621
  // CRC32C instruction supported only on certain processors
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
   622
  static void crc32c_only() { assert( VM_Version::has_crc32c(), "This instruction only works on SPARC with CRC32C"); }
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
   623
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   624
  // instruction only in VIS1
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   625
  static void vis1_only() { assert( VM_Version::has_vis1(), "This instruction only works on SPARC with VIS1"); }
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   626
24328
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   627
  // instruction only in VIS2
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   628
  static void vis2_only() { assert( VM_Version::has_vis2(), "This instruction only works on SPARC with VIS2"); }
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
   629
10027
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   630
  // instruction only in VIS3
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
   631
  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
   632
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
  // instruction only in v9
18097
acd70736bd60 8008407: remove SPARC V8 support
morris
parents: 15116
diff changeset
   634
  static void v9_only() { } // do nothing
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
  // instruction deprecated in v9
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
  static void v9_dep()  { } // do nothing for now
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  // v8 has no CC field
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
  static void v8_no_cc(CC cc)  { if (cc)  v9_only(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
 protected:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
  // Simple delay-slot scheme:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
  // In order to check the programmer, the assembler keeps track of deley slots.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
  // It forbids CTIs in delay slots (conservative, but should be OK).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  // Also, when putting an instruction into a delay slot, you must say
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
  // asm->delayed()->add(...), in order to check that you don't omit
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  // delay-slot instructions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  // To implement this, we use a simple FSA
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  #define CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
#ifdef CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
  enum Delay_state { no_delay, at_delay_slot, filling_delay_slot } delay_state;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
  // Tells assembler next instruction must NOT be in delay slot.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
  // Use at start of multinstruction macros.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
  void assert_not_delayed() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
    // This is a separate overloading to avoid creation of string constants
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
    // in non-asserted code--with some compilers this pollutes the object code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
#ifdef CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
    assert_not_delayed("next instruction should not be a delay slot");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
  void assert_not_delayed(const char* msg) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
#ifdef CHECK_DELAY
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 4009
diff changeset
   670
    assert(delay_state == no_delay, msg);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
 protected:
24008
da7059252295 8038297: Avoid placing CTI immediately following cbcond instruction on T4
iveresov
parents: 22505
diff changeset
   675
  // Insert a nop if the previous is cbcond
da7059252295 8038297: Avoid placing CTI immediately following cbcond instruction on T4
iveresov
parents: 22505
diff changeset
   676
  void insert_nop_after_cbcond() {
da7059252295 8038297: Avoid placing CTI immediately following cbcond instruction on T4
iveresov
parents: 22505
diff changeset
   677
    if (UseCBCond && cbcond_before()) {
da7059252295 8038297: Avoid placing CTI immediately following cbcond instruction on T4
iveresov
parents: 22505
diff changeset
   678
      nop();
da7059252295 8038297: Avoid placing CTI immediately following cbcond instruction on T4
iveresov
parents: 22505
diff changeset
   679
    }
da7059252295 8038297: Avoid placing CTI immediately following cbcond instruction on T4
iveresov
parents: 22505
diff changeset
   680
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
  // Delay slot helpers
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
  // cti is called when emitting control-transfer instruction,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
  // BEFORE doing the emitting.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
  // Only effective when assertion-checking is enabled.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
  void cti() {
24008
da7059252295 8038297: Avoid placing CTI immediately following cbcond instruction on T4
iveresov
parents: 22505
diff changeset
   686
    // A cbcond instruction immediately followed by a CTI
da7059252295 8038297: Avoid placing CTI immediately following cbcond instruction on T4
iveresov
parents: 22505
diff changeset
   687
    // instruction introduces pipeline stalls, we need to avoid that.
da7059252295 8038297: Avoid placing CTI immediately following cbcond instruction on T4
iveresov
parents: 22505
diff changeset
   688
    no_cbcond_before();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
#ifdef CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
    assert_not_delayed("cti should not be in delay slot");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
  // called when emitting cti with a delay slot, AFTER emitting
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
  void has_delay_slot() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
#ifdef CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
    assert_not_delayed("just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
    delay_state = at_delay_slot;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   702
  // cbcond instruction should not be generated one after an other
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   703
  bool cbcond_before() {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   704
    if (offset() == 0) return false; // it is first instruction
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   705
    int x = *(int*)(intptr_t(pc()) - 4); // previous instruction
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   706
    return is_cbcond(x);
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   707
  }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   708
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   709
  void no_cbcond_before() {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   710
    assert(offset() == 0 || !cbcond_before(), "cbcond should not follow an other cbcond");
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   711
  }
10264
6879f93d268d 7063629: use cbcond in C2 generated code on T4
kvn
parents: 10252
diff changeset
   712
public:
6879f93d268d 7063629: use cbcond in C2 generated code on T4
kvn
parents: 10252
diff changeset
   713
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   714
  bool use_cbcond(Label& L) {
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   715
    if (!UseCBCond || cbcond_before()) return false;
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   716
    intptr_t x = intptr_t(target_distance(L)) - intptr_t(pc());
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   717
    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
   718
    return is_simm12(x);
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   719
  }
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   720
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
  // Tells assembler you know that next instruction is delayed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
  Assembler* delayed() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
#ifdef CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
    assert ( delay_state == at_delay_slot, "delayed instruction is not in delay slot");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
    delay_state = filling_delay_slot;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
    return this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
  void flush() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
#ifdef CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
    assert ( delay_state == no_delay, "ending code with a delay slot");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
    AbstractAssembler::flush();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   737
  inline void emit_int32(int);  // shadows AbstractAssembler::emit_int32
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   738
  inline void emit_data(int x) { emit_int32(x); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  inline void emit_data(int, RelocationHolder const&);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
  inline void emit_data(int, relocInfo::relocType rtype);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
  // helper for above fcns
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
  inline void check_delay();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
  // instructions, refer to page numbers in the SPARC Architecture Manual, V9
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
  // pp 135 (addc was addx in v8)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2534
diff changeset
   750
  inline void add(Register s1, Register s2, Register d );
14631
526804361522 8003250: SPARC: move MacroAssembler into separate file
twisti
parents: 13969
diff changeset
   751
  inline void add(Register s1, int simm13a, Register d );
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   753
  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
   754
  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
   755
  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
   756
  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
   757
  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
   758
  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
   759
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   760
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   761
  // 4-operand AES instructions
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   762
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   763
  void aes_eround01(  FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_eround01_op5) | fs2(s2, FloatRegisterImpl::D) ); }
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   764
  void aes_eround23(  FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_eround23_op5) | fs2(s2, FloatRegisterImpl::D) ); }
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   765
  void aes_dround01(  FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_dround01_op5) | fs2(s2, FloatRegisterImpl::D) ); }
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   766
  void aes_dround23(  FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_dround23_op5) | fs2(s2, FloatRegisterImpl::D) ); }
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   767
  void aes_eround01_l(  FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_eround01_l_op5) | fs2(s2, FloatRegisterImpl::D) ); }
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   768
  void aes_eround23_l(  FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_eround23_l_op5) | fs2(s2, FloatRegisterImpl::D) ); }
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   769
  void aes_dround01_l(  FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_dround01_l_op5) | fs2(s2, FloatRegisterImpl::D) ); }
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   770
  void aes_dround23_l(  FloatRegister s1, FloatRegister s2, FloatRegister s3, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | fs3(s3, FloatRegisterImpl::D) | op5(aes_dround23_l_op5) | fs2(s2, FloatRegisterImpl::D) ); }
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   771
  void aes_kexpand1(  FloatRegister s1, FloatRegister s2, int imm5a, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes4_op3) | fs1(s1, FloatRegisterImpl::D) | u_field(imm5a, 13, 9) | op5(aes_kexpand1_op5) | fs2(s2, FloatRegisterImpl::D) ); }
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   772
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   773
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   774
  // 3-operand AES instructions
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   775
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   776
  void aes_kexpand0(  FloatRegister s1, FloatRegister s2, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes3_op3) | fs1(s1, FloatRegisterImpl::D) | opf(aes_kexpand0_opf) | fs2(s2, FloatRegisterImpl::D) ); }
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   777
  void aes_kexpand2(  FloatRegister s1, FloatRegister s2, FloatRegister d ) { aes_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(aes3_op3) | fs1(s1, FloatRegisterImpl::D) | opf(aes_kexpand2_opf) | fs2(s2, FloatRegisterImpl::D) ); }
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   778
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  // pp 136
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   781
  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
   782
  inline void bpr(RCondition c, bool a, Predict p, Register s1, Label& L);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
10264
6879f93d268d 7063629: use cbcond in C2 generated code on T4
kvn
parents: 10252
diff changeset
   784
  // compare and branch
6879f93d268d 7063629: use cbcond in C2 generated code on T4
kvn
parents: 10252
diff changeset
   785
  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
   786
  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
   787
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
 protected: // use MacroAssembler::br instead
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
  // pp 138
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
  inline void fb( Condition c, bool a, address d, relocInfo::relocType rt = relocInfo::none );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
  inline void fb( Condition c, bool a, Label& L );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
  // pp 141
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
  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
   798
  inline void fbp( Condition c, bool a, CC cc, Predict p, Label& L );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
  // pp 144
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
  inline void br( Condition c, bool a, address d, relocInfo::relocType rt = relocInfo::none );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
  inline void br( Condition c, bool a, Label& L );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
  // pp 146
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
  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
   808
  inline void bp( Condition c, bool a, CC cc, Predict p, Label& L );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
  // pp 149
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
  inline void call( address d,  relocInfo::relocType rt = relocInfo::runtime_call_type );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
  inline void call( Label& L,   relocInfo::relocType rt = relocInfo::runtime_call_type );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
10252
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   815
 public:
0981ce1c3eef 7063628: Use cbcond on T4
kvn
parents: 10027
diff changeset
   816
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  // pp 150
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
  // These instructions compare the contents of s2 with the contents of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
  // memory at address in s1. If the values are equal, the contents of memory
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
  // at address s1 is swapped with the data in d. If the values are not equal,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
  // the the contents of memory at s1 is loaded into d, without the swap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   824
  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
   825
  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
   826
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
  // pp 152
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   829
  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
   830
  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
   831
  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
   832
  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
   833
  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
   834
  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
   835
  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
   836
  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
   837
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
  // pp 155
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   840
  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
   841
  void retry() { v9_only();  cti();  emit_int32( op(arith_op) | fcn(1) | op3(retry_op3) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
  // pp 156
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   845
  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
   846
  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
   847
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  // pp 157
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
18097
acd70736bd60 8008407: remove SPARC V8 support
morris
parents: 15116
diff changeset
   850
  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
   851
  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
   852
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
  // pp 159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   855
  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
   856
  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
   857
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
  // pp 160
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   860
  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
   861
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
  // pp 161
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   864
  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
   865
  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
   866
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
  // pp 162
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
18097
acd70736bd60 8008407: remove SPARC V8 support
morris
parents: 15116
diff changeset
   869
  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
   870
18097
acd70736bd60 8008407: remove SPARC V8 support
morris
parents: 15116
diff changeset
   871
  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
   872
18097
acd70736bd60 8008407: remove SPARC V8 support
morris
parents: 15116
diff changeset
   873
  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
   874
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
  // pp 163
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   877
  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
   878
  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
   879
  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
   880
22505
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   881
  // FXORs/FXORd instructions
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   882
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   883
  void fxor( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister s2, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, w) | op3(flog3_op3) | fs1(s1, w) | opf(0x6E - w) | fs2(s2, w)); }
4523090c9674 8002074: Support for AES on SPARC
kvn
parents: 22234
diff changeset
   884
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
  // pp 164
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   887
  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
   888
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
  // pp 165
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
  inline void flush( Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  inline void flush( Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  // pp 167
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 flushw() { v9_only();  emit_int32( op(arith_op) | op3(flushw_op3) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
  // pp 168
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 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
   901
  // v8 unimp == illtrap(0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  // pp 169
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   905
  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
   906
  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
   907
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
  // pp 170
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
  void jmpl( Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
  void jmpl( Register s1, int simm13a, Register d, RelocationHolder const& rspec = RelocationHolder() );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
  // 171
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
2571
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2534
diff changeset
   915
  inline void ldf(FloatRegisterImpl::Width w, Register s1, Register s2, FloatRegister d);
d602ad6538bd 6822110: Add AddressLiteral class on SPARC
twisti
parents: 2534
diff changeset
   916
  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
   917
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
  inline void ldfsr(  Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
  inline void ldfsr(  Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
  inline void ldxfsr( Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
  inline void ldxfsr( Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
  // 173
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   926
  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
   927
  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
   928
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
  // pp 175, lduw is ld on v8
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
  inline void ldsb(  Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
  inline void ldsb(  Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
  inline void ldsh(  Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
  inline void ldsh(  Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
  inline void ldsw(  Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  inline void ldsw(  Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
  inline void ldub(  Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  inline void ldub(  Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
  inline void lduh(  Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
  inline void lduh(  Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
  inline void lduw(  Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
  inline void lduw(  Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
  inline void ldx(   Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
  inline void ldx(   Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
  inline void ldd(   Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
  inline void ldd(   Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
  // pp 177
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   950
  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
   951
  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
   952
  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
   953
  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
   954
  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
   955
  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
   956
  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
   957
  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
   958
  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
   959
  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
   960
  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
   961
  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
   962
  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
   963
  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
   964
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
  // pp 181
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   967
  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
   968
  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
   969
  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
   970
  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
   971
  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
   972
  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
   973
  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
   974
  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
   975
  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
   976
  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
   977
  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
   978
  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
   979
  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
   980
  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
   981
  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
   982
  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
   983
  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
   984
  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
   985
  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
   986
  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
   987
  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
   988
  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
   989
  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
   990
  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
   991
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
  // pp 183
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   994
  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
   995
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
  // pp 185
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
   998
  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
   999
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  // pp 189
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1002
  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
  1003
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
  // pp 191
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1006
  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
  1007
  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
  1008
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
  // pp 195
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1011
  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
  1012
  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
  1013
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
  // pp 196
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1016
  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
  1017
  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
  1018
  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
  1019
  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
  1020
  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
  1021
  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
  1022
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
  // pp 197
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1025
  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
  1026
  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
  1027
  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
  1028
  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
  1029
  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
  1030
  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
  1031
  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
  1032
  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
  1033
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
  // pp 201
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1036
  void nop() { emit_int32( op(branch_op) | op2(sethi_op2) ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
31515
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
  1038
  void sw_count() { emit_int32( op(branch_op) | op2(sethi_op2) | 0x3f0 ); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  // pp 202
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1042
  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
  1043
  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
  1044
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
  // pp 203
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1047
  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
  1048
  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
  1049
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1050
  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
  1051
  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
  1052
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
  // pp 208
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
  // not implementing read privileged register
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1057
  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
  1058
  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
  1059
  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
  1060
  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
  1061
  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
  1062
  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
  1063
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
  // pp 213
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
  inline void rett( Register s1, Register s2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
  inline void rett( Register s1, int simm13a, relocInfo::relocType rt = relocInfo::none);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
  // pp 214
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1071
  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
  1072
  void save(    Register s1, int simm13a, Register d ) {
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 371
diff changeset
  1073
    // 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
  1074
    assert(-simm13a >= 16 * wordSize, "frame too small");
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1075
    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
  1076
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1078
  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
  1079
  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
  1080
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
  // pp 216
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1083
  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
  1084
  void restored() { v9_only();  emit_int32( op(arith_op) | fcn(1) | op3(saved_op3)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
  // pp 217
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
  inline void sethi( int imm22a, Register d, RelocationHolder const& rspec = RelocationHolder() );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
  // pp 218
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1091
  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
  1092
  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
  1093
  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
  1094
  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
  1095
  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
  1096
  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
  1097
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1098
  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
  1099
  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
  1100
  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
  1101
  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
  1102
  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
  1103
  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
  1104
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
  // pp 220
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1107
  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
  1108
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  // pp 221
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1111
  void stbar() { emit_int32( op(arith_op) | op3(membar_op3) | u_field(15, 18, 14)); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
  // pp 222
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
4009
8731c367fa98 6879902: CTW failure jdk6_18/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp:845
twisti
parents: 3905
diff changeset
  1115
  inline void stf(    FloatRegisterImpl::Width w, FloatRegister d, Register s1, Register s2);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
  inline void stf(    FloatRegisterImpl::Width w, FloatRegister d, Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
  inline void stfsr(  Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
  inline void stfsr(  Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
  inline void stxfsr( Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
  inline void stxfsr( Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
  //  pp 224
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1125
  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
  1126
  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
  1127
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
  // p 226
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  inline void stb(  Register d, Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
  inline void stb(  Register d, Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
  inline void sth(  Register d, Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
  inline void sth(  Register d, Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
  inline void stw(  Register d, Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
  inline void stw(  Register d, Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
  inline void stx(  Register d, Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
  inline void stx(  Register d, Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
  inline void std(  Register d, Register s1, Register s2 );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
  inline void std(  Register d, Register s1, int simm13a);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
  // pp 177
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1143
  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
  1144
  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
  1145
  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
  1146
  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
  1147
  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
  1148
  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
  1149
  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
  1150
  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
  1151
  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
  1152
  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
  1153
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
  // pp 230
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1156
  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
  1157
  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
  1158
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1159
  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
  1160
  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
  1161
  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
  1162
  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
  1163
  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
  1164
  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
  1165
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
  // pp 231
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
  inline void swap( Register s1, Register s2, Register d );
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
  inline void swap( Register s1, int simm13a, Register d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
  // pp 232
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1173
  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
  1174
  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
  1175
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
  // pp 234, note op in book is wrong, see pp 268
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1178
  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
  1179
  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
  1180
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
  // pp 235
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1183
  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
  1184
  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
  1185
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
  // pp 237
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
18097
acd70736bd60 8008407: remove SPARC V8 support
morris
parents: 15116
diff changeset
  1188
  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
  1189
  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
  1190
  // simple uncond. trap
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
  void trap( int trapa ) { trap( always, icc, G0, trapa ); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
  // pp 239 omit write priv register for now
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1195
  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
  1196
  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
  1197
  inline void wrccr(Register s, int simm13a) { v9_only(); emit_int32( op(arith_op) |
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
                                                                           rs1(s) |
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
                                                                           op3(wrreg_op3) |
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
                                                                           u_field(2, 29, 25) |
10501
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 10267
diff changeset
  1201
                                                                           immed(true) |
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
                                                                           simm(simm13a, 13)); }
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1203
  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
  1204
  // wrasi(d, imm) stores (d xor imm) to asi
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1205
  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
  1206
                                               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
  1207
  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
  1208
24328
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
  1209
  //  VIS1 instructions
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
  1210
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
  1211
  void alignaddr( Register s1, Register s2, Register d ) { vis1_only(); emit_int32( op(arith_op) | rd(d) | op3(alignaddr_op3) | rs1(s1) | opf(alignaddr_opf) | rs2(s2)); }
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
  1212
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
  1213
  void faligndata( FloatRegister s1, FloatRegister s2, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(faligndata_op3) | fs1(s1, FloatRegisterImpl::D) | opf(faligndata_opf) | fs2(s2, FloatRegisterImpl::D)); }
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
  1214
31515
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
  1215
  void fzero( FloatRegisterImpl::Width w, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, w) | op3(fzero_op3) | opf(0x62 - w)); }
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
  1216
24328
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
  1217
  void fsrc2( FloatRegisterImpl::Width w, FloatRegister s2, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, w) | op3(fsrc_op3) | opf(0x7A - w) | fs2(s2, w)); }
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
  1218
31515
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
  1219
  void fnot1( FloatRegisterImpl::Width w, FloatRegister s1, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, w) | op3(fnot_op3) | fs1(s1, w) | opf(0x6C - w)); }
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
  1220
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
  1221
  void fpmerge( FloatRegister s1, FloatRegister s2, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(0x36) | fs1(s1, FloatRegisterImpl::S) | opf(0x4b) | fs2(s2, FloatRegisterImpl::S)); }
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
  1222
24328
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
  1223
  void stpartialf( Register s1, Register s2, FloatRegister d, int ia = -1 ) { vis1_only(); emit_int32( op(ldst_op) | fd(d, FloatRegisterImpl::D) | op3(stpartialf_op3) | rs1(s1) | imm_asi(ia) | rs2(s2)); }
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
  1224
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
  1225
  //  VIS2 instructions
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
  1226
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
  1227
  void edge8n( Register s1, Register s2, Register d ) { vis2_only(); emit_int32( op(arith_op) | rd(d) | op3(edge_op3) | rs1(s1) | opf(edge8n_opf) | rs2(s2)); }
bddefb356fba 8035936: SIGBUS in StubRoutines::aesencryptBlock, solaris-sparc
kvn
parents: 24008
diff changeset
  1228
10027
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
  1229
  // VIS3 instructions
20cd71f29262 7059034: Use movxtod/movdtox on T4
kvn
parents: 9976
diff changeset
  1230
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1231
  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
  1232
  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
  1233
  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
  1234
15116
af423dcb739c 8004537: replace AbstractAssembler emit_long with emit_int32
twisti
parents: 14631
diff changeset
  1235
  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
  1236
  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
  1237
31404
63e8fcd70bfc 8073108: Use x86 and SPARC CPU instructions for GHASH acceleration
ascarpino
parents: 24953
diff changeset
  1238
  void xmulx(Register s1, Register s2, Register d) { vis3_only(); emit_int32( op(arith_op) | rd(d) | op3(xmulx_op3) | rs1(s1) | opf(xmulx_opf) | rs2(s2)); }
63e8fcd70bfc 8073108: Use x86 and SPARC CPU instructions for GHASH acceleration
ascarpino
parents: 24953
diff changeset
  1239
  void xmulxhi(Register s1, Register s2, Register d) { vis3_only(); emit_int32( op(arith_op) | rd(d) | op3(xmulx_op3) | rs1(s1) | opf(xmulxhi_opf) | rs2(s2)); }
63e8fcd70bfc 8073108: Use x86 and SPARC CPU instructions for GHASH acceleration
ascarpino
parents: 24953
diff changeset
  1240
24953
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
  1241
  // Crypto SHA instructions
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
  1242
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
  1243
  void sha1()   { sha1_only();    emit_int32( op(arith_op) | op3(sha_op3) | opf(sha1_opf)); }
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
  1244
  void sha256() { sha256_only();  emit_int32( op(arith_op) | op3(sha_op3) | opf(sha256_opf)); }
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
  1245
  void sha512() { sha512_only();  emit_int32( op(arith_op) | op3(sha_op3) | opf(sha512_opf)); }
9680119572be 8035968: Leverage CPU Instructions to Improve SHA Performance on SPARC
kvn
parents: 24328
diff changeset
  1246
31515
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
  1247
  // CRC32C instruction
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
  1248
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
  1249
  void crc32c( FloatRegister s1, FloatRegister s2, FloatRegister d ) { crc32c_only();  emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(crc32c_op3) | fs1(s1, FloatRegisterImpl::D) | opf(crc32c_opf) | fs2(s2, FloatRegisterImpl::D)); }
6aed85dadbe6 8073583: C2 support for CRC32C on SPARC
kvn
parents: 31404
diff changeset
  1250
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
  // Creation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
  Assembler(CodeBuffer* code) : AbstractAssembler(code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
#ifdef CHECK_DELAY
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
    delay_state = no_delay;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7112
diff changeset
  1259
#endif // CPU_SPARC_VM_ASSEMBLER_SPARC_HPP