src/hotspot/cpu/aarch64/assembler_aarch64.hpp
author aph
Thu, 23 May 2019 07:57:50 -0400
changeset 55054 78e49883146f
parent 54960 e46fe26d7f77
child 55314 811df7c64724
child 58678 9cf78a70fa4f
permissions -rw-r--r--
8224671: AArch64: mauve System.arraycopy test failure Reviewed-by: adinn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
     1
/*
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 53041
diff changeset
     2
 * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
30225
e9722ea461d4 8077615: AARCH64: Add C2 intrinsic for BigInteger::multiplyToLen() method
aph
parents: 29183
diff changeset
     3
 * Copyright (c) 2014, 2015, Red Hat Inc. All rights reserved.
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
     4
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
     5
 *
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
     6
 * This code is free software; you can redistribute it and/or modify it
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
     7
 * under the terms of the GNU General Public License version 2 only, as
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
     8
 * published by the Free Software Foundation.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
     9
 *
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    10
 * This code is distributed in the hope that it will be useful, but WITHOUT
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    13
 * version 2 for more details (a copy is included in the LICENSE file that
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    14
 * accompanied this code).
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    15
 *
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License version
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    17
 * 2 along with this work; if not, write to the Free Software Foundation,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    19
 *
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    21
 * or visit www.oracle.com if you need additional information or have any
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    22
 * questions.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    23
 *
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    24
 */
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    25
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 53041
diff changeset
    26
#ifndef CPU_AARCH64_ASSEMBLER_AARCH64_HPP
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 53041
diff changeset
    27
#define CPU_AARCH64_ASSEMBLER_AARCH64_HPP
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    28
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    29
#include "asm/register.hpp"
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    30
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    31
// definitions of various symbolic names for machine registers
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    32
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    33
// First intercalls between C and Java which use 8 general registers
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    34
// and 8 floating registers
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    35
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    36
// we also have to copy between x86 and ARM registers but that's a
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    37
// secondary complication -- not all code employing C call convention
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    38
// executes as x86 code though -- we generate some of it
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    39
49364
601146c66cad 8173070: Remove ValueObj class for allocation subclassing for runtime code
coleenp
parents: 49174
diff changeset
    40
class Argument {
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    41
 public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    42
  enum {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    43
    n_int_register_parameters_c   = 8,  // r0, r1, ... r7 (c_rarg0, c_rarg1, ...)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    44
    n_float_register_parameters_c = 8,  // v0, v1, ... v7 (c_farg0, c_farg1, ... )
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    45
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    46
    n_int_register_parameters_j   = 8, // r1, ... r7, r0 (rj_rarg0, j_rarg1, ...
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    47
    n_float_register_parameters_j = 8  // v0, v1, ... v7 (j_farg0, j_farg1, ...
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    48
  };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    49
};
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    50
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    51
REGISTER_DECLARATION(Register, c_rarg0, r0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    52
REGISTER_DECLARATION(Register, c_rarg1, r1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    53
REGISTER_DECLARATION(Register, c_rarg2, r2);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    54
REGISTER_DECLARATION(Register, c_rarg3, r3);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    55
REGISTER_DECLARATION(Register, c_rarg4, r4);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    56
REGISTER_DECLARATION(Register, c_rarg5, r5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    57
REGISTER_DECLARATION(Register, c_rarg6, r6);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    58
REGISTER_DECLARATION(Register, c_rarg7, r7);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    59
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    60
REGISTER_DECLARATION(FloatRegister, c_farg0, v0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    61
REGISTER_DECLARATION(FloatRegister, c_farg1, v1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    62
REGISTER_DECLARATION(FloatRegister, c_farg2, v2);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    63
REGISTER_DECLARATION(FloatRegister, c_farg3, v3);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    64
REGISTER_DECLARATION(FloatRegister, c_farg4, v4);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    65
REGISTER_DECLARATION(FloatRegister, c_farg5, v5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    66
REGISTER_DECLARATION(FloatRegister, c_farg6, v6);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    67
REGISTER_DECLARATION(FloatRegister, c_farg7, v7);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    68
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    69
// Symbolically name the register arguments used by the Java calling convention.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    70
// We have control over the convention for java so we can do what we please.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    71
// What pleases us is to offset the java calling convention so that when
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    72
// we call a suitable jni method the arguments are lined up and we don't
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    73
// have to do much shuffling. A suitable jni method is non-static and a
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    74
// small number of arguments
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    75
//
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    76
//  |--------------------------------------------------------------------|
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    77
//  | c_rarg0  c_rarg1  c_rarg2 c_rarg3 c_rarg4 c_rarg5 c_rarg6 c_rarg7  |
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    78
//  |--------------------------------------------------------------------|
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    79
//  | r0       r1       r2      r3      r4      r5      r6      r7       |
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    80
//  |--------------------------------------------------------------------|
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    81
//  | j_rarg7  j_rarg0  j_rarg1 j_rarg2 j_rarg3 j_rarg4 j_rarg5 j_rarg6  |
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    82
//  |--------------------------------------------------------------------|
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    83
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    84
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    85
REGISTER_DECLARATION(Register, j_rarg0, c_rarg1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    86
REGISTER_DECLARATION(Register, j_rarg1, c_rarg2);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    87
REGISTER_DECLARATION(Register, j_rarg2, c_rarg3);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    88
REGISTER_DECLARATION(Register, j_rarg3, c_rarg4);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    89
REGISTER_DECLARATION(Register, j_rarg4, c_rarg5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    90
REGISTER_DECLARATION(Register, j_rarg5, c_rarg6);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    91
REGISTER_DECLARATION(Register, j_rarg6, c_rarg7);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    92
REGISTER_DECLARATION(Register, j_rarg7, c_rarg0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    93
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    94
// Java floating args are passed as per C
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    95
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    96
REGISTER_DECLARATION(FloatRegister, j_farg0, v0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    97
REGISTER_DECLARATION(FloatRegister, j_farg1, v1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    98
REGISTER_DECLARATION(FloatRegister, j_farg2, v2);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
    99
REGISTER_DECLARATION(FloatRegister, j_farg3, v3);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   100
REGISTER_DECLARATION(FloatRegister, j_farg4, v4);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   101
REGISTER_DECLARATION(FloatRegister, j_farg5, v5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   102
REGISTER_DECLARATION(FloatRegister, j_farg6, v6);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   103
REGISTER_DECLARATION(FloatRegister, j_farg7, v7);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   104
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   105
// registers used to hold VM data either temporarily within a method
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   106
// or across method calls
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   107
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   108
// volatile (caller-save) registers
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   109
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   110
// r8 is used for indirect result location return
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   111
// we use it and r9 as scratch registers
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   112
REGISTER_DECLARATION(Register, rscratch1, r8);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   113
REGISTER_DECLARATION(Register, rscratch2, r9);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   114
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   115
// current method -- must be in a call-clobbered register
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   116
REGISTER_DECLARATION(Register, rmethod,   r12);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   117
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   118
// non-volatile (callee-save) registers are r16-29
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   119
// of which the following are dedicated global state
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   120
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   121
// link register
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   122
REGISTER_DECLARATION(Register, lr,        r30);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   123
// frame pointer
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   124
REGISTER_DECLARATION(Register, rfp,       r29);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   125
// current thread
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   126
REGISTER_DECLARATION(Register, rthread,   r28);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   127
// base of heap
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   128
REGISTER_DECLARATION(Register, rheapbase, r27);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   129
// constant pool cache
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   130
REGISTER_DECLARATION(Register, rcpool,    r26);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   131
// monitors allocated on stack
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   132
REGISTER_DECLARATION(Register, rmonitors, r25);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   133
// locals on stack
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   134
REGISTER_DECLARATION(Register, rlocals,   r24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   135
// bytecode pointer
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   136
REGISTER_DECLARATION(Register, rbcp,      r22);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   137
// Dispatch table base
35127
483603d4c7b2 8145553: Fix warnings in AArch64 directory
aph
parents: 35096
diff changeset
   138
REGISTER_DECLARATION(Register, rdispatch, r21);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   139
// Java stack pointer
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   140
REGISTER_DECLARATION(Register, esp,      r20);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   141
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   142
#define assert_cond(ARG1) assert(ARG1, #ARG1)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   143
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   144
namespace asm_util {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   145
  uint32_t encode_logical_immediate(bool is32, uint64_t imm);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   146
};
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   147
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   148
using namespace asm_util;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   149
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   150
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   151
class Assembler;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   152
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   153
class Instruction_aarch64 {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   154
  unsigned insn;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   155
#ifdef ASSERT
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   156
  unsigned bits;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   157
#endif
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   158
  Assembler *assem;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   159
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   160
public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   161
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   162
  Instruction_aarch64(class Assembler *as) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   163
#ifdef ASSERT
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   164
    bits = 0;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   165
#endif
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   166
    insn = 0;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   167
    assem = as;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   168
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   169
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   170
  inline ~Instruction_aarch64();
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   171
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   172
  unsigned &get_insn() { return insn; }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   173
#ifdef ASSERT
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   174
  unsigned &get_bits() { return bits; }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   175
#endif
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   176
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   177
  static inline int32_t extend(unsigned val, int hi = 31, int lo = 0) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   178
    union {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   179
      unsigned u;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   180
      int n;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   181
    };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   182
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   183
    u = val << (31 - hi);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   184
    n = n >> (31 - hi + lo);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   185
    return n;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   186
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   187
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   188
  static inline uint32_t extract(uint32_t val, int msb, int lsb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   189
    int nbits = msb - lsb + 1;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   190
    assert_cond(msb >= lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   191
    uint32_t mask = (1U << nbits) - 1;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   192
    uint32_t result = val >> lsb;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   193
    result &= mask;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   194
    return result;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   195
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   196
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   197
  static inline int32_t sextract(uint32_t val, int msb, int lsb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   198
    uint32_t uval = extract(val, msb, lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   199
    return extend(uval, msb - lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   200
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   201
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   202
  static void patch(address a, int msb, int lsb, unsigned long val) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   203
    int nbits = msb - lsb + 1;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   204
    guarantee(val < (1U << nbits), "Field too big for insn");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   205
    assert_cond(msb >= lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   206
    unsigned mask = (1U << nbits) - 1;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   207
    val <<= lsb;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   208
    mask <<= lsb;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   209
    unsigned target = *(unsigned *)a;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   210
    target &= ~mask;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   211
    target |= val;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   212
    *(unsigned *)a = target;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   213
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   214
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   215
  static void spatch(address a, int msb, int lsb, long val) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   216
    int nbits = msb - lsb + 1;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   217
    long chk = val >> (nbits - 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   218
    guarantee (chk == -1 || chk == 0, "Field too big for insn");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   219
    unsigned uval = val;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   220
    unsigned mask = (1U << nbits) - 1;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   221
    uval &= mask;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   222
    uval <<= lsb;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   223
    mask <<= lsb;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   224
    unsigned target = *(unsigned *)a;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   225
    target &= ~mask;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   226
    target |= uval;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   227
    *(unsigned *)a = target;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   228
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   229
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   230
  void f(unsigned val, int msb, int lsb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   231
    int nbits = msb - lsb + 1;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   232
    guarantee(val < (1U << nbits), "Field too big for insn");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   233
    assert_cond(msb >= lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   234
    unsigned mask = (1U << nbits) - 1;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   235
    val <<= lsb;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   236
    mask <<= lsb;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   237
    insn |= val;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   238
    assert_cond((bits & mask) == 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   239
#ifdef ASSERT
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   240
    bits |= mask;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   241
#endif
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   242
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   243
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   244
  void f(unsigned val, int bit) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   245
    f(val, bit, bit);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   246
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   247
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   248
  void sf(long val, int msb, int lsb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   249
    int nbits = msb - lsb + 1;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   250
    long chk = val >> (nbits - 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   251
    guarantee (chk == -1 || chk == 0, "Field too big for insn");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   252
    unsigned uval = val;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   253
    unsigned mask = (1U << nbits) - 1;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   254
    uval &= mask;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   255
    f(uval, lsb + nbits - 1, lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   256
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   257
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   258
  void rf(Register r, int lsb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   259
    f(r->encoding_nocheck(), lsb + 4, lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   260
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   261
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   262
  // reg|ZR
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   263
  void zrf(Register r, int lsb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   264
    f(r->encoding_nocheck() - (r == zr), lsb + 4, lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   265
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   266
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   267
  // reg|SP
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   268
  void srf(Register r, int lsb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   269
    f(r == sp ? 31 : r->encoding_nocheck(), lsb + 4, lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   270
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   271
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   272
  void rf(FloatRegister r, int lsb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   273
    f(r->encoding_nocheck(), lsb + 4, lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   274
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   275
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   276
  unsigned get(int msb = 31, int lsb = 0) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   277
    int nbits = msb - lsb + 1;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   278
    unsigned mask = ((1U << nbits) - 1) << lsb;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   279
    assert_cond(bits & mask == mask);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   280
    return (insn & mask) >> lsb;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   281
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   282
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   283
  void fixed(unsigned value, unsigned mask) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   284
    assert_cond ((mask & bits) == 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   285
#ifdef ASSERT
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   286
    bits |= mask;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   287
#endif
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   288
    insn |= value;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   289
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   290
};
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   291
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   292
#define starti Instruction_aarch64 do_not_use(this); set_current(&do_not_use)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   293
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   294
class PrePost {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   295
  int _offset;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   296
  Register _r;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   297
public:
51383
2f58537e1bc0 8209193: Fix aarch64-linux compilation after -Wreorder changes
tschatzl
parents: 50754
diff changeset
   298
  PrePost(Register reg, int o) : _offset(o), _r(reg) { }
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   299
  int offset() { return _offset; }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   300
  Register reg() { return _r; }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   301
};
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   302
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   303
class Pre : public PrePost {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   304
public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   305
  Pre(Register reg, int o) : PrePost(reg, o) { }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   306
};
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   307
class Post : public PrePost {
50640
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
   308
  Register _idx;
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   309
public:
50640
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
   310
  Post(Register reg, int o) : PrePost(reg, o) { _idx = NULL; }
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
   311
  Post(Register reg, Register idx) : PrePost(reg, 0) { _idx = idx; }
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
   312
  Register idx_reg() { return _idx; }
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   313
};
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   314
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   315
namespace ext
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   316
{
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   317
  enum operation { uxtb, uxth, uxtw, uxtx, sxtb, sxth, sxtw, sxtx };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   318
};
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   319
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   320
// Addressing modes
49364
601146c66cad 8173070: Remove ValueObj class for allocation subclassing for runtime code
coleenp
parents: 49174
diff changeset
   321
class Address {
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   322
 public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   323
50640
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
   324
  enum mode { no_mode, base_plus_offset, pre, post, post_reg, pcrel,
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   325
              base_plus_offset_reg, literal };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   326
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   327
  // Shift and extend for base reg + reg offset addressing
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   328
  class extend {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   329
    int _option, _shift;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   330
    ext::operation _op;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   331
  public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   332
    extend() { }
51383
2f58537e1bc0 8209193: Fix aarch64-linux compilation after -Wreorder changes
tschatzl
parents: 50754
diff changeset
   333
    extend(int s, int o, ext::operation op) : _option(o), _shift(s), _op(op) { }
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   334
    int option() const{ return _option; }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   335
    int shift() const { return _shift; }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   336
    ext::operation op() const { return _op; }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   337
  };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   338
  class uxtw : public extend {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   339
  public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   340
    uxtw(int shift = -1): extend(shift, 0b010, ext::uxtw) { }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   341
  };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   342
  class lsl : public extend {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   343
  public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   344
    lsl(int shift = -1): extend(shift, 0b011, ext::uxtx) { }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   345
  };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   346
  class sxtw : public extend {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   347
  public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   348
    sxtw(int shift = -1): extend(shift, 0b110, ext::sxtw) { }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   349
  };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   350
  class sxtx : public extend {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   351
  public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   352
    sxtx(int shift = -1): extend(shift, 0b111, ext::sxtx) { }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   353
  };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   354
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   355
 private:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   356
  Register _base;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   357
  Register _index;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   358
  long _offset;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   359
  enum mode _mode;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   360
  extend _ext;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   361
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   362
  RelocationHolder _rspec;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   363
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   364
  // Typically we use AddressLiterals we want to use their rval
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   365
  // However in some situations we want the lval (effect address) of
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   366
  // the item.  We provide a special factory for making those lvals.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   367
  bool _is_lval;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   368
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   369
  // If the target is far we'll need to load the ea of this to a
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   370
  // register to reach it. Otherwise if near we can do PC-relative
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   371
  // addressing.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   372
  address          _target;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   373
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   374
 public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   375
  Address()
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   376
    : _mode(no_mode) { }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   377
  Address(Register r)
51383
2f58537e1bc0 8209193: Fix aarch64-linux compilation after -Wreorder changes
tschatzl
parents: 50754
diff changeset
   378
    : _base(r), _index(noreg), _offset(0), _mode(base_plus_offset), _target(0) { }
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   379
  Address(Register r, int o)
51383
2f58537e1bc0 8209193: Fix aarch64-linux compilation after -Wreorder changes
tschatzl
parents: 50754
diff changeset
   380
    : _base(r), _index(noreg), _offset(o), _mode(base_plus_offset), _target(0) { }
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   381
  Address(Register r, long o)
51383
2f58537e1bc0 8209193: Fix aarch64-linux compilation after -Wreorder changes
tschatzl
parents: 50754
diff changeset
   382
    : _base(r), _index(noreg), _offset(o), _mode(base_plus_offset), _target(0) { }
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   383
  Address(Register r, unsigned long o)
51383
2f58537e1bc0 8209193: Fix aarch64-linux compilation after -Wreorder changes
tschatzl
parents: 50754
diff changeset
   384
    : _base(r), _index(noreg), _offset(o), _mode(base_plus_offset), _target(0) { }
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   385
#ifdef ASSERT
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   386
  Address(Register r, ByteSize disp)
51383
2f58537e1bc0 8209193: Fix aarch64-linux compilation after -Wreorder changes
tschatzl
parents: 50754
diff changeset
   387
    : _base(r), _index(noreg), _offset(in_bytes(disp)), _mode(base_plus_offset), _target(0) { }
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   388
#endif
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   389
  Address(Register r, Register r1, extend ext = lsl())
51383
2f58537e1bc0 8209193: Fix aarch64-linux compilation after -Wreorder changes
tschatzl
parents: 50754
diff changeset
   390
    : _base(r), _index(r1), _offset(0), _mode(base_plus_offset_reg),
2f58537e1bc0 8209193: Fix aarch64-linux compilation after -Wreorder changes
tschatzl
parents: 50754
diff changeset
   391
      _ext(ext), _target(0) { }
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   392
  Address(Pre p)
51383
2f58537e1bc0 8209193: Fix aarch64-linux compilation after -Wreorder changes
tschatzl
parents: 50754
diff changeset
   393
    : _base(p.reg()), _offset(p.offset()), _mode(pre) { }
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   394
  Address(Post p)
51383
2f58537e1bc0 8209193: Fix aarch64-linux compilation after -Wreorder changes
tschatzl
parents: 50754
diff changeset
   395
    : _base(p.reg()),  _index(p.idx_reg()), _offset(p.offset()),
2f58537e1bc0 8209193: Fix aarch64-linux compilation after -Wreorder changes
tschatzl
parents: 50754
diff changeset
   396
      _mode(p.idx_reg() == NULL ? post : post_reg), _target(0) { }
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   397
  Address(address target, RelocationHolder const& rspec)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   398
    : _mode(literal),
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   399
      _rspec(rspec),
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   400
      _is_lval(false),
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   401
      _target(target)  { }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   402
  Address(address target, relocInfo::relocType rtype = relocInfo::external_word_type);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   403
  Address(Register base, RegisterOrConstant index, extend ext = lsl())
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   404
    : _base (base),
51383
2f58537e1bc0 8209193: Fix aarch64-linux compilation after -Wreorder changes
tschatzl
parents: 50754
diff changeset
   405
      _offset(0), _ext(ext), _target(0) {
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   406
    if (index.is_register()) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   407
      _mode = base_plus_offset_reg;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   408
      _index = index.as_register();
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   409
    } else {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   410
      guarantee(ext.option() == ext::uxtx, "should be");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   411
      assert(index.is_constant(), "should be");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   412
      _mode = base_plus_offset;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   413
      _offset = index.as_constant() << ext.shift();
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   414
    }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   415
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   416
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   417
  Register base() const {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   418
    guarantee((_mode == base_plus_offset | _mode == base_plus_offset_reg
50640
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
   419
               | _mode == post | _mode == post_reg),
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   420
              "wrong mode");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   421
    return _base;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   422
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   423
  long offset() const {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   424
    return _offset;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   425
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   426
  Register index() const {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   427
    return _index;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   428
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   429
  mode getMode() const {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   430
    return _mode;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   431
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   432
  bool uses(Register reg) const { return _base == reg || _index == reg; }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   433
  address target() const { return _target; }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   434
  const RelocationHolder& rspec() const { return _rspec; }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   435
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   436
  void encode(Instruction_aarch64 *i) const {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   437
    i->f(0b111, 29, 27);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   438
    i->srf(_base, 5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   439
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   440
    switch(_mode) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   441
    case base_plus_offset:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   442
      {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   443
        unsigned size = i->get(31, 30);
30890
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
   444
        if (i->get(26, 26) && i->get(23, 23)) {
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
   445
          // SIMD Q Type - Size = 128 bits
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
   446
          assert(size == 0, "bad size");
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
   447
          size = 0b100;
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
   448
        }
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   449
        unsigned mask = (1 << size) - 1;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   450
        if (_offset < 0 || _offset & mask)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   451
          {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   452
            i->f(0b00, 25, 24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   453
            i->f(0, 21), i->f(0b00, 11, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   454
            i->sf(_offset, 20, 12);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   455
          } else {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   456
            i->f(0b01, 25, 24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   457
            i->f(_offset >> size, 21, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   458
          }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   459
      }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   460
      break;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   461
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   462
    case base_plus_offset_reg:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   463
      {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   464
        i->f(0b00, 25, 24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   465
        i->f(1, 21);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   466
        i->rf(_index, 16);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   467
        i->f(_ext.option(), 15, 13);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   468
        unsigned size = i->get(31, 30);
31227
964d24a82077 8129551: aarch64: some regressions introduced by addition of vectorisation code
enevill
parents: 30890
diff changeset
   469
        if (i->get(26, 26) && i->get(23, 23)) {
964d24a82077 8129551: aarch64: some regressions introduced by addition of vectorisation code
enevill
parents: 30890
diff changeset
   470
          // SIMD Q Type - Size = 128 bits
964d24a82077 8129551: aarch64: some regressions introduced by addition of vectorisation code
enevill
parents: 30890
diff changeset
   471
          assert(size == 0, "bad size");
964d24a82077 8129551: aarch64: some regressions introduced by addition of vectorisation code
enevill
parents: 30890
diff changeset
   472
          size = 0b100;
964d24a82077 8129551: aarch64: some regressions introduced by addition of vectorisation code
enevill
parents: 30890
diff changeset
   473
        }
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   474
        if (size == 0) // It's a byte
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   475
          i->f(_ext.shift() >= 0, 12);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   476
        else {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   477
          if (_ext.shift() > 0)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   478
            assert(_ext.shift() == (int)size, "bad shift");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   479
          i->f(_ext.shift() > 0, 12);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   480
        }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   481
        i->f(0b10, 11, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   482
      }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   483
      break;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   484
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   485
    case pre:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   486
      i->f(0b00, 25, 24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   487
      i->f(0, 21), i->f(0b11, 11, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   488
      i->sf(_offset, 20, 12);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   489
      break;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   490
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   491
    case post:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   492
      i->f(0b00, 25, 24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   493
      i->f(0, 21), i->f(0b01, 11, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   494
      i->sf(_offset, 20, 12);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   495
      break;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   496
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   497
    default:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   498
      ShouldNotReachHere();
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   499
    }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   500
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   501
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   502
  void encode_pair(Instruction_aarch64 *i) const {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   503
    switch(_mode) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   504
    case base_plus_offset:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   505
      i->f(0b010, 25, 23);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   506
      break;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   507
    case pre:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   508
      i->f(0b011, 25, 23);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   509
      break;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   510
    case post:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   511
      i->f(0b001, 25, 23);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   512
      break;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   513
    default:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   514
      ShouldNotReachHere();
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   515
    }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   516
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   517
    unsigned size; // Operand shift in 32-bit words
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   518
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   519
    if (i->get(26, 26)) { // float
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   520
      switch(i->get(31, 30)) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   521
      case 0b10:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   522
        size = 2; break;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   523
      case 0b01:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   524
        size = 1; break;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   525
      case 0b00:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   526
        size = 0; break;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   527
      default:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   528
        ShouldNotReachHere();
35127
483603d4c7b2 8145553: Fix warnings in AArch64 directory
aph
parents: 35096
diff changeset
   529
        size = 0;  // unreachable
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   530
      }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   531
    } else {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   532
      size = i->get(31, 31);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   533
    }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   534
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   535
    size = 4 << size;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   536
    guarantee(_offset % size == 0, "bad offset");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   537
    i->sf(_offset / size, 21, 15);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   538
    i->srf(_base, 5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   539
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   540
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   541
  void encode_nontemporal_pair(Instruction_aarch64 *i) const {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   542
    // Only base + offset is allowed
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   543
    i->f(0b000, 25, 23);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   544
    unsigned size = i->get(31, 31);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   545
    size = 4 << size;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   546
    guarantee(_offset % size == 0, "bad offset");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   547
    i->sf(_offset / size, 21, 15);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   548
    i->srf(_base, 5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   549
    guarantee(_mode == Address::base_plus_offset,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   550
              "Bad addressing mode for non-temporal op");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   551
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   552
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   553
  void lea(MacroAssembler *, Register) const;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   554
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   555
  static bool offset_ok_for_immed(long offset, int shift = 0) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   556
    unsigned mask = (1 << shift) - 1;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   557
    if (offset < 0 || offset & mask) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   558
      return (uabs(offset) < (1 << (20 - 12))); // Unscaled offset
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   559
    } else {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   560
      return ((offset >> shift) < (1 << (21 - 10 + 1))); // Scaled, unsigned offset
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   561
    }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   562
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   563
};
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   564
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   565
// Convience classes
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   566
class RuntimeAddress: public Address {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   567
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   568
  public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   569
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   570
  RuntimeAddress(address target) : Address(target, relocInfo::runtime_call_type) {}
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   571
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   572
};
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   573
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   574
class OopAddress: public Address {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   575
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   576
  public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   577
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   578
  OopAddress(address target) : Address(target, relocInfo::oop_type){}
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   579
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   580
};
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   581
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   582
class ExternalAddress: public Address {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   583
 private:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   584
  static relocInfo::relocType reloc_for_target(address target) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   585
    // Sometimes ExternalAddress is used for values which aren't
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   586
    // exactly addresses, like the card table base.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   587
    // external_word_type can't be used for values in the first page
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   588
    // so just skip the reloc in that case.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   589
    return external_word_Relocation::can_be_relocated(target) ? relocInfo::external_word_type : relocInfo::none;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   590
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   591
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   592
 public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   593
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   594
  ExternalAddress(address target) : Address(target, reloc_for_target(target)) {}
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   595
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   596
};
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   597
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   598
class InternalAddress: public Address {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   599
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   600
  public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   601
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   602
  InternalAddress(address target) : Address(target, relocInfo::internal_word_type) {}
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   603
};
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   604
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   605
const int FPUStateSizeInWords = 32 * 2;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   606
typedef enum {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   607
  PLDL1KEEP = 0b00000, PLDL1STRM, PLDL2KEEP, PLDL2STRM, PLDL3KEEP, PLDL3STRM,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   608
  PSTL1KEEP = 0b10000, PSTL1STRM, PSTL2KEEP, PSTL2STRM, PSTL3KEEP, PSTL3STRM,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   609
  PLIL1KEEP = 0b01000, PLIL1STRM, PLIL2KEEP, PLIL2STRM, PLIL3KEEP, PLIL3STRM
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   610
} prfop;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   611
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   612
class Assembler : public AbstractAssembler {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   613
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   614
#ifndef PRODUCT
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   615
  static const unsigned long asm_bp;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   616
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   617
  void emit_long(jint x) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   618
    if ((unsigned long)pc() == asm_bp)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   619
      asm volatile ("nop");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   620
    AbstractAssembler::emit_int32(x);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   621
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   622
#else
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   623
  void emit_long(jint x) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   624
    AbstractAssembler::emit_int32(x);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   625
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   626
#endif
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   627
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   628
public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   629
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   630
  enum { instruction_size = 4 };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   631
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54453
diff changeset
   632
  //---<  calculate length of instruction  >---
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54453
diff changeset
   633
  // We just use the values set above.
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54453
diff changeset
   634
  // instruction must start at passed address
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54453
diff changeset
   635
  static unsigned int instr_len(unsigned char *instr) { return instruction_size; }
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54453
diff changeset
   636
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54453
diff changeset
   637
  //---<  longest instructions  >---
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54453
diff changeset
   638
  static unsigned int instr_maxlen() { return instruction_size; }
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54453
diff changeset
   639
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   640
  Address adjust(Register base, int offset, bool preIncrement) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   641
    if (preIncrement)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   642
      return Address(Pre(base, offset));
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   643
    else
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   644
      return Address(Post(base, offset));
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   645
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   646
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   647
  Address pre(Register base, int offset) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   648
    return adjust(base, offset, true);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   649
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   650
50640
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
   651
  Address post(Register base, int offset) {
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   652
    return adjust(base, offset, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   653
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   654
50640
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
   655
  Address post(Register base, Register idx) {
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
   656
    return Address(Post(base, idx));
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
   657
  }
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
   658
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   659
  Instruction_aarch64* current;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   660
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   661
  void set_current(Instruction_aarch64* i) { current = i; }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   662
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   663
  void f(unsigned val, int msb, int lsb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   664
    current->f(val, msb, lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   665
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   666
  void f(unsigned val, int msb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   667
    current->f(val, msb, msb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   668
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   669
  void sf(long val, int msb, int lsb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   670
    current->sf(val, msb, lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   671
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   672
  void rf(Register reg, int lsb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   673
    current->rf(reg, lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   674
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   675
  void srf(Register reg, int lsb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   676
    current->srf(reg, lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   677
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   678
  void zrf(Register reg, int lsb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   679
    current->zrf(reg, lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   680
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   681
  void rf(FloatRegister reg, int lsb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   682
    current->rf(reg, lsb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   683
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   684
  void fixed(unsigned value, unsigned mask) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   685
    current->fixed(value, mask);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   686
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   687
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   688
  void emit() {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   689
    emit_long(current->get_insn());
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   690
    assert_cond(current->get_bits() == 0xffffffff);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   691
    current = NULL;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   692
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   693
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   694
  typedef void (Assembler::* uncond_branch_insn)(address dest);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   695
  typedef void (Assembler::* compare_and_branch_insn)(Register Rt, address dest);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   696
  typedef void (Assembler::* test_and_branch_insn)(Register Rt, int bitpos, address dest);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   697
  typedef void (Assembler::* prefetch_insn)(address target, prfop);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   698
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   699
  void wrap_label(Label &L, uncond_branch_insn insn);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   700
  void wrap_label(Register r, Label &L, compare_and_branch_insn insn);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   701
  void wrap_label(Register r, int bitpos, Label &L, test_and_branch_insn insn);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   702
  void wrap_label(Label &L, prfop, prefetch_insn insn);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   703
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   704
  // PC-rel. addressing
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   705
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   706
  void adr(Register Rd, address dest);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   707
  void _adrp(Register Rd, address dest);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   708
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   709
  void adr(Register Rd, const Address &dest);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   710
  void _adrp(Register Rd, const Address &dest);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   711
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   712
  void adr(Register Rd, Label &L) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   713
    wrap_label(Rd, L, &Assembler::Assembler::adr);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   714
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   715
  void _adrp(Register Rd, Label &L) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   716
    wrap_label(Rd, L, &Assembler::_adrp);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   717
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   718
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   719
  void adrp(Register Rd, const Address &dest, unsigned long &offset);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   720
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   721
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   722
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   723
  void add_sub_immediate(Register Rd, Register Rn, unsigned uimm, int op,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   724
                         int negated_op);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   725
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   726
  // Add/subtract (immediate)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   727
#define INSN(NAME, decode, negated)                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   728
  void NAME(Register Rd, Register Rn, unsigned imm, unsigned shift) {   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   729
    starti;                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   730
    f(decode, 31, 29), f(0b10001, 28, 24), f(shift, 23, 22), f(imm, 21, 10); \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   731
    zrf(Rd, 0), srf(Rn, 5);                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   732
  }                                                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   733
                                                                        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   734
  void NAME(Register Rd, Register Rn, unsigned imm) {                   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   735
    starti;                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   736
    add_sub_immediate(Rd, Rn, imm, decode, negated);                    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   737
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   738
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   739
  INSN(addsw, 0b001, 0b011);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   740
  INSN(subsw, 0b011, 0b001);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   741
  INSN(adds,  0b101, 0b111);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   742
  INSN(subs,  0b111, 0b101);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   743
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   744
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   745
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   746
#define INSN(NAME, decode, negated)                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   747
  void NAME(Register Rd, Register Rn, unsigned imm) {   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   748
    starti;                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   749
    add_sub_immediate(Rd, Rn, imm, decode, negated);    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   750
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   751
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   752
  INSN(addw, 0b000, 0b010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   753
  INSN(subw, 0b010, 0b000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   754
  INSN(add,  0b100, 0b110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   755
  INSN(sub,  0b110, 0b100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   756
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   757
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   758
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   759
 // Logical (immediate)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   760
#define INSN(NAME, decode, is32)                                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   761
  void NAME(Register Rd, Register Rn, uint64_t imm) {           \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   762
    starti;                                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   763
    uint32_t val = encode_logical_immediate(is32, imm);         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   764
    f(decode, 31, 29), f(0b100100, 28, 23), f(val, 22, 10);     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   765
    srf(Rd, 0), zrf(Rn, 5);                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   766
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   767
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   768
  INSN(andw, 0b000, true);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   769
  INSN(orrw, 0b001, true);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   770
  INSN(eorw, 0b010, true);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   771
  INSN(andr,  0b100, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   772
  INSN(orr,  0b101, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   773
  INSN(eor,  0b110, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   774
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   775
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   776
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   777
#define INSN(NAME, decode, is32)                                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   778
  void NAME(Register Rd, Register Rn, uint64_t imm) {           \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   779
    starti;                                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   780
    uint32_t val = encode_logical_immediate(is32, imm);         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   781
    f(decode, 31, 29), f(0b100100, 28, 23), f(val, 22, 10);     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   782
    zrf(Rd, 0), zrf(Rn, 5);                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   783
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   784
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   785
  INSN(ands, 0b111, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   786
  INSN(andsw, 0b011, true);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   787
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   788
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   789
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   790
  // Move wide (immediate)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   791
#define INSN(NAME, opcode)                                              \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   792
  void NAME(Register Rd, unsigned imm, unsigned shift = 0) {            \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   793
    assert_cond((shift/16)*16 == shift);                                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   794
    starti;                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   795
    f(opcode, 31, 29), f(0b100101, 28, 23), f(shift/16, 22, 21),        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   796
      f(imm, 20, 5);                                                    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   797
    rf(Rd, 0);                                                          \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   798
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   799
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   800
  INSN(movnw, 0b000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   801
  INSN(movzw, 0b010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   802
  INSN(movkw, 0b011);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   803
  INSN(movn, 0b100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   804
  INSN(movz, 0b110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   805
  INSN(movk, 0b111);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   806
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   807
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   808
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   809
  // Bitfield
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   810
#define INSN(NAME, opcode)                                              \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   811
  void NAME(Register Rd, Register Rn, unsigned immr, unsigned imms) {   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   812
    starti;                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   813
    f(opcode, 31, 22), f(immr, 21, 16), f(imms, 15, 10);                \
49723
06ef6db47ec7 8201185: AARCH64: bfm instruction encoding hits assert on zero register
dpochepk
parents: 49364
diff changeset
   814
    zrf(Rn, 5), rf(Rd, 0);                                              \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   815
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   816
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   817
  INSN(sbfmw, 0b0001001100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   818
  INSN(bfmw,  0b0011001100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   819
  INSN(ubfmw, 0b0101001100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   820
  INSN(sbfm,  0b1001001101);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   821
  INSN(bfm,   0b1011001101);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   822
  INSN(ubfm,  0b1101001101);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   823
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   824
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   825
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   826
  // Extract
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   827
#define INSN(NAME, opcode)                                              \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   828
  void NAME(Register Rd, Register Rn, Register Rm, unsigned imms) {     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   829
    starti;                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   830
    f(opcode, 31, 21), f(imms, 15, 10);                                 \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   831
    rf(Rm, 16), rf(Rn, 5), rf(Rd, 0);                                   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   832
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   833
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   834
  INSN(extrw, 0b00010011100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   835
  INSN(extr,  0b10010011110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   836
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   837
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   838
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   839
  // The maximum range of a branch is fixed for the AArch64
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   840
  // architecture.  In debug mode we shrink it in order to test
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   841
  // trampolines, but not so small that branches in the interpreter
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   842
  // are out of range.
48487
abf1d797e380 8193260: AArch64: JVMCI: Implement trampoline calls
aph
parents: 48141
diff changeset
   843
  static const unsigned long branch_range = NOT_DEBUG(128 * M) DEBUG_ONLY(2 * M);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   844
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   845
  static bool reachable_from_branch_at(address branch, address target) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   846
    return uabs(target - branch) < branch_range;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   847
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   848
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   849
  // Unconditional branch (immediate)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   850
#define INSN(NAME, opcode)                                              \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   851
  void NAME(address dest) {                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   852
    starti;                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   853
    long offset = (dest - pc()) >> 2;                                   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   854
    DEBUG_ONLY(assert(reachable_from_branch_at(pc(), dest), "debug only")); \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   855
    f(opcode, 31), f(0b00101, 30, 26), sf(offset, 25, 0);               \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   856
  }                                                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   857
  void NAME(Label &L) {                                                 \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   858
    wrap_label(L, &Assembler::NAME);                                    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   859
  }                                                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   860
  void NAME(const Address &dest);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   861
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   862
  INSN(b, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   863
  INSN(bl, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   864
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   865
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   866
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   867
  // Compare & branch (immediate)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   868
#define INSN(NAME, opcode)                              \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   869
  void NAME(Register Rt, address dest) {                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   870
    long offset = (dest - pc()) >> 2;                   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   871
    starti;                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   872
    f(opcode, 31, 24), sf(offset, 23, 5), rf(Rt, 0);    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   873
  }                                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   874
  void NAME(Register Rt, Label &L) {                    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   875
    wrap_label(Rt, L, &Assembler::NAME);                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   876
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   877
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   878
  INSN(cbzw,  0b00110100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   879
  INSN(cbnzw, 0b00110101);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   880
  INSN(cbz,   0b10110100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   881
  INSN(cbnz,  0b10110101);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   882
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   883
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   884
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   885
  // Test & branch (immediate)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   886
#define INSN(NAME, opcode)                                              \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   887
  void NAME(Register Rt, int bitpos, address dest) {                    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   888
    long offset = (dest - pc()) >> 2;                                   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   889
    int b5 = bitpos >> 5;                                               \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   890
    bitpos &= 0x1f;                                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   891
    starti;                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   892
    f(b5, 31), f(opcode, 30, 24), f(bitpos, 23, 19), sf(offset, 18, 5); \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   893
    rf(Rt, 0);                                                          \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   894
  }                                                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   895
  void NAME(Register Rt, int bitpos, Label &L) {                        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   896
    wrap_label(Rt, bitpos, L, &Assembler::NAME);                        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   897
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   898
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   899
  INSN(tbz,  0b0110110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   900
  INSN(tbnz, 0b0110111);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   901
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   902
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   903
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   904
  // Conditional branch (immediate)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   905
  enum Condition
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   906
    {EQ, NE, HS, CS=HS, LO, CC=LO, MI, PL, VS, VC, HI, LS, GE, LT, GT, LE, AL, NV};
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   907
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   908
  void br(Condition  cond, address dest) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   909
    long offset = (dest - pc()) >> 2;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   910
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   911
    f(0b0101010, 31, 25), f(0, 24), sf(offset, 23, 5), f(0, 4), f(cond, 3, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   912
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   913
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   914
#define INSN(NAME, cond)                        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   915
  void NAME(address dest) {                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   916
    br(cond, dest);                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   917
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   918
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   919
  INSN(beq, EQ);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   920
  INSN(bne, NE);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   921
  INSN(bhs, HS);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   922
  INSN(bcs, CS);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   923
  INSN(blo, LO);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   924
  INSN(bcc, CC);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   925
  INSN(bmi, MI);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   926
  INSN(bpl, PL);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   927
  INSN(bvs, VS);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   928
  INSN(bvc, VC);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   929
  INSN(bhi, HI);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   930
  INSN(bls, LS);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   931
  INSN(bge, GE);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   932
  INSN(blt, LT);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   933
  INSN(bgt, GT);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   934
  INSN(ble, LE);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   935
  INSN(bal, AL);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   936
  INSN(bnv, NV);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   937
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   938
  void br(Condition cc, Label &L);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   939
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   940
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   941
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   942
  // Exception generation
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   943
  void generate_exception(int opc, int op2, int LL, unsigned imm) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   944
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   945
    f(0b11010100, 31, 24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   946
    f(opc, 23, 21), f(imm, 20, 5), f(op2, 4, 2), f(LL, 1, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   947
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   948
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   949
#define INSN(NAME, opc, op2, LL)                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   950
  void NAME(unsigned imm) {                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   951
    generate_exception(opc, op2, LL, imm);      \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   952
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   953
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   954
  INSN(svc, 0b000, 0, 0b01);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   955
  INSN(hvc, 0b000, 0, 0b10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   956
  INSN(smc, 0b000, 0, 0b11);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   957
  INSN(brk, 0b001, 0, 0b00);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   958
  INSN(hlt, 0b010, 0, 0b00);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   959
  INSN(dpcs1, 0b101, 0, 0b01);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   960
  INSN(dpcs2, 0b101, 0, 0b10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   961
  INSN(dpcs3, 0b101, 0, 0b11);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   962
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   963
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   964
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   965
  // System
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   966
  void system(int op0, int op1, int CRn, int CRm, int op2,
36562
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
   967
              Register rt = dummy_reg)
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   968
  {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   969
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   970
    f(0b11010101000, 31, 21);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   971
    f(op0, 20, 19);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   972
    f(op1, 18, 16);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   973
    f(CRn, 15, 12);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   974
    f(CRm, 11, 8);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   975
    f(op2, 7, 5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   976
    rf(rt, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   977
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   978
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   979
  void hint(int imm) {
48141
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
   980
    system(0b00, 0b011, 0b0010, 0b0000, imm);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   981
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   982
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   983
  void nop() {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   984
    hint(0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
   985
  }
48141
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
   986
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
   987
  void yield() {
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
   988
    hint(1);
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
   989
  }
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
   990
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
   991
  void wfe() {
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
   992
    hint(2);
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
   993
  }
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
   994
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
   995
  void wfi() {
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
   996
    hint(3);
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
   997
  }
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
   998
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
   999
  void sev() {
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
  1000
    hint(4);
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
  1001
  }
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
  1002
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
  1003
  void sevl() {
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
  1004
    hint(5);
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
  1005
  }
bafb0db43bfe 8191769: AARCH64: Fix hint instructions encoding
dchuyko
parents: 47773
diff changeset
  1006
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1007
  // we only provide mrs and msr for the special purpose system
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1008
  // registers where op1 (instr[20:19]) == 11 and, (currently) only
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1009
  // use it for FPSR n.b msr has L (instr[21]) == 0 mrs has L == 1
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1010
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1011
  void msr(int op1, int CRn, int CRm, int op2, Register rt) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1012
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1013
    f(0b1101010100011, 31, 19);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1014
    f(op1, 18, 16);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1015
    f(CRn, 15, 12);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1016
    f(CRm, 11, 8);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1017
    f(op2, 7, 5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1018
    // writing zr is ok
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1019
    zrf(rt, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1020
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1021
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1022
  void mrs(int op1, int CRn, int CRm, int op2, Register rt) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1023
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1024
    f(0b1101010100111, 31, 19);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1025
    f(op1, 18, 16);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1026
    f(CRn, 15, 12);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1027
    f(CRm, 11, 8);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1028
    f(op2, 7, 5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1029
    // reading to zr is a mistake
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1030
    rf(rt, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1031
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1032
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1033
  enum barrier {OSHLD = 0b0001, OSHST, OSH, NSHLD=0b0101, NSHST, NSH,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1034
                ISHLD = 0b1001, ISHST, ISH, LD=0b1101, ST, SY};
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1035
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1036
  void dsb(barrier imm) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1037
    system(0b00, 0b011, 0b00011, imm, 0b100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1038
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1039
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1040
  void dmb(barrier imm) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1041
    system(0b00, 0b011, 0b00011, imm, 0b101);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1042
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1043
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1044
  void isb() {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1045
    system(0b00, 0b011, 0b00011, SY, 0b110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1046
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1047
38143
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1048
  void sys(int op1, int CRn, int CRm, int op2,
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1049
           Register rt = (Register)0b11111) {
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1050
    system(0b01, op1, CRn, CRm, op2, rt);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1051
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1052
38143
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1053
  // Only implement operations accessible from EL0 or higher, i.e.,
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1054
  //            op1    CRn    CRm    op2
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1055
  // IC IVAU     3      7      5      1
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1056
  // DC CVAC     3      7      10     1
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1057
  // DC CVAU     3      7      11     1
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1058
  // DC CIVAC    3      7      14     1
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1059
  // DC ZVA      3      7      4      1
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1060
  // So only deal with the CRm field.
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1061
  enum icache_maintenance {IVAU = 0b0101};
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1062
  enum dcache_maintenance {CVAC = 0b1010, CVAU = 0b1011, CIVAC = 0b1110, ZVA = 0b100};
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1063
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1064
  void dc(dcache_maintenance cm, Register Rt) {
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1065
    sys(0b011, 0b0111, cm, 0b001, Rt);
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1066
  }
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1067
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1068
  void ic(icache_maintenance cm, Register Rt) {
3b732f17ea7d 8155617: aarch64: ClearArray does not use DC ZVA
enevill
parents: 37269
diff changeset
  1069
    sys(0b011, 0b0111, cm, 0b001, Rt);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1070
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1071
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1072
  // A more convenient access to dmb for our purposes
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1073
  enum Membar_mask_bits {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1074
    // We can use ISH for a barrier because the ARM ARM says "This
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1075
    // architecture assumes that all Processing Elements that use the
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1076
    // same operating system or hypervisor are in the same Inner
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1077
    // Shareable shareability domain."
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1078
    StoreStore = ISHST,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1079
    LoadStore  = ISHLD,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1080
    LoadLoad   = ISHLD,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1081
    StoreLoad  = ISH,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1082
    AnyAny     = ISH
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1083
  };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1084
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1085
  void membar(Membar_mask_bits order_constraint) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1086
    dmb(Assembler::barrier(order_constraint));
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1087
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1088
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1089
  // Unconditional branch (register)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1090
  void branch_reg(Register R, int opc) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1091
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1092
    f(0b1101011, 31, 25);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1093
    f(opc, 24, 21);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1094
    f(0b11111000000, 20, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1095
    rf(R, 5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1096
    f(0b00000, 4, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1097
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1098
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1099
#define INSN(NAME, opc)                         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1100
  void NAME(Register R) {                       \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1101
    branch_reg(R, opc);                         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1102
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1103
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1104
  INSN(br, 0b0000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1105
  INSN(blr, 0b0001);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1106
  INSN(ret, 0b0010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1107
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1108
  void ret(void *p); // This forces a compile-time error for ret(0)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1109
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1110
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1111
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1112
#define INSN(NAME, opc)                         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1113
  void NAME() {                 \
36562
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1114
    branch_reg(dummy_reg, opc);         \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1115
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1116
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1117
  INSN(eret, 0b0100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1118
  INSN(drps, 0b0101);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1119
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1120
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1121
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1122
  // Load/store exclusive
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1123
  enum operand_size { byte, halfword, word, xword };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1124
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1125
  void load_store_exclusive(Register Rs, Register Rt1, Register Rt2,
36562
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1126
    Register Rn, enum operand_size sz, int op, bool ordered) {
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1127
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1128
    f(sz, 31, 30), f(0b001000, 29, 24), f(op, 23, 21);
53368
91f56aee3928 8216350: AArch64: monitor unlock fast path not called
ngasson
parents: 53244
diff changeset
  1129
    rf(Rs, 16), f(ordered, 15), rf(Rt2, 10), srf(Rn, 5), zrf(Rt1, 0);
36562
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1130
  }
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1131
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1132
  void load_exclusive(Register dst, Register addr,
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1133
                      enum operand_size sz, bool ordered) {
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1134
    load_store_exclusive(dummy_reg, dst, dummy_reg, addr,
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1135
                         sz, 0b010, ordered);
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1136
  }
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1137
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1138
  void store_exclusive(Register status, Register new_val, Register addr,
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1139
                       enum operand_size sz, bool ordered) {
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1140
    load_store_exclusive(status, new_val, dummy_reg, addr,
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1141
                         sz, 0b000, ordered);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1142
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1143
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1144
#define INSN4(NAME, sz, op, o0) /* Four registers */                    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1145
  void NAME(Register Rs, Register Rt1, Register Rt2, Register Rn) {     \
32395
13b0caf18153 8133352: aarch64: generates constrained unpredictable instructions
enevill
parents: 31961
diff changeset
  1146
    guarantee(Rs != Rn && Rs != Rt1 && Rs != Rt2, "unpredictable instruction"); \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1147
    load_store_exclusive(Rs, Rt1, Rt2, Rn, sz, op, o0);                 \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1148
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1149
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1150
#define INSN3(NAME, sz, op, o0) /* Three registers */                   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1151
  void NAME(Register Rs, Register Rt, Register Rn) {                    \
32395
13b0caf18153 8133352: aarch64: generates constrained unpredictable instructions
enevill
parents: 31961
diff changeset
  1152
    guarantee(Rs != Rn && Rs != Rt, "unpredictable instruction");       \
36562
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1153
    load_store_exclusive(Rs, Rt, dummy_reg, Rn, sz, op, o0); \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1154
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1155
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1156
#define INSN2(NAME, sz, op, o0) /* Two registers */                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1157
  void NAME(Register Rt, Register Rn) {                                 \
36562
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1158
    load_store_exclusive(dummy_reg, Rt, dummy_reg, \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1159
                         Rn, sz, op, o0);                               \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1160
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1161
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1162
#define INSN_FOO(NAME, sz, op, o0) /* Three registers, encoded differently */ \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1163
  void NAME(Register Rt1, Register Rt2, Register Rn) {                  \
32395
13b0caf18153 8133352: aarch64: generates constrained unpredictable instructions
enevill
parents: 31961
diff changeset
  1164
    guarantee(Rt1 != Rt2, "unpredictable instruction");                 \
36562
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1165
    load_store_exclusive(dummy_reg, Rt1, Rt2, Rn, sz, op, o0);          \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1166
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1167
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1168
  // bytes
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1169
  INSN3(stxrb, byte, 0b000, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1170
  INSN3(stlxrb, byte, 0b000, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1171
  INSN2(ldxrb, byte, 0b010, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1172
  INSN2(ldaxrb, byte, 0b010, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1173
  INSN2(stlrb, byte, 0b100, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1174
  INSN2(ldarb, byte, 0b110, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1175
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1176
  // halfwords
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1177
  INSN3(stxrh, halfword, 0b000, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1178
  INSN3(stlxrh, halfword, 0b000, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1179
  INSN2(ldxrh, halfword, 0b010, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1180
  INSN2(ldaxrh, halfword, 0b010, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1181
  INSN2(stlrh, halfword, 0b100, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1182
  INSN2(ldarh, halfword, 0b110, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1184
  // words
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1185
  INSN3(stxrw, word, 0b000, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1186
  INSN3(stlxrw, word, 0b000, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1187
  INSN4(stxpw, word, 0b001, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1188
  INSN4(stlxpw, word, 0b001, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1189
  INSN2(ldxrw, word, 0b010, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1190
  INSN2(ldaxrw, word, 0b010, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1191
  INSN_FOO(ldxpw, word, 0b011, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1192
  INSN_FOO(ldaxpw, word, 0b011, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1193
  INSN2(stlrw, word, 0b100, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1194
  INSN2(ldarw, word, 0b110, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1195
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1196
  // xwords
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1197
  INSN3(stxr, xword, 0b000, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1198
  INSN3(stlxr, xword, 0b000, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1199
  INSN4(stxp, xword, 0b001, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1200
  INSN4(stlxp, xword, 0b001, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1201
  INSN2(ldxr, xword, 0b010, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1202
  INSN2(ldaxr, xword, 0b010, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1203
  INSN_FOO(ldxp, xword, 0b011, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1204
  INSN_FOO(ldaxp, xword, 0b011, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1205
  INSN2(stlr, xword, 0b100, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1206
  INSN2(ldar, xword, 0b110, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1207
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1208
#undef INSN2
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1209
#undef INSN3
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1210
#undef INSN4
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1211
#undef INSN_FOO
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1212
36562
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1213
  // 8.1 Compare and swap extensions
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1214
  void lse_cas(Register Rs, Register Rt, Register Rn,
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1215
                        enum operand_size sz, bool a, bool r, bool not_pair) {
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1216
    starti;
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1217
    if (! not_pair) { // Pair
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1218
      assert(sz == word || sz == xword, "invalid size");
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1219
      /* The size bit is in bit 30, not 31 */
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1220
      sz = (operand_size)(sz == word ? 0b00:0b01);
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1221
    }
54453
7b5e2bc79e68 8221995: AARCH64: problems with CAS instructions encoding
dpochepk
parents: 54066
diff changeset
  1222
    f(sz, 31, 30), f(0b001000, 29, 24), f(not_pair ? 1 : 0, 23), f(a, 22), f(1, 21);
7b5e2bc79e68 8221995: AARCH64: problems with CAS instructions encoding
dpochepk
parents: 54066
diff changeset
  1223
    zrf(Rs, 16), f(r, 15), f(0b11111, 14, 10), srf(Rn, 5), zrf(Rt, 0);
36562
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1224
  }
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1225
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1226
  // CAS
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1227
#define INSN(NAME, a, r)                                                \
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1228
  void NAME(operand_size sz, Register Rs, Register Rt, Register Rn) {   \
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1229
    assert(Rs != Rn && Rs != Rt, "unpredictable instruction");          \
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1230
    lse_cas(Rs, Rt, Rn, sz, a, r, true);                                \
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1231
  }
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1232
  INSN(cas,    false, false)
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1233
  INSN(casa,   true,  false)
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1234
  INSN(casl,   false, true)
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1235
  INSN(casal,  true,  true)
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1236
#undef INSN
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1237
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1238
  // CASP
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1239
#define INSN(NAME, a, r)                                                \
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1240
  void NAME(operand_size sz, Register Rs, Register Rs1,                 \
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1241
            Register Rt, Register Rt1, Register Rn) {                   \
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1242
    assert((Rs->encoding() & 1) == 0 && (Rt->encoding() & 1) == 0 &&    \
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1243
           Rs->successor() == Rs1 && Rt->successor() == Rt1 &&          \
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1244
           Rs != Rn && Rs1 != Rn && Rs != Rt, "invalid registers");     \
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1245
    lse_cas(Rs, Rt, Rn, sz, a, r, false);                               \
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1246
  }
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1247
  INSN(casp,    false, false)
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1248
  INSN(caspa,   true,  false)
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1249
  INSN(caspl,   false, true)
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1250
  INSN(caspal,  true,  true)
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1251
#undef INSN
4d1e93624d6a 8150394: aarch64: add support for 8.1 LSE CAS instructions
enevill
parents: 35127
diff changeset
  1252
37269
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1253
  // 8.1 Atomic operations
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1254
  void lse_atomic(Register Rs, Register Rt, Register Rn,
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1255
                  enum operand_size sz, int op1, int op2, bool a, bool r) {
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1256
    starti;
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1257
    f(sz, 31, 30), f(0b111000, 29, 24), f(a, 23), f(r, 22), f(1, 21);
52922
91855ca077e3 8214961: AARCH64: wrong encoding for exclusive and atomic load/stores
dpochepk
parents: 52632
diff changeset
  1258
    rf(Rs, 16), f(op1, 15), f(op2, 14, 12), f(0, 11, 10), srf(Rn, 5), zrf(Rt, 0);
37269
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1259
  }
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1260
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1261
#define INSN(NAME, NAME_A, NAME_L, NAME_AL, op1, op2)                   \
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1262
  void NAME(operand_size sz, Register Rs, Register Rt, Register Rn) {   \
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1263
    lse_atomic(Rs, Rt, Rn, sz, op1, op2, false, false);                 \
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1264
  }                                                                     \
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1265
  void NAME_A(operand_size sz, Register Rs, Register Rt, Register Rn) { \
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1266
    lse_atomic(Rs, Rt, Rn, sz, op1, op2, true, false);                  \
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1267
  }                                                                     \
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1268
  void NAME_L(operand_size sz, Register Rs, Register Rt, Register Rn) { \
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1269
    lse_atomic(Rs, Rt, Rn, sz, op1, op2, false, true);                  \
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1270
  }                                                                     \
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1271
  void NAME_AL(operand_size sz, Register Rs, Register Rt, Register Rn) {\
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1272
    lse_atomic(Rs, Rt, Rn, sz, op1, op2, true, true);                   \
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1273
  }
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1274
  INSN(ldadd,  ldadda,  ldaddl,  ldaddal,  0, 0b000);
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1275
  INSN(ldbic,  ldbica,  ldbicl,  ldbical,  0, 0b001);
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1276
  INSN(ldeor,  ldeora,  ldeorl,  ldeoral,  0, 0b010);
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1277
  INSN(ldorr,  ldorra,  ldorrl,  ldorral,  0, 0b011);
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1278
  INSN(ldsmax, ldsmaxa, ldsmaxl, ldsmaxal, 0, 0b100);
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1279
  INSN(ldsmin, ldsmina, ldsminl, ldsminal, 0, 0b101);
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1280
  INSN(ldumax, ldumaxa, ldumaxl, ldumaxal, 0, 0b110);
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1281
  INSN(ldumin, ldumina, lduminl, lduminal, 0, 0b111);
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1282
  INSN(swp,    swpa,    swpl,    swpal,    1, 0b000);
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1283
#undef INSN
5c2c4e5bb067 8151775: aarch64: add support for 8.1 LSE atomic operations
enevill
parents: 36562
diff changeset
  1284
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1285
  // Load register (literal)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1286
#define INSN(NAME, opc, V)                                              \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1287
  void NAME(Register Rt, address dest) {                                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1288
    long offset = (dest - pc()) >> 2;                                   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1289
    starti;                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1290
    f(opc, 31, 30), f(0b011, 29, 27), f(V, 26), f(0b00, 25, 24),        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1291
      sf(offset, 23, 5);                                                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1292
    rf(Rt, 0);                                                          \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1293
  }                                                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1294
  void NAME(Register Rt, address dest, relocInfo::relocType rtype) {    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1295
    InstructionMark im(this);                                           \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1296
    guarantee(rtype == relocInfo::internal_word_type,                   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1297
              "only internal_word_type relocs make sense here");        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1298
    code_section()->relocate(inst_mark(), InternalAddress(dest).rspec()); \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1299
    NAME(Rt, dest);                                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1300
  }                                                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1301
  void NAME(Register Rt, Label &L) {                                    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1302
    wrap_label(Rt, L, &Assembler::NAME);                                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1303
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1304
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1305
  INSN(ldrw, 0b00, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1306
  INSN(ldr, 0b01, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1307
  INSN(ldrsw, 0b10, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1308
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1309
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1310
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1311
#define INSN(NAME, opc, V)                                              \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1312
  void NAME(FloatRegister Rt, address dest) {                           \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1313
    long offset = (dest - pc()) >> 2;                                   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1314
    starti;                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1315
    f(opc, 31, 30), f(0b011, 29, 27), f(V, 26), f(0b00, 25, 24),        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1316
      sf(offset, 23, 5);                                                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1317
    rf((Register)Rt, 0);                                                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1318
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1319
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1320
  INSN(ldrs, 0b00, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1321
  INSN(ldrd, 0b01, 1);
32574
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  1322
  INSN(ldrq, 0b10, 1);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1323
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1324
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1325
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1326
#define INSN(NAME, opc, V)                                              \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1327
  void NAME(address dest, prfop op = PLDL1KEEP) {                       \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1328
    long offset = (dest - pc()) >> 2;                                   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1329
    starti;                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1330
    f(opc, 31, 30), f(0b011, 29, 27), f(V, 26), f(0b00, 25, 24),        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1331
      sf(offset, 23, 5);                                                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1332
    f(op, 4, 0);                                                        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1333
  }                                                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1334
  void NAME(Label &L, prfop op = PLDL1KEEP) {                           \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1335
    wrap_label(L, op, &Assembler::NAME);                                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1336
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1337
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1338
  INSN(prfm, 0b11, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1339
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1340
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1341
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1342
  // Load/store
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1343
  void ld_st1(int opc, int p1, int V, int L,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1344
              Register Rt1, Register Rt2, Address adr, bool no_allocate) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1345
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1346
    f(opc, 31, 30), f(p1, 29, 27), f(V, 26), f(L, 22);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1347
    zrf(Rt2, 10), zrf(Rt1, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1348
    if (no_allocate) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1349
      adr.encode_nontemporal_pair(current);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1350
    } else {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1351
      adr.encode_pair(current);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1352
    }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1353
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1354
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1355
  // Load/store register pair (offset)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1356
#define INSN(NAME, size, p1, V, L, no_allocate)         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1357
  void NAME(Register Rt1, Register Rt2, Address adr) {  \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1358
    ld_st1(size, p1, V, L, Rt1, Rt2, adr, no_allocate); \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1359
   }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1360
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1361
  INSN(stpw, 0b00, 0b101, 0, 0, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1362
  INSN(ldpw, 0b00, 0b101, 0, 1, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1363
  INSN(ldpsw, 0b01, 0b101, 0, 1, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1364
  INSN(stp, 0b10, 0b101, 0, 0, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1365
  INSN(ldp, 0b10, 0b101, 0, 1, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1366
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1367
  // Load/store no-allocate pair (offset)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1368
  INSN(stnpw, 0b00, 0b101, 0, 0, true);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1369
  INSN(ldnpw, 0b00, 0b101, 0, 1, true);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1370
  INSN(stnp, 0b10, 0b101, 0, 0, true);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1371
  INSN(ldnp, 0b10, 0b101, 0, 1, true);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1372
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1373
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1374
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1375
#define INSN(NAME, size, p1, V, L, no_allocate)                         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1376
  void NAME(FloatRegister Rt1, FloatRegister Rt2, Address adr) {        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1377
    ld_st1(size, p1, V, L, (Register)Rt1, (Register)Rt2, adr, no_allocate); \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1378
   }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1379
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1380
  INSN(stps, 0b00, 0b101, 1, 0, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1381
  INSN(ldps, 0b00, 0b101, 1, 1, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1382
  INSN(stpd, 0b01, 0b101, 1, 0, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1383
  INSN(ldpd, 0b01, 0b101, 1, 1, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1384
  INSN(stpq, 0b10, 0b101, 1, 0, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1385
  INSN(ldpq, 0b10, 0b101, 1, 1, false);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1386
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1387
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1388
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1389
  // Load/store register (all modes)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1390
  void ld_st2(Register Rt, const Address &adr, int size, int op, int V = 0) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1391
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1392
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1393
    f(V, 26); // general reg?
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1394
    zrf(Rt, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1395
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1396
    // Encoding for literal loads is done here (rather than pushed
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1397
    // down into Address::encode) because the encoding of this
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1398
    // instruction is too different from all of the other forms to
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1399
    // make it worth sharing.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1400
    if (adr.getMode() == Address::literal) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1401
      assert(size == 0b10 || size == 0b11, "bad operand size in ldr");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1402
      assert(op == 0b01, "literal form can only be used with loads");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1403
      f(size & 0b01, 31, 30), f(0b011, 29, 27), f(0b00, 25, 24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1404
      long offset = (adr.target() - pc()) >> 2;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1405
      sf(offset, 23, 5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1406
      code_section()->relocate(pc(), adr.rspec());
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1407
      return;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1408
    }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1409
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1410
    f(size, 31, 30);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1411
    f(op, 23, 22); // str
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1412
    adr.encode(current);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1413
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1414
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1415
#define INSN(NAME, size, op)                            \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1416
  void NAME(Register Rt, const Address &adr) {          \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1417
    ld_st2(Rt, adr, size, op);                          \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1418
  }                                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1419
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1420
  INSN(str, 0b11, 0b00);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1421
  INSN(strw, 0b10, 0b00);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1422
  INSN(strb, 0b00, 0b00);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1423
  INSN(strh, 0b01, 0b00);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1424
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1425
  INSN(ldr, 0b11, 0b01);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1426
  INSN(ldrw, 0b10, 0b01);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1427
  INSN(ldrb, 0b00, 0b01);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1428
  INSN(ldrh, 0b01, 0b01);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1429
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1430
  INSN(ldrsb, 0b00, 0b10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1431
  INSN(ldrsbw, 0b00, 0b11);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1432
  INSN(ldrsh, 0b01, 0b10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1433
  INSN(ldrshw, 0b01, 0b11);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1434
  INSN(ldrsw, 0b10, 0b10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1435
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1436
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1437
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1438
#define INSN(NAME, size, op)                                    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1439
  void NAME(const Address &adr, prfop pfop = PLDL1KEEP) {       \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1440
    ld_st2((Register)pfop, adr, size, op);                      \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1441
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1442
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1443
  INSN(prfm, 0b11, 0b10); // FIXME: PRFM should not be used with
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1444
                          // writeback modes, but the assembler
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1445
                          // doesn't enfore that.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1446
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1447
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1448
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1449
#define INSN(NAME, size, op)                            \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1450
  void NAME(FloatRegister Rt, const Address &adr) {     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1451
    ld_st2((Register)Rt, adr, size, op, 1);             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1452
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1453
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1454
  INSN(strd, 0b11, 0b00);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1455
  INSN(strs, 0b10, 0b00);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1456
  INSN(ldrd, 0b11, 0b01);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1457
  INSN(ldrs, 0b10, 0b01);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1458
  INSN(strq, 0b00, 0b10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1459
  INSN(ldrq, 0x00, 0b11);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1460
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1461
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1462
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1463
  enum shift_kind { LSL, LSR, ASR, ROR };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1464
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1465
  void op_shifted_reg(unsigned decode,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1466
                      enum shift_kind kind, unsigned shift,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1467
                      unsigned size, unsigned op) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1468
    f(size, 31);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1469
    f(op, 30, 29);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1470
    f(decode, 28, 24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1471
    f(shift, 15, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1472
    f(kind, 23, 22);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1473
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1474
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1475
  // Logical (shifted register)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1476
#define INSN(NAME, size, op, N)                                 \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1477
  void NAME(Register Rd, Register Rn, Register Rm,              \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1478
            enum shift_kind kind = LSL, unsigned shift = 0) {   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1479
    starti;                                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1480
    f(N, 21);                                                   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1481
    zrf(Rm, 16), zrf(Rn, 5), zrf(Rd, 0);                        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1482
    op_shifted_reg(0b01010, kind, shift, size, op);             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1483
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1484
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1485
  INSN(andr, 1, 0b00, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1486
  INSN(orr, 1, 0b01, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1487
  INSN(eor, 1, 0b10, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1488
  INSN(ands, 1, 0b11, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1489
  INSN(andw, 0, 0b00, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1490
  INSN(orrw, 0, 0b01, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1491
  INSN(eorw, 0, 0b10, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1492
  INSN(andsw, 0, 0b11, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1493
55054
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1494
#undef INSN
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1495
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1496
#define INSN(NAME, size, op, N)                                         \
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1497
  void NAME(Register Rd, Register Rn, Register Rm,                      \
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1498
            enum shift_kind kind = LSL, unsigned shift = 0) {           \
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1499
    starti;                                                             \
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1500
    f(N, 21);                                                           \
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1501
    zrf(Rm, 16), zrf(Rn, 5), zrf(Rd, 0);                                \
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1502
    op_shifted_reg(0b01010, kind, shift, size, op);                     \
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1503
  }                                                                     \
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1504
                                                                        \
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1505
  /* These instructions have no immediate form. Provide an overload so  \
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1506
     that if anyone does try to use an immediate operand -- this has    \
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1507
     happened! -- we'll get a compile-time error. */                    \
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1508
  void NAME(Register Rd, Register Rn, unsigned imm,                     \
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1509
            enum shift_kind kind = LSL, unsigned shift = 0) {           \
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1510
    assert(false, " can't be used with immediate operand");             \
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1511
  }
78e49883146f 8224671: AArch64: mauve System.arraycopy test failure
aph
parents: 54960
diff changeset
  1512
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1513
  INSN(bic, 1, 0b00, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1514
  INSN(orn, 1, 0b01, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1515
  INSN(eon, 1, 0b10, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1516
  INSN(bics, 1, 0b11, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1517
  INSN(bicw, 0, 0b00, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1518
  INSN(ornw, 0, 0b01, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1519
  INSN(eonw, 0, 0b10, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1520
  INSN(bicsw, 0, 0b11, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1521
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1522
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1523
47773
6e3ab27f9144 8189176: AARCH64: Improve _updateBytesCRC32 intrinsic
dchuyko
parents: 47216
diff changeset
  1524
  // Aliases for short forms of orn
6e3ab27f9144 8189176: AARCH64: Improve _updateBytesCRC32 intrinsic
dchuyko
parents: 47216
diff changeset
  1525
void mvn(Register Rd, Register Rm,
6e3ab27f9144 8189176: AARCH64: Improve _updateBytesCRC32 intrinsic
dchuyko
parents: 47216
diff changeset
  1526
            enum shift_kind kind = LSL, unsigned shift = 0) {
6e3ab27f9144 8189176: AARCH64: Improve _updateBytesCRC32 intrinsic
dchuyko
parents: 47216
diff changeset
  1527
  orn(Rd, zr, Rm, kind, shift);
6e3ab27f9144 8189176: AARCH64: Improve _updateBytesCRC32 intrinsic
dchuyko
parents: 47216
diff changeset
  1528
}
6e3ab27f9144 8189176: AARCH64: Improve _updateBytesCRC32 intrinsic
dchuyko
parents: 47216
diff changeset
  1529
6e3ab27f9144 8189176: AARCH64: Improve _updateBytesCRC32 intrinsic
dchuyko
parents: 47216
diff changeset
  1530
void mvnw(Register Rd, Register Rm,
6e3ab27f9144 8189176: AARCH64: Improve _updateBytesCRC32 intrinsic
dchuyko
parents: 47216
diff changeset
  1531
            enum shift_kind kind = LSL, unsigned shift = 0) {
6e3ab27f9144 8189176: AARCH64: Improve _updateBytesCRC32 intrinsic
dchuyko
parents: 47216
diff changeset
  1532
  ornw(Rd, zr, Rm, kind, shift);
6e3ab27f9144 8189176: AARCH64: Improve _updateBytesCRC32 intrinsic
dchuyko
parents: 47216
diff changeset
  1533
}
6e3ab27f9144 8189176: AARCH64: Improve _updateBytesCRC32 intrinsic
dchuyko
parents: 47216
diff changeset
  1534
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1535
  // Add/subtract (shifted register)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1536
#define INSN(NAME, size, op)                            \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1537
  void NAME(Register Rd, Register Rn, Register Rm,      \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1538
            enum shift_kind kind, unsigned shift = 0) { \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1539
    starti;                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1540
    f(0, 21);                                           \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1541
    assert_cond(kind != ROR);                           \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1542
    zrf(Rd, 0), zrf(Rn, 5), zrf(Rm, 16);                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1543
    op_shifted_reg(0b01011, kind, shift, size, op);     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1544
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1545
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1546
  INSN(add, 1, 0b000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1547
  INSN(sub, 1, 0b10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1548
  INSN(addw, 0, 0b000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1549
  INSN(subw, 0, 0b10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1550
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1551
  INSN(adds, 1, 0b001);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1552
  INSN(subs, 1, 0b11);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1553
  INSN(addsw, 0, 0b001);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1554
  INSN(subsw, 0, 0b11);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1555
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1556
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1557
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1558
  // Add/subtract (extended register)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1559
#define INSN(NAME, op)                                                  \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1560
  void NAME(Register Rd, Register Rn, Register Rm,                      \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1561
           ext::operation option, int amount = 0) {                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1562
    starti;                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1563
    zrf(Rm, 16), srf(Rn, 5), srf(Rd, 0);                                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1564
    add_sub_extended_reg(op, 0b01011, Rd, Rn, Rm, 0b00, option, amount); \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1565
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1566
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1567
  void add_sub_extended_reg(unsigned op, unsigned decode,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1568
    Register Rd, Register Rn, Register Rm,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1569
    unsigned opt, ext::operation option, unsigned imm) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1570
    guarantee(imm <= 4, "shift amount must be < 4");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1571
    f(op, 31, 29), f(decode, 28, 24), f(opt, 23, 22), f(1, 21);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1572
    f(option, 15, 13), f(imm, 12, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1573
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1574
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1575
  INSN(addw, 0b000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1576
  INSN(subw, 0b010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1577
  INSN(add, 0b100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1578
  INSN(sub, 0b110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1579
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1580
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1581
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1582
#define INSN(NAME, op)                                                  \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1583
  void NAME(Register Rd, Register Rn, Register Rm,                      \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1584
           ext::operation option, int amount = 0) {                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1585
    starti;                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1586
    zrf(Rm, 16), srf(Rn, 5), zrf(Rd, 0);                                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1587
    add_sub_extended_reg(op, 0b01011, Rd, Rn, Rm, 0b00, option, amount); \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1588
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1589
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1590
  INSN(addsw, 0b001);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1591
  INSN(subsw, 0b011);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1592
  INSN(adds, 0b101);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1593
  INSN(subs, 0b111);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1594
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1595
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1596
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1597
  // Aliases for short forms of add and sub
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1598
#define INSN(NAME)                                      \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1599
  void NAME(Register Rd, Register Rn, Register Rm) {    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1600
    if (Rd == sp || Rn == sp)                           \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1601
      NAME(Rd, Rn, Rm, ext::uxtx);                      \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1602
    else                                                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1603
      NAME(Rd, Rn, Rm, LSL);                            \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1604
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1605
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1606
  INSN(addw);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1607
  INSN(subw);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1608
  INSN(add);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1609
  INSN(sub);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1610
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1611
  INSN(addsw);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1612
  INSN(subsw);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1613
  INSN(adds);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1614
  INSN(subs);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1615
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1616
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1617
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1618
  // Add/subtract (with carry)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1619
  void add_sub_carry(unsigned op, Register Rd, Register Rn, Register Rm) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1620
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1621
    f(op, 31, 29);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1622
    f(0b11010000, 28, 21);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1623
    f(0b000000, 15, 10);
30225
e9722ea461d4 8077615: AARCH64: Add C2 intrinsic for BigInteger::multiplyToLen() method
aph
parents: 29183
diff changeset
  1624
    zrf(Rm, 16), zrf(Rn, 5), zrf(Rd, 0);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1625
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1626
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1627
  #define INSN(NAME, op)                                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1628
    void NAME(Register Rd, Register Rn, Register Rm) {  \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1629
      add_sub_carry(op, Rd, Rn, Rm);                    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1630
    }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1631
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1632
  INSN(adcw, 0b000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1633
  INSN(adcsw, 0b001);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1634
  INSN(sbcw, 0b010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1635
  INSN(sbcsw, 0b011);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1636
  INSN(adc, 0b100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1637
  INSN(adcs, 0b101);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1638
  INSN(sbc,0b110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1639
  INSN(sbcs, 0b111);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1640
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1641
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1642
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1643
  // Conditional compare (both kinds)
50717
365e137617ff 8205474: AARCH64: wrong zr encoding for ccmp instruction
dpochepk
parents: 50644
diff changeset
  1644
  void conditional_compare(unsigned op, int o1, int o2, int o3,
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1645
                           Register Rn, unsigned imm5, unsigned nzcv,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1646
                           unsigned cond) {
50717
365e137617ff 8205474: AARCH64: wrong zr encoding for ccmp instruction
dpochepk
parents: 50644
diff changeset
  1647
    starti;
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1648
    f(op, 31, 29);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1649
    f(0b11010010, 28, 21);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1650
    f(cond, 15, 12);
50717
365e137617ff 8205474: AARCH64: wrong zr encoding for ccmp instruction
dpochepk
parents: 50644
diff changeset
  1651
    f(o1, 11);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1652
    f(o2, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1653
    f(o3, 4);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1654
    f(nzcv, 3, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1655
    f(imm5, 20, 16), rf(Rn, 5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1656
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1657
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1658
#define INSN(NAME, op)                                                  \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1659
  void NAME(Register Rn, Register Rm, int imm, Condition cond) {        \
50717
365e137617ff 8205474: AARCH64: wrong zr encoding for ccmp instruction
dpochepk
parents: 50644
diff changeset
  1660
    int regNumber = (Rm == zr ? 31 : (uintptr_t)Rm);                    \
365e137617ff 8205474: AARCH64: wrong zr encoding for ccmp instruction
dpochepk
parents: 50644
diff changeset
  1661
    conditional_compare(op, 0, 0, 0, Rn, regNumber, imm, cond);         \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1662
  }                                                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1663
                                                                        \
50717
365e137617ff 8205474: AARCH64: wrong zr encoding for ccmp instruction
dpochepk
parents: 50644
diff changeset
  1664
  void NAME(Register Rn, int imm5, int imm, Condition cond) {           \
365e137617ff 8205474: AARCH64: wrong zr encoding for ccmp instruction
dpochepk
parents: 50644
diff changeset
  1665
    conditional_compare(op, 1, 0, 0, Rn, imm5, imm, cond);              \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1666
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1667
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1668
  INSN(ccmnw, 0b001);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1669
  INSN(ccmpw, 0b011);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1670
  INSN(ccmn, 0b101);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1671
  INSN(ccmp, 0b111);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1672
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1673
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1674
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1675
  // Conditional select
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1676
  void conditional_select(unsigned op, unsigned op2,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1677
                          Register Rd, Register Rn, Register Rm,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1678
                          unsigned cond) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1679
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1680
    f(op, 31, 29);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1681
    f(0b11010100, 28, 21);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1682
    f(cond, 15, 12);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1683
    f(op2, 11, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1684
    zrf(Rm, 16), zrf(Rn, 5), rf(Rd, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1685
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1686
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1687
#define INSN(NAME, op, op2)                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1688
  void NAME(Register Rd, Register Rn, Register Rm, Condition cond) { \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1689
    conditional_select(op, op2, Rd, Rn, Rm, cond);                      \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1690
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1691
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1692
  INSN(cselw, 0b000, 0b00);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1693
  INSN(csincw, 0b000, 0b01);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1694
  INSN(csinvw, 0b010, 0b00);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1695
  INSN(csnegw, 0b010, 0b01);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1696
  INSN(csel, 0b100, 0b00);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1697
  INSN(csinc, 0b100, 0b01);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1698
  INSN(csinv, 0b110, 0b00);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1699
  INSN(csneg, 0b110, 0b01);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1700
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1701
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1702
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1703
  // Data processing
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1704
  void data_processing(unsigned op29, unsigned opcode,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1705
                       Register Rd, Register Rn) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1706
    f(op29, 31, 29), f(0b11010110, 28, 21);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1707
    f(opcode, 15, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1708
    rf(Rn, 5), rf(Rd, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1709
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1710
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1711
  // (1 source)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1712
#define INSN(NAME, op29, opcode2, opcode)       \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1713
  void NAME(Register Rd, Register Rn) {         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1714
    starti;                                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1715
    f(opcode2, 20, 16);                         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1716
    data_processing(op29, opcode, Rd, Rn);      \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1717
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1718
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1719
  INSN(rbitw,  0b010, 0b00000, 0b00000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1720
  INSN(rev16w, 0b010, 0b00000, 0b00001);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1721
  INSN(revw,   0b010, 0b00000, 0b00010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1722
  INSN(clzw,   0b010, 0b00000, 0b00100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1723
  INSN(clsw,   0b010, 0b00000, 0b00101);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1724
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1725
  INSN(rbit,   0b110, 0b00000, 0b00000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1726
  INSN(rev16,  0b110, 0b00000, 0b00001);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1727
  INSN(rev32,  0b110, 0b00000, 0b00010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1728
  INSN(rev,    0b110, 0b00000, 0b00011);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1729
  INSN(clz,    0b110, 0b00000, 0b00100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1730
  INSN(cls,    0b110, 0b00000, 0b00101);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1731
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1732
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1733
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1734
  // (2 sources)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1735
#define INSN(NAME, op29, opcode)                        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1736
  void NAME(Register Rd, Register Rn, Register Rm) {    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1737
    starti;                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1738
    rf(Rm, 16);                                         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1739
    data_processing(op29, opcode, Rd, Rn);              \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1740
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1741
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1742
  INSN(udivw, 0b000, 0b000010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1743
  INSN(sdivw, 0b000, 0b000011);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1744
  INSN(lslvw, 0b000, 0b001000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1745
  INSN(lsrvw, 0b000, 0b001001);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1746
  INSN(asrvw, 0b000, 0b001010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1747
  INSN(rorvw, 0b000, 0b001011);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1748
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1749
  INSN(udiv, 0b100, 0b000010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1750
  INSN(sdiv, 0b100, 0b000011);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1751
  INSN(lslv, 0b100, 0b001000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1752
  INSN(lsrv, 0b100, 0b001001);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1753
  INSN(asrv, 0b100, 0b001010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1754
  INSN(rorv, 0b100, 0b001011);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1755
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1756
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1757
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1758
  // (3 sources)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1759
  void data_processing(unsigned op54, unsigned op31, unsigned o0,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1760
                       Register Rd, Register Rn, Register Rm,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1761
                       Register Ra) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1762
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1763
    f(op54, 31, 29), f(0b11011, 28, 24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1764
    f(op31, 23, 21), f(o0, 15);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1765
    zrf(Rm, 16), zrf(Ra, 10), zrf(Rn, 5), zrf(Rd, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1766
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1767
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1768
#define INSN(NAME, op54, op31, o0)                                      \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1769
  void NAME(Register Rd, Register Rn, Register Rm, Register Ra) {       \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1770
    data_processing(op54, op31, o0, Rd, Rn, Rm, Ra);                    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1771
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1772
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1773
  INSN(maddw, 0b000, 0b000, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1774
  INSN(msubw, 0b000, 0b000, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1775
  INSN(madd, 0b100, 0b000, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1776
  INSN(msub, 0b100, 0b000, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1777
  INSN(smaddl, 0b100, 0b001, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1778
  INSN(smsubl, 0b100, 0b001, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1779
  INSN(umaddl, 0b100, 0b101, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1780
  INSN(umsubl, 0b100, 0b101, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1781
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1782
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1783
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1784
#define INSN(NAME, op54, op31, o0)                      \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1785
  void NAME(Register Rd, Register Rn, Register Rm) {    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1786
    data_processing(op54, op31, o0, Rd, Rn, Rm, (Register)31);  \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1787
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1788
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1789
  INSN(smulh, 0b100, 0b010, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1790
  INSN(umulh, 0b100, 0b110, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1791
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1792
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1793
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1794
  // Floating-point data-processing (1 source)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1795
  void data_processing(unsigned op31, unsigned type, unsigned opcode,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1796
                       FloatRegister Vd, FloatRegister Vn) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1797
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1798
    f(op31, 31, 29);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1799
    f(0b11110, 28, 24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1800
    f(type, 23, 22), f(1, 21), f(opcode, 20, 15), f(0b10000, 14, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1801
    rf(Vn, 5), rf(Vd, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1802
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1803
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1804
#define INSN(NAME, op31, type, opcode)                  \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1805
  void NAME(FloatRegister Vd, FloatRegister Vn) {       \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1806
    data_processing(op31, type, opcode, Vd, Vn);        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1807
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1808
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1809
private:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1810
  INSN(i_fmovs, 0b000, 0b00, 0b000000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1811
public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1812
  INSN(fabss, 0b000, 0b00, 0b000001);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1813
  INSN(fnegs, 0b000, 0b00, 0b000010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1814
  INSN(fsqrts, 0b000, 0b00, 0b000011);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1815
  INSN(fcvts, 0b000, 0b00, 0b000101);   // Single-precision to double-precision
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1816
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1817
private:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1818
  INSN(i_fmovd, 0b000, 0b01, 0b000000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1819
public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1820
  INSN(fabsd, 0b000, 0b01, 0b000001);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1821
  INSN(fnegd, 0b000, 0b01, 0b000010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1822
  INSN(fsqrtd, 0b000, 0b01, 0b000011);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1823
  INSN(fcvtd, 0b000, 0b01, 0b000100);   // Double-precision to single-precision
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1824
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1825
  void fmovd(FloatRegister Vd, FloatRegister Vn) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1826
    assert(Vd != Vn, "should be");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1827
    i_fmovd(Vd, Vn);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1828
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1829
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1830
  void fmovs(FloatRegister Vd, FloatRegister Vn) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1831
    assert(Vd != Vn, "should be");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1832
    i_fmovs(Vd, Vn);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1833
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1834
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1835
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1836
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1837
  // Floating-point data-processing (2 source)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1838
  void data_processing(unsigned op31, unsigned type, unsigned opcode,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1839
                       FloatRegister Vd, FloatRegister Vn, FloatRegister Vm) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1840
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1841
    f(op31, 31, 29);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1842
    f(0b11110, 28, 24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1843
    f(type, 23, 22), f(1, 21), f(opcode, 15, 12), f(0b10, 11, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1844
    rf(Vm, 16), rf(Vn, 5), rf(Vd, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1845
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1846
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1847
#define INSN(NAME, op31, type, opcode)                  \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1848
  void NAME(FloatRegister Vd, FloatRegister Vn, FloatRegister Vm) {     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1849
    data_processing(op31, type, opcode, Vd, Vn, Vm);    \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1850
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1851
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1852
  INSN(fmuls, 0b000, 0b00, 0b0000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1853
  INSN(fdivs, 0b000, 0b00, 0b0001);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1854
  INSN(fadds, 0b000, 0b00, 0b0010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1855
  INSN(fsubs, 0b000, 0b00, 0b0011);
53041
f15af1e2c683 8212043: Add floating-point Math.min/max intrinsics
pli
parents: 52922
diff changeset
  1856
  INSN(fmaxs, 0b000, 0b00, 0b0100);
f15af1e2c683 8212043: Add floating-point Math.min/max intrinsics
pli
parents: 52922
diff changeset
  1857
  INSN(fmins, 0b000, 0b00, 0b0101);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1858
  INSN(fnmuls, 0b000, 0b00, 0b1000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1859
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1860
  INSN(fmuld, 0b000, 0b01, 0b0000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1861
  INSN(fdivd, 0b000, 0b01, 0b0001);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1862
  INSN(faddd, 0b000, 0b01, 0b0010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1863
  INSN(fsubd, 0b000, 0b01, 0b0011);
53041
f15af1e2c683 8212043: Add floating-point Math.min/max intrinsics
pli
parents: 52922
diff changeset
  1864
  INSN(fmaxd, 0b000, 0b01, 0b0100);
f15af1e2c683 8212043: Add floating-point Math.min/max intrinsics
pli
parents: 52922
diff changeset
  1865
  INSN(fmind, 0b000, 0b01, 0b0101);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1866
  INSN(fnmuld, 0b000, 0b01, 0b1000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1867
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1868
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1869
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1870
   // Floating-point data-processing (3 source)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1871
  void data_processing(unsigned op31, unsigned type, unsigned o1, unsigned o0,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1872
                       FloatRegister Vd, FloatRegister Vn, FloatRegister Vm,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1873
                       FloatRegister Va) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1874
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1875
    f(op31, 31, 29);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1876
    f(0b11111, 28, 24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1877
    f(type, 23, 22), f(o1, 21), f(o0, 15);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1878
    rf(Vm, 16), rf(Va, 10), rf(Vn, 5), rf(Vd, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1879
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1880
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1881
#define INSN(NAME, op31, type, o1, o0)                                  \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1882
  void NAME(FloatRegister Vd, FloatRegister Vn, FloatRegister Vm,       \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1883
            FloatRegister Va) {                                         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1884
    data_processing(op31, type, o1, o0, Vd, Vn, Vm, Va);                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1885
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1886
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1887
  INSN(fmadds, 0b000, 0b00, 0, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1888
  INSN(fmsubs, 0b000, 0b00, 0, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1889
  INSN(fnmadds, 0b000, 0b00, 1, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1890
  INSN(fnmsubs, 0b000, 0b00, 1, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1891
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1892
  INSN(fmaddd, 0b000, 0b01, 0, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1893
  INSN(fmsubd, 0b000, 0b01, 0, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1894
  INSN(fnmaddd, 0b000, 0b01, 1, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1895
  INSN(fnmsub, 0b000, 0b01, 1, 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1896
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1897
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1898
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1899
   // Floating-point conditional select
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1900
  void fp_conditional_select(unsigned op31, unsigned type,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1901
                             unsigned op1, unsigned op2,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1902
                             Condition cond, FloatRegister Vd,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1903
                             FloatRegister Vn, FloatRegister Vm) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1904
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1905
    f(op31, 31, 29);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1906
    f(0b11110, 28, 24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1907
    f(type, 23, 22);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1908
    f(op1, 21, 21);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1909
    f(op2, 11, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1910
    f(cond, 15, 12);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1911
    rf(Vm, 16), rf(Vn, 5), rf(Vd, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1912
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1913
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1914
#define INSN(NAME, op31, type, op1, op2)                                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1915
  void NAME(FloatRegister Vd, FloatRegister Vn,                         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1916
            FloatRegister Vm, Condition cond) {                         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1917
    fp_conditional_select(op31, type, op1, op2, cond, Vd, Vn, Vm);      \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1918
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1919
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1920
  INSN(fcsels, 0b000, 0b00, 0b1, 0b11);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1921
  INSN(fcseld, 0b000, 0b01, 0b1, 0b11);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1922
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1923
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1924
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1925
   // Floating-point<->integer conversions
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1926
  void float_int_convert(unsigned op31, unsigned type,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1927
                         unsigned rmode, unsigned opcode,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1928
                         Register Rd, Register Rn) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1929
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1930
    f(op31, 31, 29);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1931
    f(0b11110, 28, 24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1932
    f(type, 23, 22), f(1, 21), f(rmode, 20, 19);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1933
    f(opcode, 18, 16), f(0b000000, 15, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1934
    zrf(Rn, 5), zrf(Rd, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1935
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1936
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1937
#define INSN(NAME, op31, type, rmode, opcode)                           \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1938
  void NAME(Register Rd, FloatRegister Vn) {                            \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1939
    float_int_convert(op31, type, rmode, opcode, Rd, (Register)Vn);     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1940
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1941
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1942
  INSN(fcvtzsw, 0b000, 0b00, 0b11, 0b000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1943
  INSN(fcvtzs,  0b100, 0b00, 0b11, 0b000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1944
  INSN(fcvtzdw, 0b000, 0b01, 0b11, 0b000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1945
  INSN(fcvtzd,  0b100, 0b01, 0b11, 0b000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1946
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1947
  INSN(fmovs, 0b000, 0b00, 0b00, 0b110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1948
  INSN(fmovd, 0b100, 0b01, 0b00, 0b110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1949
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1950
  // INSN(fmovhid, 0b100, 0b10, 0b01, 0b110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1951
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1952
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1953
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1954
#define INSN(NAME, op31, type, rmode, opcode)                           \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1955
  void NAME(FloatRegister Vd, Register Rn) {                            \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1956
    float_int_convert(op31, type, rmode, opcode, (Register)Vd, Rn);     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1957
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1958
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1959
  INSN(fmovs, 0b000, 0b00, 0b00, 0b111);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1960
  INSN(fmovd, 0b100, 0b01, 0b00, 0b111);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1961
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1962
  INSN(scvtfws, 0b000, 0b00, 0b00, 0b010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1963
  INSN(scvtfs,  0b100, 0b00, 0b00, 0b010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1964
  INSN(scvtfwd, 0b000, 0b01, 0b00, 0b010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1965
  INSN(scvtfd,  0b100, 0b01, 0b00, 0b010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1966
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1967
  // INSN(fmovhid, 0b100, 0b10, 0b01, 0b111);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1968
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1969
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1970
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1971
  // Floating-point compare
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1972
  void float_compare(unsigned op31, unsigned type,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1973
                     unsigned op, unsigned op2,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1974
                     FloatRegister Vn, FloatRegister Vm = (FloatRegister)0) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1975
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1976
    f(op31, 31, 29);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1977
    f(0b11110, 28, 24);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1978
    f(type, 23, 22), f(1, 21);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1979
    f(op, 15, 14), f(0b1000, 13, 10), f(op2, 4, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1980
    rf(Vn, 5), rf(Vm, 16);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1981
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1982
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1983
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1984
#define INSN(NAME, op31, type, op, op2)                 \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1985
  void NAME(FloatRegister Vn, FloatRegister Vm) {       \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1986
    float_compare(op31, type, op, op2, Vn, Vm);         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1987
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1988
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1989
#define INSN1(NAME, op31, type, op, op2)        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1990
  void NAME(FloatRegister Vn, double d) {       \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1991
    assert_cond(d == 0.0);                      \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1992
    float_compare(op31, type, op, op2, Vn);     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1993
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1994
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1995
  INSN(fcmps, 0b000, 0b00, 0b00, 0b00000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1996
  INSN1(fcmps, 0b000, 0b00, 0b00, 0b01000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1997
  // INSN(fcmpes, 0b000, 0b00, 0b00, 0b10000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1998
  // INSN1(fcmpes, 0b000, 0b00, 0b00, 0b11000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  1999
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2000
  INSN(fcmpd, 0b000,   0b01, 0b00, 0b00000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2001
  INSN1(fcmpd, 0b000,  0b01, 0b00, 0b01000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2002
  // INSN(fcmped, 0b000,  0b01, 0b00, 0b10000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2003
  // INSN1(fcmped, 0b000, 0b01, 0b00, 0b11000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2004
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2005
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2006
#undef INSN1
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2007
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2008
  // Floating-point Move (immediate)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2009
private:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2010
  unsigned pack(double value);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2011
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2012
  void fmov_imm(FloatRegister Vn, double value, unsigned size) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2013
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2014
    f(0b00011110, 31, 24), f(size, 23, 22), f(1, 21);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2015
    f(pack(value), 20, 13), f(0b10000000, 12, 5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2016
    rf(Vn, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2017
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2018
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2019
public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2020
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2021
  void fmovs(FloatRegister Vn, double value) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2022
    if (value)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2023
      fmov_imm(Vn, value, 0b00);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2024
    else
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2025
      fmovs(Vn, zr);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2026
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2027
  void fmovd(FloatRegister Vn, double value) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2028
    if (value)
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2029
      fmov_imm(Vn, value, 0b01);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2030
    else
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2031
      fmovd(Vn, zr);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2032
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2033
50754
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2034
   // Floating-point rounding
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2035
   // type: half-precision = 11
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2036
   //       single         = 00
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2037
   //       double         = 01
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2038
   // rmode: A = Away     = 100
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2039
   //        I = current  = 111
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2040
   //        M = MinusInf = 010
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2041
   //        N = eveN     = 000
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2042
   //        P = PlusInf  = 001
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2043
   //        X = eXact    = 110
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2044
   //        Z = Zero     = 011
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2045
  void float_round(unsigned type, unsigned rmode, FloatRegister Rd, FloatRegister Rn) {
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2046
    starti;
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2047
    f(0b00011110, 31, 24);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2048
    f(type, 23, 22);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2049
    f(0b1001, 21, 18);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2050
    f(rmode, 17, 15);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2051
    f(0b10000, 14, 10);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2052
    rf(Rn, 5), rf(Rd, 0);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2053
  }
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2054
#define INSN(NAME, type, rmode)                   \
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2055
  void NAME(FloatRegister Vd, FloatRegister Vn) { \
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2056
    float_round(type, rmode, Vd, Vn);             \
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2057
  }
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2058
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2059
public:
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2060
  INSN(frintah, 0b11, 0b100);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2061
  INSN(frintih, 0b11, 0b111);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2062
  INSN(frintmh, 0b11, 0b010);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2063
  INSN(frintnh, 0b11, 0b000);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2064
  INSN(frintph, 0b11, 0b001);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2065
  INSN(frintxh, 0b11, 0b110);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2066
  INSN(frintzh, 0b11, 0b011);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2067
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2068
  INSN(frintas, 0b00, 0b100);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2069
  INSN(frintis, 0b00, 0b111);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2070
  INSN(frintms, 0b00, 0b010);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2071
  INSN(frintns, 0b00, 0b000);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2072
  INSN(frintps, 0b00, 0b001);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2073
  INSN(frintxs, 0b00, 0b110);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2074
  INSN(frintzs, 0b00, 0b011);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2075
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2076
  INSN(frintad, 0b01, 0b100);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2077
  INSN(frintid, 0b01, 0b111);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2078
  INSN(frintmd, 0b01, 0b010);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2079
  INSN(frintnd, 0b01, 0b000);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2080
  INSN(frintpd, 0b01, 0b001);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2081
  INSN(frintxd, 0b01, 0b110);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2082
  INSN(frintzd, 0b01, 0b011);
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2083
#undef INSN
ccb8aa083958 8189105: AARCH64: create intrinsic for sin and cos
dpochepk
parents: 50753
diff changeset
  2084
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2085
/* SIMD extensions
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2086
 *
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2087
 * We just use FloatRegister in the following. They are exactly the same
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2088
 * as SIMD registers.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2089
 */
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2090
 public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2091
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2092
  enum SIMD_Arrangement {
31961
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2093
       T8B, T16B, T4H, T8H, T2S, T4S, T1D, T2D, T1Q
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2094
  };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2095
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2096
  enum SIMD_RegVariant {
30890
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2097
       B, H, S, D, Q
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2098
  };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2099
50640
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2100
private:
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2101
  static short SIMD_Size_in_bytes[];
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2102
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2103
public:
30890
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2104
#define INSN(NAME, op)                                            \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2105
  void NAME(FloatRegister Rt, SIMD_RegVariant T, const Address &adr) {   \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2106
    ld_st2((Register)Rt, adr, (int)T & 3, op + ((T==Q) ? 0b10:0b00), 1); \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2107
  }                                                                      \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2108
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2109
  INSN(ldr, 1);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2110
  INSN(str, 0);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2111
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2112
#undef INSN
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2113
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2114
 private:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2115
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2116
  void ld_st(FloatRegister Vt, SIMD_Arrangement T, Register Xn, int op1, int op2) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2117
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2118
    f(0,31), f((int)T & 1, 30);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2119
    f(op1, 29, 21), f(0, 20, 16), f(op2, 15, 12);
49174
f842bb1e3885 8196868: AARCH64: ld/st instructions hit guarantee assert while using sp
dpochepk
parents: 48622
diff changeset
  2120
    f((int)T >> 1, 11, 10), srf(Xn, 5), rf(Vt, 0);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2121
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2122
  void ld_st(FloatRegister Vt, SIMD_Arrangement T, Register Xn,
50640
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2123
             int imm, int op1, int op2, int regs) {
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2124
    guarantee(T <= T1Q && imm == SIMD_Size_in_bytes[T] * regs, "bad offset");
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2125
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2126
    f(0,31), f((int)T & 1, 30);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2127
    f(op1 | 0b100, 29, 21), f(0b11111, 20, 16), f(op2, 15, 12);
49174
f842bb1e3885 8196868: AARCH64: ld/st instructions hit guarantee assert while using sp
dpochepk
parents: 48622
diff changeset
  2128
    f((int)T >> 1, 11, 10), srf(Xn, 5), rf(Vt, 0);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2129
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2130
  void ld_st(FloatRegister Vt, SIMD_Arrangement T, Register Xn,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2131
             Register Xm, int op1, int op2) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2132
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2133
    f(0,31), f((int)T & 1, 30);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2134
    f(op1 | 0b100, 29, 21), rf(Xm, 16), f(op2, 15, 12);
49174
f842bb1e3885 8196868: AARCH64: ld/st instructions hit guarantee assert while using sp
dpochepk
parents: 48622
diff changeset
  2135
    f((int)T >> 1, 11, 10), srf(Xn, 5), rf(Vt, 0);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2136
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2137
50640
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2138
  void ld_st(FloatRegister Vt, SIMD_Arrangement T, Address a, int op1, int op2, int regs) {
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2139
    switch (a.getMode()) {
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2140
    case Address::base_plus_offset:
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2141
      guarantee(a.offset() == 0, "no offset allowed here");
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2142
      ld_st(Vt, T, a.base(), op1, op2);
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2143
      break;
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2144
    case Address::post:
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2145
      ld_st(Vt, T, a.base(), a.offset(), op1, op2, regs);
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2146
      break;
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2147
    case Address::post_reg:
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2148
      ld_st(Vt, T, a.base(), a.index(), op1, op2);
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2149
      break;
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2150
    default:
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2151
      ShouldNotReachHere();
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2152
    }
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2153
  }
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2154
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2155
 public:
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2156
50640
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2157
#define INSN1(NAME, op1, op2)                                           \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2158
  void NAME(FloatRegister Vt, SIMD_Arrangement T, const Address &a) {   \
50640
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2159
    ld_st(Vt, T, a, op1, op2, 1);                                       \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2160
 }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2161
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2162
#define INSN2(NAME, op1, op2)                                           \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2163
  void NAME(FloatRegister Vt, FloatRegister Vt2, SIMD_Arrangement T, const Address &a) { \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2164
    assert(Vt->successor() == Vt2, "Registers must be ordered");        \
50640
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2165
    ld_st(Vt, T, a, op1, op2, 2);                                       \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2166
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2167
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2168
#define INSN3(NAME, op1, op2)                                           \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2169
  void NAME(FloatRegister Vt, FloatRegister Vt2, FloatRegister Vt3,     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2170
            SIMD_Arrangement T, const Address &a) {                     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2171
    assert(Vt->successor() == Vt2 && Vt2->successor() == Vt3,           \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2172
           "Registers must be ordered");                                \
50640
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2173
    ld_st(Vt, T, a, op1, op2, 3);                                       \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2174
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2175
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2176
#define INSN4(NAME, op1, op2)                                           \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2177
  void NAME(FloatRegister Vt, FloatRegister Vt2, FloatRegister Vt3,     \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2178
            FloatRegister Vt4, SIMD_Arrangement T, const Address &a) {  \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2179
    assert(Vt->successor() == Vt2 && Vt2->successor() == Vt3 &&         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2180
           Vt3->successor() == Vt4, "Registers must be ordered");       \
50640
a92d5b312116 8204473: AARCH64: register post-index addressing mode is not supported directly
dpochepk
parents: 50088
diff changeset
  2181
    ld_st(Vt, T, a, op1, op2, 4);                                       \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2182
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2184
  INSN1(ld1,  0b001100010, 0b0111);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2185
  INSN2(ld1,  0b001100010, 0b1010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2186
  INSN3(ld1,  0b001100010, 0b0110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2187
  INSN4(ld1,  0b001100010, 0b0010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2188
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2189
  INSN2(ld2,  0b001100010, 0b1000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2190
  INSN3(ld3,  0b001100010, 0b0100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2191
  INSN4(ld4,  0b001100010, 0b0000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2192
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2193
  INSN1(st1,  0b001100000, 0b0111);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2194
  INSN2(st1,  0b001100000, 0b1010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2195
  INSN3(st1,  0b001100000, 0b0110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2196
  INSN4(st1,  0b001100000, 0b0010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2197
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2198
  INSN2(st2,  0b001100000, 0b1000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2199
  INSN3(st3,  0b001100000, 0b0100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2200
  INSN4(st4,  0b001100000, 0b0000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2201
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2202
  INSN1(ld1r, 0b001101010, 0b1100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2203
  INSN2(ld2r, 0b001101011, 0b1100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2204
  INSN3(ld3r, 0b001101010, 0b1110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2205
  INSN4(ld4r, 0b001101011, 0b1110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2206
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2207
#undef INSN1
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2208
#undef INSN2
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2209
#undef INSN3
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2210
#undef INSN4
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2211
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2212
#define INSN(NAME, opc)                                                                 \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2213
  void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm) { \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2214
    starti;                                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2215
    assert(T == T8B || T == T16B, "must be T8B or T16B");                               \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2216
    f(0, 31), f((int)T & 1, 30), f(opc, 29, 21);                                        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2217
    rf(Vm, 16), f(0b000111, 15, 10), rf(Vn, 5), rf(Vd, 0);                              \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2218
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2219
30890
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2220
  INSN(eor,  0b101110001);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2221
  INSN(orr,  0b001110101);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2222
  INSN(andr, 0b001110001);
30890
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2223
  INSN(bic,  0b001110011);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2224
  INSN(bif,  0b101110111);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2225
  INSN(bit,  0b101110101);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2226
  INSN(bsl,  0b101110011);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2227
  INSN(orn,  0b001110111);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2228
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2229
#undef INSN
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2230
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2231
#define INSN(NAME, opc, opc2)                                                                 \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2232
  void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm) { \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2233
    starti;                                                                             \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2234
    f(0, 31), f((int)T & 1, 30), f(opc, 29), f(0b01110, 28, 24);                        \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2235
    f((int)T >> 1, 23, 22), f(1, 21), rf(Vm, 16), f(opc2, 15, 10);                      \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2236
    rf(Vn, 5), rf(Vd, 0);                                                               \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2237
  }
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2238
53950
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2239
  INSN(addv,   0, 0b100001);
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2240
  INSN(subv,   1, 0b100001);
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2241
  INSN(mulv,   0, 0b100111);
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2242
  INSN(mlav,   0, 0b100101);
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2243
  INSN(mlsv,   1, 0b100101);
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2244
  INSN(sshl,   0, 0b010001);
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2245
  INSN(ushl,   1, 0b010001);
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2246
  INSN(umullv, 1, 0b110000);
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2247
  INSN(umlalv, 1, 0b100000);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2248
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2249
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2250
30890
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2251
#define INSN(NAME, opc, opc2) \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2252
  void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) {                   \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2253
    starti;                                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2254
    f(0, 31), f((int)T & 1, 30), f(opc, 29), f(0b01110, 28, 24);                        \
30890
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2255
    f((int)T >> 1, 23, 22), f(opc2, 21, 10);                                            \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2256
    rf(Vn, 5), rf(Vd, 0);                                                               \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2257
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2258
53950
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2259
  INSN(absr,   0, 0b100000101110);
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2260
  INSN(negr,   1, 0b100000101110);
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2261
  INSN(notr,   1, 0b100000010110);
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2262
  INSN(addv,   0, 0b110001101110);
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2263
  INSN(cls,    0, 0b100000010010);
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2264
  INSN(clz,    1, 0b100000010010);
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2265
  INSN(cnt,    0, 0b100000010110);
cf47efcf7771 8216259: AArch64: Vectorize Adler32 intrinsics
pli
parents: 53368
diff changeset
  2266
  INSN(uaddlv, 1, 0b110000001110);
30890
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2267
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2268
#undef INSN
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2269
54066
1dbe0c210134 8214922: Add vectorization support for fmin/fmax
pli
parents: 53950
diff changeset
  2270
#define INSN(NAME, opc) \
1dbe0c210134 8214922: Add vectorization support for fmin/fmax
pli
parents: 53950
diff changeset
  2271
  void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) {                  \
1dbe0c210134 8214922: Add vectorization support for fmin/fmax
pli
parents: 53950
diff changeset
  2272
    starti;                                                                            \
1dbe0c210134 8214922: Add vectorization support for fmin/fmax
pli
parents: 53950
diff changeset
  2273
    assert(T == T4S, "arrangement must be T4S");                                       \
1dbe0c210134 8214922: Add vectorization support for fmin/fmax
pli
parents: 53950
diff changeset
  2274
    f(0, 31), f((int)T & 1, 30), f(0b101110, 29, 24), f(opc, 23),                      \
1dbe0c210134 8214922: Add vectorization support for fmin/fmax
pli
parents: 53950
diff changeset
  2275
    f(T == T4S ? 0 : 1, 22), f(0b110000111110, 21, 10); rf(Vn, 5), rf(Vd, 0);          \
1dbe0c210134 8214922: Add vectorization support for fmin/fmax
pli
parents: 53950
diff changeset
  2276
  }
1dbe0c210134 8214922: Add vectorization support for fmin/fmax
pli
parents: 53950
diff changeset
  2277
1dbe0c210134 8214922: Add vectorization support for fmin/fmax
pli
parents: 53950
diff changeset
  2278
  INSN(fmaxv, 0);
1dbe0c210134 8214922: Add vectorization support for fmin/fmax
pli
parents: 53950
diff changeset
  2279
  INSN(fminv, 1);
1dbe0c210134 8214922: Add vectorization support for fmin/fmax
pli
parents: 53950
diff changeset
  2280
1dbe0c210134 8214922: Add vectorization support for fmin/fmax
pli
parents: 53950
diff changeset
  2281
#undef INSN
1dbe0c210134 8214922: Add vectorization support for fmin/fmax
pli
parents: 53950
diff changeset
  2282
30890
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2283
#define INSN(NAME, op0, cmode0) \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2284
  void NAME(FloatRegister Vd, SIMD_Arrangement T, unsigned imm8, unsigned lsl = 0) {   \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2285
    unsigned cmode = cmode0;                                                           \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2286
    unsigned op = op0;                                                                 \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2287
    starti;                                                                            \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2288
    assert(lsl == 0 ||                                                                 \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2289
           ((T == T4H || T == T8H) && lsl == 8) ||                                     \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2290
           ((T == T2S || T == T4S) && ((lsl >> 3) < 4)), "invalid shift");             \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2291
    cmode |= lsl >> 2;                                                                 \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2292
    if (T == T4H || T == T8H) cmode |= 0b1000;                                         \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2293
    if (!(T == T4H || T == T8H || T == T2S || T == T4S)) {                             \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2294
      assert(op == 0 && cmode0 == 0, "must be MOVI");                                  \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2295
      cmode = 0b1110;                                                                  \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2296
      if (T == T1D || T == T2D) op = 1;                                                \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2297
    }                                                                                  \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2298
    f(0, 31), f((int)T & 1, 30), f(op, 29), f(0b0111100000, 28, 19);                   \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2299
    f(imm8 >> 5, 18, 16), f(cmode, 15, 12), f(0x01, 11, 10), f(imm8 & 0b11111, 9, 5);  \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2300
    rf(Vd, 0);                                                                         \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2301
  }
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2302
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2303
  INSN(movi, 0, 0);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2304
  INSN(orri, 0, 1);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2305
  INSN(mvni, 1, 0);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2306
  INSN(bici, 1, 1);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2307
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2308
#undef INSN
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2309
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2310
#define INSN(NAME, op1, op2, op3) \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2311
  void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm) { \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2312
    starti;                                                                             \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2313
    assert(T == T2S || T == T4S || T == T2D, "invalid arrangement");                    \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2314
    f(0, 31), f((int)T & 1, 30), f(op1, 29), f(0b01110, 28, 24), f(op2, 23);            \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2315
    f(T==T2D ? 1:0, 22); f(1, 21), rf(Vm, 16), f(op3, 15, 10), rf(Vn, 5), rf(Vd, 0);    \
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2316
  }
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2317
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2318
  INSN(fadd, 0, 0, 0b110101);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2319
  INSN(fdiv, 1, 0, 0b111111);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2320
  INSN(fmul, 1, 0, 0b110111);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2321
  INSN(fsub, 0, 1, 0b110101);
46606
211fbfdbc30b 8182583: AArch64: FMA Vectorization on aarch64
njian
parents: 42605
diff changeset
  2322
  INSN(fmla, 0, 0, 0b110011);
211fbfdbc30b 8182583: AArch64: FMA Vectorization on aarch64
njian
parents: 42605
diff changeset
  2323
  INSN(fmls, 0, 1, 0b110011);
54066
1dbe0c210134 8214922: Add vectorization support for fmin/fmax
pli
parents: 53950
diff changeset
  2324
  INSN(fmax, 0, 0, 0b111101);
1dbe0c210134 8214922: Add vectorization support for fmin/fmax
pli
parents: 53950
diff changeset
  2325
  INSN(fmin, 0, 1, 0b111101);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2326
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2327
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2328
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2329
#define INSN(NAME, opc)                                                                 \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2330
  void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm) { \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2331
    starti;                                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2332
    assert(T == T4S, "arrangement must be T4S");                                        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2333
    f(0b01011110000, 31, 21), rf(Vm, 16), f(opc, 15, 10), rf(Vn, 5), rf(Vd, 0);         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2334
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2335
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2336
  INSN(sha1c,     0b000000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2337
  INSN(sha1m,     0b001000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2338
  INSN(sha1p,     0b000100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2339
  INSN(sha1su0,   0b001100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2340
  INSN(sha256h2,  0b010100);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2341
  INSN(sha256h,   0b010000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2342
  INSN(sha256su1, 0b011000);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2343
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2344
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2345
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2346
#define INSN(NAME, opc)                                                                 \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2347
  void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) {                   \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2348
    starti;                                                                             \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2349
    assert(T == T4S, "arrangement must be T4S");                                        \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2350
    f(0b0101111000101000, 31, 16), f(opc, 15, 10), rf(Vn, 5), rf(Vd, 0);                \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2351
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2352
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2353
  INSN(sha1h,     0b000010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2354
  INSN(sha1su1,   0b000110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2355
  INSN(sha256su0, 0b001010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2356
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2357
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2358
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2359
#define INSN(NAME, opc)                           \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2360
  void NAME(FloatRegister Vd, FloatRegister Vn) { \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2361
    starti;                                       \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2362
    f(opc, 31, 10), rf(Vn, 5), rf(Vd, 0);         \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2363
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2364
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2365
  INSN(aese, 0b0100111000101000010010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2366
  INSN(aesd, 0b0100111000101000010110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2367
  INSN(aesmc, 0b0100111000101000011010);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2368
  INSN(aesimc, 0b0100111000101000011110);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2369
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2370
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2371
50753
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2372
#define INSN(NAME, op1, op2) \
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2373
  void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm, int index = 0) { \
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2374
    starti;                                                                                            \
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2375
    assert(T == T2S || T == T4S || T == T2D, "invalid arrangement");                                   \
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2376
    assert(index >= 0 && ((T == T2D && index <= 1) || (T != T2D && index <= 3)), "invalid index");     \
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2377
    f(0, 31), f((int)T & 1, 30), f(op1, 29); f(0b011111, 28, 23);                                      \
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2378
    f(T == T2D ? 1 : 0, 22), f(T == T2D ? 0 : index & 1, 21), rf(Vm, 16);                              \
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2379
    f(op2, 15, 12), f(T == T2D ? index : (index >> 1), 11), f(0, 10);                                  \
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2380
    rf(Vn, 5), rf(Vd, 0);                                                                              \
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2381
  }
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2382
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2383
  // FMLA/FMLS - Vector - Scalar
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2384
  INSN(fmlavs, 0, 0b0001);
51707
8c7198cac800 8210578: AArch64: Invalid encoding for fmlsvs instruction
adinn
parents: 51383
diff changeset
  2385
  INSN(fmlsvs, 0, 0b0101);
50753
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2386
  // FMULX - Vector - Scalar
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2387
  INSN(fmulxvs, 1, 0b1001);
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2388
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2389
#undef INSN
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2390
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2391
  // Floating-point Reciprocal Estimate
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2392
  void frecpe(FloatRegister Vd, FloatRegister Vn, SIMD_RegVariant type) {
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2393
    assert(type == D || type == S, "Wrong type for frecpe");
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2394
    starti;
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2395
    f(0b010111101, 31, 23);
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2396
    f(type == D ? 1 : 0, 22);
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2397
    f(0b100001110110, 21, 10);
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2398
    rf(Vn, 5), rf(Vd, 0);
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2399
  }
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2400
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2401
  // (double) {a, b} -> (a + b)
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2402
  void faddpd(FloatRegister Vd, FloatRegister Vn) {
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2403
    starti;
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2404
    f(0b0111111001110000110110, 31, 10);
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2405
    rf(Vn, 5), rf(Vd, 0);
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2406
  }
4449b45900f1 8196402: AARCH64: create intrinsic for Math.log
dpochepk
parents: 50717
diff changeset
  2407
30890
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2408
  void ins(FloatRegister Vd, SIMD_RegVariant T, FloatRegister Vn, int didx, int sidx) {
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2409
    starti;
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2410
    assert(T != Q, "invalid register variant");
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2411
    f(0b01101110000, 31, 21), f(((didx<<1)|1)<<(int)T, 20, 16), f(0, 15);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2412
    f(sidx<<(int)T, 14, 11), f(1, 10), rf(Vn, 5), rf(Vd, 0);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2413
  }
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2414
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2415
  void umov(Register Rd, FloatRegister Vn, SIMD_RegVariant T, int idx) {
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2416
    starti;
30890
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2417
    f(0, 31), f(T==D ? 1:0, 30), f(0b001110000, 29, 21);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2418
    f(((idx<<1)|1)<<(int)T, 20, 16), f(0b001111, 15, 10);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2419
    rf(Vn, 5), rf(Rd, 0);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2420
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2421
48622
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2422
#define INSN(NAME, opc, opc2, isSHR)                                    \
38003
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2423
  void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, int shift){ \
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2424
    starti;                                                             \
48622
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2425
    /* The encodings for the immh:immb fields (bits 22:16) in *SHR are  \
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2426
     *   0001 xxx       8B/16B, shift = 16  - UInt(immh:immb)           \
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2427
     *   001x xxx       4H/8H,  shift = 32  - UInt(immh:immb)           \
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2428
     *   01xx xxx       2S/4S,  shift = 64  - UInt(immh:immb)           \
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2429
     *   1xxx xxx       1D/2D,  shift = 128 - UInt(immh:immb)           \
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2430
     *   (1D is RESERVED)                                               \
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2431
     * for SHL shift is calculated as:                                  \
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2432
     *   0001 xxx       8B/16B, shift = UInt(immh:immb) - 8             \
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2433
     *   001x xxx       4H/8H,  shift = UInt(immh:immb) - 16            \
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2434
     *   01xx xxx       2S/4S,  shift = UInt(immh:immb) - 32            \
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2435
     *   1xxx xxx       1D/2D,  shift = UInt(immh:immb) - 64            \
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2436
     *   (1D is RESERVED)                                               \
38003
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2437
     */                                                                 \
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2438
    assert((1 << ((T>>1)+3)) > shift, "Invalid Shift value");           \
48622
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2439
    int cVal = (1 << (((T >> 1) + 3) + (isSHR ? 1 : 0)));               \
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2440
    int encodedShift = isSHR ? cVal - shift : cVal + shift;             \
38003
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2441
    f(0, 31), f(T & 1, 30), f(opc, 29), f(0b011110, 28, 23),            \
48622
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2442
    f(encodedShift, 22, 16); f(opc2, 15, 10), rf(Vn, 5), rf(Vd, 0);     \
30890
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2443
  }
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2444
48622
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2445
  INSN(shl,  0, 0b010101, /* isSHR = */ false);
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2446
  INSN(sshr, 0, 0b000001, /* isSHR = */ true);
a92a5a71364a 8194256: AARCH64: SIMD shift instructions are incorrectly encoded
dpochepk
parents: 48487
diff changeset
  2447
  INSN(ushr, 1, 0b000001, /* isSHR = */ true);
30890
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2448
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2449
#undef INSN
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2450
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2451
  void ushll(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2452
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2453
    /* The encodings for the immh:immb fields (bits 22:16) are
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2454
     *   0001 xxx       8H, 8B/16b shift = xxx
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2455
     *   001x xxx       4S, 4H/8H  shift = xxxx
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2456
     *   01xx xxx       2D, 2S/4S  shift = xxxxx
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2457
     *   1xxx xxx       RESERVED
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2458
     */
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2459
    assert((Tb >> 1) + 1 == (Ta >> 1), "Incompatible arrangement");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2460
    assert((1 << ((Tb>>1)+3)) > shift, "Invalid shift value");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2461
    f(0, 31), f(Tb & 1, 30), f(0b1011110, 29, 23), f((1 << ((Tb>>1)+3))|shift, 22, 16);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2462
    f(0b101001, 15, 10), rf(Vn, 5), rf(Vd, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2463
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2464
  void ushll2(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn,  SIMD_Arrangement Tb, int shift) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2465
    ushll(Vd, Ta, Vn, Tb, shift);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2466
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2467
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2468
  // Move from general purpose register
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2469
  //   mov  Vd.T[index], Rn
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2470
  void mov(FloatRegister Vd, SIMD_Arrangement T, int index, Register Xn) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2471
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2472
    f(0b01001110000, 31, 21), f(((1 << (T >> 1)) | (index << ((T >> 1) + 1))), 20, 16);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2473
    f(0b000111, 15, 10), rf(Xn, 5), rf(Vd, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2474
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2475
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2476
  // Move to general purpose register
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2477
  //   mov  Rd, Vn.T[index]
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2478
  void mov(Register Xd, FloatRegister Vn, SIMD_Arrangement T, int index) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2479
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2480
    f(0, 31), f((T >= T1D) ? 1:0, 30), f(0b001110000, 29, 21);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2481
    f(((1 << (T >> 1)) | (index << ((T >> 1) + 1))), 20, 16);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2482
    f(0b001111, 15, 10), rf(Vn, 5), rf(Xd, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2483
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2484
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2485
  void pmull(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, FloatRegister Vm, SIMD_Arrangement Tb) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2486
    starti;
31961
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2487
    assert((Ta == T1Q && (Tb == T1D || Tb == T2D)) ||
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2488
           (Ta == T8H && (Tb == T8B || Tb == T16B)), "Invalid Size specifier");
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2489
    int size = (Ta == T1Q) ? 0b11 : 0b00;
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2490
    f(0, 31), f(Tb & 1, 30), f(0b001110, 29, 24), f(size, 23, 22);
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2491
    f(1, 21), rf(Vm, 16), f(0b111000, 15, 10), rf(Vn, 5), rf(Vd, 0);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2492
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2493
  void pmull2(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, FloatRegister Vm, SIMD_Arrangement Tb) {
31961
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2494
    assert(Tb == T2D || Tb == T16B, "pmull2 assumes T2D or T16B as the second size specifier");
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2495
    pmull(Vd, Ta, Vn, Vm, Tb);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2496
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2497
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2498
  void uqxtn(FloatRegister Vd, SIMD_Arrangement Tb, FloatRegister Vn, SIMD_Arrangement Ta) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2499
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2500
    int size_b = (int)Tb >> 1;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2501
    int size_a = (int)Ta >> 1;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2502
    assert(size_b < 3 && size_b == size_a - 1, "Invalid size specifier");
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2503
    f(0, 31), f(Tb & 1, 30), f(0b101110, 29, 24), f(size_b, 23, 22);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2504
    f(0b100001010010, 21, 10), rf(Vn, 5), rf(Vd, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2505
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2506
30890
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2507
  void dup(FloatRegister Vd, SIMD_Arrangement T, Register Xs)
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2508
  {
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2509
    starti;
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2510
    assert(T != T1D, "reserved encoding");
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2511
    f(0,31), f((int)T & 1, 30), f(0b001110000, 29, 21);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2512
    f((1 << (T >> 1)), 20, 16), f(0b000011, 15, 10), rf(Xs, 5), rf(Vd, 0);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2513
  }
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2514
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2515
  void dup(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, int index = 0)
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2516
  {
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2517
    starti;
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2518
    assert(T != T1D, "reserved encoding");
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2519
    f(0, 31), f((int)T & 1, 30), f(0b001110000, 29, 21);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2520
    f(((1 << (T >> 1)) | (index << ((T >> 1) + 1))), 20, 16);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2521
    f(0b000001, 15, 10), rf(Vn, 5), rf(Vd, 0);
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2522
  }
dbbc65d3cd40 8079565: aarch64: Add vectorization support for aarch64
enevill
parents: 30225
diff changeset
  2523
38003
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2524
  // AdvSIMD ZIP/UZP/TRN
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2525
#define INSN(NAME, opcode)                                              \
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2526
  void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm) { \
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2527
    starti;                                                             \
50088
a2322c683d17 8202395: AARCH64: wrong encoding for SIMD instructions zip, trn, uzp
dpochepk
parents: 49723
diff changeset
  2528
    f(0, 31), f(0b001110, 29, 24), f(0, 21), f(0, 15);                  \
a2322c683d17 8202395: AARCH64: wrong encoding for SIMD instructions zip, trn, uzp
dpochepk
parents: 49723
diff changeset
  2529
    f(opcode, 14, 12), f(0b10, 11, 10);                                 \
38003
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2530
    rf(Vm, 16), rf(Vn, 5), rf(Vd, 0);                                   \
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2531
    f(T & 1, 30), f(T >> 1, 23, 22);                                    \
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2532
  }
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2533
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2534
  INSN(uzp1, 0b001);
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2535
  INSN(trn1, 0b010);
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2536
  INSN(zip1, 0b011);
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2537
  INSN(uzp2, 0b101);
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2538
  INSN(trn2, 0b110);
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2539
  INSN(zip2, 0b111);
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2540
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2541
#undef INSN
f84c8ee82ac8 8153310: AArch64: JEP 254: Implement byte_array_inflate
aph
parents: 37269
diff changeset
  2542
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2543
  // CRC32 instructions
31591
82134a118aea 8130687: aarch64: add support for hardware crc32c
enevill
parents: 31517
diff changeset
  2544
#define INSN(NAME, c, sf, sz)                                             \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2545
  void NAME(Register Rd, Register Rn, Register Rm) {                      \
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2546
    starti;                                                               \
31591
82134a118aea 8130687: aarch64: add support for hardware crc32c
enevill
parents: 31517
diff changeset
  2547
    f(sf, 31), f(0b0011010110, 30, 21), f(0b010, 15, 13), f(c, 12);       \
82134a118aea 8130687: aarch64: add support for hardware crc32c
enevill
parents: 31517
diff changeset
  2548
    f(sz, 11, 10), rf(Rm, 16), rf(Rn, 5), rf(Rd, 0);                      \
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2549
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2550
31591
82134a118aea 8130687: aarch64: add support for hardware crc32c
enevill
parents: 31517
diff changeset
  2551
  INSN(crc32b,  0, 0, 0b00);
82134a118aea 8130687: aarch64: add support for hardware crc32c
enevill
parents: 31517
diff changeset
  2552
  INSN(crc32h,  0, 0, 0b01);
82134a118aea 8130687: aarch64: add support for hardware crc32c
enevill
parents: 31517
diff changeset
  2553
  INSN(crc32w,  0, 0, 0b10);
82134a118aea 8130687: aarch64: add support for hardware crc32c
enevill
parents: 31517
diff changeset
  2554
  INSN(crc32x,  0, 1, 0b11);
82134a118aea 8130687: aarch64: add support for hardware crc32c
enevill
parents: 31517
diff changeset
  2555
  INSN(crc32cb, 1, 0, 0b00);
82134a118aea 8130687: aarch64: add support for hardware crc32c
enevill
parents: 31517
diff changeset
  2556
  INSN(crc32ch, 1, 0, 0b01);
82134a118aea 8130687: aarch64: add support for hardware crc32c
enevill
parents: 31517
diff changeset
  2557
  INSN(crc32cw, 1, 0, 0b10);
82134a118aea 8130687: aarch64: add support for hardware crc32c
enevill
parents: 31517
diff changeset
  2558
  INSN(crc32cx, 1, 1, 0b11);
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2559
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2560
#undef INSN
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2561
31961
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2562
  // Table vector lookup
32574
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2563
#define INSN(NAME, op)                                                  \
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2564
  void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, unsigned registers, FloatRegister Vm) { \
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2565
    starti;                                                             \
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2566
    assert(T == T8B || T == T16B, "invalid arrangement");               \
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2567
    assert(0 < registers && registers <= 4, "invalid number of registers"); \
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2568
    f(0, 31), f((int)T & 1, 30), f(0b001110000, 29, 21), rf(Vm, 16), f(0, 15); \
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2569
    f(registers - 1, 14, 13), f(op, 12),f(0b00, 11, 10), rf(Vn, 5), rf(Vd, 0); \
31961
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2570
  }
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2571
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2572
  INSN(tbl, 0);
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2573
  INSN(tbx, 1);
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2574
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2575
#undef INSN
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2576
32574
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2577
  // AdvSIMD two-reg misc
31961
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2578
#define INSN(NAME, U, opcode)                                                       \
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2579
  void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) {               \
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2580
       starti;                                                                      \
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2581
       assert((ASSERTION), MSG);                                                    \
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2582
       f(0, 31), f((int)T & 1, 30), f(U, 29), f(0b01110, 28, 24);                   \
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2583
       f((int)(T >> 1), 23, 22), f(0b10000, 21, 17), f(opcode, 16, 12);             \
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2584
       f(0b10, 11, 10), rf(Vn, 5), rf(Vd, 0);                                       \
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2585
 }
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2586
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2587
#define MSG "invalid arrangement"
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2588
33085
32f5ee7f0ba8 8135231: aarch64: add support for vectorizing double precision sqrt
enevill
parents: 32574
diff changeset
  2589
#define ASSERTION (T == T2S || T == T4S || T == T2D)
32f5ee7f0ba8 8135231: aarch64: add support for vectorizing double precision sqrt
enevill
parents: 32574
diff changeset
  2590
  INSN(fsqrt, 1, 0b11111);
33088
34fe49ecee13 8138583: aarch64: add support for vectorizing fabs/fneg
enevill
parents: 33085
diff changeset
  2591
  INSN(fabs,  0, 0b01111);
34fe49ecee13 8138583: aarch64: add support for vectorizing fabs/fneg
enevill
parents: 33085
diff changeset
  2592
  INSN(fneg,  1, 0b01111);
33085
32f5ee7f0ba8 8135231: aarch64: add support for vectorizing double precision sqrt
enevill
parents: 32574
diff changeset
  2593
#undef ASSERTION
32f5ee7f0ba8 8135231: aarch64: add support for vectorizing double precision sqrt
enevill
parents: 32574
diff changeset
  2594
31961
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2595
#define ASSERTION (T == T8B || T == T16B || T == T4H || T == T8H || T == T2S || T == T4S)
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2596
  INSN(rev64, 0, 0b00000);
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2597
#undef ASSERTION
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2598
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2599
#define ASSERTION (T == T8B || T == T16B || T == T4H || T == T8H)
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2600
  INSN(rev32, 1, 0b00000);
32574
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2601
private:
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2602
  INSN(_rbit, 1, 0b00101);
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2603
public:
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2604
31961
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2605
#undef ASSERTION
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2606
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2607
#define ASSERTION (T == T8B || T == T16B)
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2608
  INSN(rev16, 0, 0b00001);
32574
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2609
  // RBIT only allows T8B and T16B but encodes them oddly.  Argh...
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2610
  void rbit(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) {
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2611
    assert((ASSERTION), MSG);
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2612
    _rbit(Vd, SIMD_Arrangement(T & 1 | 0b010), Vn);
6c3b890aa5d9 8134869: AARCH64: GHASH intrinsic is not optimal
aph
parents: 32395
diff changeset
  2613
  }
31961
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2614
#undef ASSERTION
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2615
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2616
#undef MSG
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2617
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2618
#undef INSN
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2619
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2620
void ext(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm, int index)
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2621
  {
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2622
    starti;
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2623
    assert(T == T8B || T == T16B, "invalid arrangement");
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2624
    assert((T == T8B && index <= 0b0111) || (T == T16B && index <= 0b1111), "Invalid index value");
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2625
    f(0, 31), f((int)T & 1, 30), f(0b101110000, 29, 21);
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2626
    rf(Vm, 16), f(0, 15), f(index, 14, 11);
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2627
    f(0, 10), rf(Vn, 5), rf(Vd, 0);
70adcff5840c 8131062: aarch64: add support for GHASH acceleration
enevill
parents: 31863
diff changeset
  2628
  }
29183
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2629
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2630
/* Simulator extensions to the ISA
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2631
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2632
   haltsim
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2633
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2634
   takes no arguments, causes the sim to enter a debug break and then
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2635
   return from the simulator run() call with STATUS_HALT? The linking
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2636
   code will call fatal() when it sees STATUS_HALT.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2637
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2638
   blrt Xn, Wm
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2639
   blrt Xn, #gpargs, #fpargs, #type
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2640
   Xn holds the 64 bit x86 branch_address
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2641
   call format is encoded either as immediate data in the call
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2642
   or in register Wm. In the latter case
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2643
     Wm[13..6] = #gpargs,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2644
     Wm[5..2] = #fpargs,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2645
     Wm[1,0] = #type
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2646
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2647
   calls the x86 code address 'branch_address' supplied in Xn passing
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2648
   arguments taken from the general and floating point registers according
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2649
   to the supplied counts 'gpargs' and 'fpargs'. may return a result in r0
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2650
   or v0 according to the the return type #type' where
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2651
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2652
   address branch_address;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2653
   uimm4 gpargs;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2654
   uimm4 fpargs;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2655
   enum ReturnType type;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2656
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2657
   enum ReturnType
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2658
     {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2659
       void_ret = 0,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2660
       int_ret = 1,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2661
       long_ret = 1,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2662
       obj_ret = 1, // i.e. same as long
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2663
       float_ret = 2,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2664
       double_ret = 3
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2665
     }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2666
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2667
   notify
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2668
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2669
   notifies the simulator of a transfer of control. instr[14:0]
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2670
   identifies the type of change of control.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2671
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2672
   0 ==> initial entry to a method.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2673
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2674
   1 ==> return into a method from a submethod call.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2675
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2676
   2 ==> exit out of Java method code.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2677
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2678
   3 ==> start execution for a new bytecode.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2679
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2680
   in cases 1 and 2 the simulator is expected to use a JVM callback to
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2681
   identify the name of the specific method being executed. in case 4
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2682
   the simulator is expected to use a JVM callback to identify the
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2683
   bytecode index.
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2684
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2685
   Instruction encodings
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2686
   ---------------------
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2687
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2688
   These are encoded in the space with instr[28:25] = 00 which is
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2689
   unallocated. Encodings are
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2690
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2691
                     10987654321098765432109876543210
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2692
   PSEUDO_HALT   = 0x11100000000000000000000000000000
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2693
   PSEUDO_BLRT  = 0x11000000000000000_______________
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2694
   PSEUDO_BLRTR = 0x1100000000000000100000__________
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2695
   PSEUDO_NOTIFY = 0x10100000000000000_______________
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2696
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2697
   instr[31,29] = op1 : 111 ==> HALT, 110 ==> BLRT/BLRTR, 101 ==> NOTIFY
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2698
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2699
   for BLRT
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2700
     instr[14,11] = #gpargs, instr[10,7] = #fpargs
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2701
     instr[6,5] = #type, instr[4,0] = Rn
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2702
   for BLRTR
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2703
     instr[9,5] = Rm, instr[4,0] = Rn
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2704
   for NOTIFY
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2705
     instr[14:0] = type : 0 ==> entry, 1 ==> reentry, 2 ==> exit, 3 ==> bcstart
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2706
*/
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2707
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2708
  enum NotifyType { method_entry, method_reentry, method_exit, bytecode_start };
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2709
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2710
  virtual void notify(int type) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2711
    if (UseBuiltinSim) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2712
      starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2713
      //  109
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2714
      f(0b101, 31, 29);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2715
      //  87654321098765
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2716
      f(0b00000000000000, 28, 15);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2717
      f(type, 14, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2718
    }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2719
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2720
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2721
  void blrt(Register Rn, int gpargs, int fpargs, int type) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2722
    if (UseBuiltinSim) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2723
      starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2724
      f(0b110, 31 ,29);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2725
      f(0b00, 28, 25);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2726
      //  4321098765
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2727
      f(0b0000000000, 24, 15);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2728
      f(gpargs, 14, 11);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2729
      f(fpargs, 10, 7);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2730
      f(type, 6, 5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2731
      rf(Rn, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2732
    } else {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2733
      blr(Rn);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2734
    }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2735
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2736
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2737
  void blrt(Register Rn, Register Rm) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2738
    if (UseBuiltinSim) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2739
      starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2740
      f(0b110, 31 ,29);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2741
      f(0b00, 28, 25);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2742
      //  4321098765
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2743
      f(0b0000000001, 24, 15);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2744
      //  43210
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2745
      f(0b00000, 14, 10);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2746
      rf(Rm, 5);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2747
      rf(Rn, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2748
    } else {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2749
      blr(Rn);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2750
    }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2751
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2752
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2753
  void haltsim() {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2754
    starti;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2755
    f(0b111, 31 ,29);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2756
    f(0b00, 28, 27);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2757
    //  654321098765432109876543210
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2758
    f(0b000000000000000000000000000, 26, 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2759
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2760
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2761
  Assembler(CodeBuffer* code) : AbstractAssembler(code) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2762
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2763
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2764
  virtual RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2765
                                                Register tmp,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2766
                                                int offset) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2767
    ShouldNotCallThis();
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2768
    return RegisterOrConstant();
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2769
  }
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2770
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2771
  // Stack overflow checking
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2772
  virtual void bang_stack_with_offset(int offset);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2773
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2774
  static bool operand_valid_for_logical_immediate(bool is32, uint64_t imm);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2775
  static bool operand_valid_for_add_sub_immediate(long imm);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2776
  static bool operand_valid_for_float_immediate(double imm);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2777
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2778
  void emit_data64(jlong data, relocInfo::relocType rtype, int format = 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2779
  void emit_data64(jlong data, RelocationHolder const& rspec, int format = 0);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2780
};
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2781
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2782
inline Assembler::Membar_mask_bits operator|(Assembler::Membar_mask_bits a,
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2783
                                             Assembler::Membar_mask_bits b) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2784
  return Assembler::Membar_mask_bits(unsigned(a)|unsigned(b));
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2785
}
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2786
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2787
Instruction_aarch64::~Instruction_aarch64() {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2788
  assem->emit();
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2789
}
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2790
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2791
#undef starti
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2792
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2793
// Invert a condition
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2794
inline const Assembler::Condition operator~(const Assembler::Condition cond) {
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2795
  return Assembler::Condition(int(cond) ^ 1);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2796
}
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2797
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2798
class BiasedLockingCounters;
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2799
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2800
extern "C" void das(uint64_t start, int len);
0cc8699f7372 8068054: AARCH64: Assembler interpreter, shared runtime
aph
parents:
diff changeset
  2801
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 53041
diff changeset
  2802
#endif // CPU_AARCH64_ASSEMBLER_AARCH64_HPP