hotspot/src/cpu/aarch64/vm/aarch64.ad
author zmajo
Sat, 14 Mar 2015 11:21:04 +0100
changeset 29581 b8d83fef0c8e
parent 29214 cb399be02b39
child 29586 889895365eb9
child 30193 9bebcd39ab1f
permissions -rw-r--r--
8074869: C2 code generator can replace -0.0f with +0.0f on Linux Summary: Instead of 'fpclass', use cast float->int and double->long to check if value is +0.0f and +0.0d, respectively. Reviewed-by: kvn, simonis, dlong
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
     1
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
     2
// Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
     3
// Copyright (c) 2014, Red Hat Inc. All rights reserved.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
     4
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
     5
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
     6
// This code is free software; you can redistribute it and/or modify it
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
     7
// under the terms of the GNU General Public License version 2 only, as
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
     8
// published by the Free Software Foundation.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
     9
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    10
// This code is distributed in the hope that it will be useful, but WITHOUT
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    11
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    12
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    13
// version 2 for more details (a copy is included in the LICENSE file that
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    14
// accompanied this code).
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    15
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    16
// You should have received a copy of the GNU General Public License version
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    17
// 2 along with this work; if not, write to the Free Software Foundation,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    18
// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    19
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    20
// Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    21
// or visit www.oracle.com if you need additional information or have any
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    22
// questions.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    23
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    24
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    25
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    26
// AArch64 Architecture Description File
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    27
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    28
//----------REGISTER DEFINITION BLOCK------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    29
// This information is used by the matcher and the register allocator to
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    30
// describe individual registers and classes of registers within the target
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    31
// archtecture.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    32
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    33
register %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    34
//----------Architecture Description Register Definitions----------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    35
// General Registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    36
// "reg_def"  name ( register save type, C convention save type,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    37
//                   ideal register type, encoding );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    38
// Register Save Types:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    39
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    40
// NS  = No-Save:       The register allocator assumes that these registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    41
//                      can be used without saving upon entry to the method, &
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    42
//                      that they do not need to be saved at call sites.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    43
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    44
// SOC = Save-On-Call:  The register allocator assumes that these registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    45
//                      can be used without saving upon entry to the method,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    46
//                      but that they must be saved at call sites.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    47
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    48
// SOE = Save-On-Entry: The register allocator assumes that these registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    49
//                      must be saved before using them upon entry to the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    50
//                      method, but they do not need to be saved at call
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    51
//                      sites.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    52
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    53
// AS  = Always-Save:   The register allocator assumes that these registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    54
//                      must be saved before using them upon entry to the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    55
//                      method, & that they must be saved at call sites.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    56
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    57
// Ideal Register Type is used to determine how to save & restore a
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    58
// register.  Op_RegI will get spilled with LoadI/StoreI, Op_RegP will get
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    59
// spilled with LoadP/StoreP.  If the register supports both, use Op_RegI.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    60
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    61
// The encoding number is the actual bit-pattern placed into the opcodes.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    62
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    63
// We must define the 64 bit int registers in two 32 bit halves, the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    64
// real lower register and a virtual upper half register. upper halves
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    65
// are used by the register allocator but are not actually supplied as
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    66
// operands to memory ops.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    67
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    68
// follow the C1 compiler in making registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    69
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    70
//   r0-r7,r10-r26 volatile (caller save)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    71
//   r27-r32 system (no save, no allocate)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    72
//   r8-r9 invisible to the allocator (so we can use them as scratch regs)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    73
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    74
// as regards Java usage. we don't use any callee save registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    75
// because this makes it difficult to de-optimise a frame (see comment
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    76
// in x86 implementation of Deoptimization::unwind_callee_save_values)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    77
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    78
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    79
// General Registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    80
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    81
reg_def R0      ( SOC, SOC, Op_RegI,  0, r0->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    82
reg_def R0_H    ( SOC, SOC, Op_RegI,  0, r0->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    83
reg_def R1      ( SOC, SOC, Op_RegI,  1, r1->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    84
reg_def R1_H    ( SOC, SOC, Op_RegI,  1, r1->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    85
reg_def R2      ( SOC, SOC, Op_RegI,  2, r2->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    86
reg_def R2_H    ( SOC, SOC, Op_RegI,  2, r2->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    87
reg_def R3      ( SOC, SOC, Op_RegI,  3, r3->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    88
reg_def R3_H    ( SOC, SOC, Op_RegI,  3, r3->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    89
reg_def R4      ( SOC, SOC, Op_RegI,  4, r4->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    90
reg_def R4_H    ( SOC, SOC, Op_RegI,  4, r4->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    91
reg_def R5      ( SOC, SOC, Op_RegI,  5, r5->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    92
reg_def R5_H    ( SOC, SOC, Op_RegI,  5, r5->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    93
reg_def R6      ( SOC, SOC, Op_RegI,  6, r6->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    94
reg_def R6_H    ( SOC, SOC, Op_RegI,  6, r6->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    95
reg_def R7      ( SOC, SOC, Op_RegI,  7, r7->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    96
reg_def R7_H    ( SOC, SOC, Op_RegI,  7, r7->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    97
reg_def R10     ( SOC, SOC, Op_RegI, 10, r10->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    98
reg_def R10_H   ( SOC, SOC, Op_RegI, 10, r10->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
    99
reg_def R11     ( SOC, SOC, Op_RegI, 11, r11->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   100
reg_def R11_H   ( SOC, SOC, Op_RegI, 11, r11->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   101
reg_def R12     ( SOC, SOC, Op_RegI, 12, r12->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   102
reg_def R12_H   ( SOC, SOC, Op_RegI, 12, r12->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   103
reg_def R13     ( SOC, SOC, Op_RegI, 13, r13->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   104
reg_def R13_H   ( SOC, SOC, Op_RegI, 13, r13->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   105
reg_def R14     ( SOC, SOC, Op_RegI, 14, r14->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   106
reg_def R14_H   ( SOC, SOC, Op_RegI, 14, r14->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   107
reg_def R15     ( SOC, SOC, Op_RegI, 15, r15->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   108
reg_def R15_H   ( SOC, SOC, Op_RegI, 15, r15->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   109
reg_def R16     ( SOC, SOC, Op_RegI, 16, r16->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   110
reg_def R16_H   ( SOC, SOC, Op_RegI, 16, r16->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   111
reg_def R17     ( SOC, SOC, Op_RegI, 17, r17->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   112
reg_def R17_H   ( SOC, SOC, Op_RegI, 17, r17->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   113
reg_def R18     ( SOC, SOC, Op_RegI, 18, r18->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   114
reg_def R18_H   ( SOC, SOC, Op_RegI, 18, r18->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   115
reg_def R19     ( SOC, SOE, Op_RegI, 19, r19->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   116
reg_def R19_H   ( SOC, SOE, Op_RegI, 19, r19->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   117
reg_def R20     ( SOC, SOE, Op_RegI, 20, r20->as_VMReg()        ); // caller esp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   118
reg_def R20_H   ( SOC, SOE, Op_RegI, 20, r20->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   119
reg_def R21     ( SOC, SOE, Op_RegI, 21, r21->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   120
reg_def R21_H   ( SOC, SOE, Op_RegI, 21, r21->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   121
reg_def R22     ( SOC, SOE, Op_RegI, 22, r22->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   122
reg_def R22_H   ( SOC, SOE, Op_RegI, 22, r22->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   123
reg_def R23     ( SOC, SOE, Op_RegI, 23, r23->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   124
reg_def R23_H   ( SOC, SOE, Op_RegI, 23, r23->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   125
reg_def R24     ( SOC, SOE, Op_RegI, 24, r24->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   126
reg_def R24_H   ( SOC, SOE, Op_RegI, 24, r24->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   127
reg_def R25     ( SOC, SOE, Op_RegI, 25, r25->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   128
reg_def R25_H   ( SOC, SOE, Op_RegI, 25, r25->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   129
reg_def R26     ( SOC, SOE, Op_RegI, 26, r26->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   130
reg_def R26_H   ( SOC, SOE, Op_RegI, 26, r26->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   131
reg_def R27     (  NS, SOE, Op_RegI, 27, r27->as_VMReg()        ); // heapbase
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   132
reg_def R27_H   (  NS, SOE, Op_RegI, 27, r27->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   133
reg_def R28     (  NS, SOE, Op_RegI, 28, r28->as_VMReg()        ); // thread
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   134
reg_def R28_H   (  NS, SOE, Op_RegI, 28, r28->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   135
reg_def R29     (  NS,  NS, Op_RegI, 29, r29->as_VMReg()        ); // fp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   136
reg_def R29_H   (  NS,  NS, Op_RegI, 29, r29->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   137
reg_def R30     (  NS,  NS, Op_RegI, 30, r30->as_VMReg()        ); // lr
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   138
reg_def R30_H   (  NS,  NS, Op_RegI, 30, r30->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   139
reg_def R31     (  NS,  NS, Op_RegI, 31, r31_sp->as_VMReg()     ); // sp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   140
reg_def R31_H   (  NS,  NS, Op_RegI, 31, r31_sp->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   141
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   142
// ----------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   143
// Float/Double Registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   144
// ----------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   145
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   146
// Double Registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   147
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   148
// The rules of ADL require that double registers be defined in pairs.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   149
// Each pair must be two 32-bit values, but not necessarily a pair of
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   150
// single float registers. In each pair, ADLC-assigned register numbers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   151
// must be adjacent, with the lower number even. Finally, when the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   152
// CPU stores such a register pair to memory, the word associated with
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   153
// the lower ADLC-assigned number must be stored to the lower address.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   154
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   155
// AArch64 has 32 floating-point registers. Each can store a vector of
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   156
// single or double precision floating-point values up to 8 * 32
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   157
// floats, 4 * 64 bit floats or 2 * 128 bit floats.  We currently only
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   158
// use the first float or double element of the vector.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   159
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   160
// for Java use float registers v0-v15 are always save on call whereas
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   161
// the platform ABI treats v8-v15 as callee save). float registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   162
// v16-v31 are SOC as per the platform spec
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   163
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   164
  reg_def V0   ( SOC, SOC, Op_RegF,  0, v0->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   165
  reg_def V0_H ( SOC, SOC, Op_RegF,  0, v0->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   166
  reg_def V1   ( SOC, SOC, Op_RegF,  1, v1->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   167
  reg_def V1_H ( SOC, SOC, Op_RegF,  1, v1->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   168
  reg_def V2   ( SOC, SOC, Op_RegF,  2, v2->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   169
  reg_def V2_H ( SOC, SOC, Op_RegF,  2, v2->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   170
  reg_def V3   ( SOC, SOC, Op_RegF,  3, v3->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   171
  reg_def V3_H ( SOC, SOC, Op_RegF,  3, v3->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   172
  reg_def V4   ( SOC, SOC, Op_RegF,  4, v4->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   173
  reg_def V4_H ( SOC, SOC, Op_RegF,  4, v4->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   174
  reg_def V5   ( SOC, SOC, Op_RegF,  5, v5->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   175
  reg_def V5_H ( SOC, SOC, Op_RegF,  5, v5->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   176
  reg_def V6   ( SOC, SOC, Op_RegF,  6, v6->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   177
  reg_def V6_H ( SOC, SOC, Op_RegF,  6, v6->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   178
  reg_def V7   ( SOC, SOC, Op_RegF,  7, v7->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   179
  reg_def V7_H ( SOC, SOC, Op_RegF,  7, v7->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   180
  reg_def V8   ( SOC, SOE, Op_RegF,  8, v8->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   181
  reg_def V8_H ( SOC, SOE, Op_RegF,  8, v8->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   182
  reg_def V9   ( SOC, SOE, Op_RegF,  9, v9->as_VMReg()         );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   183
  reg_def V9_H ( SOC, SOE, Op_RegF,  9, v9->as_VMReg()->next() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   184
  reg_def V10  ( SOC, SOE, Op_RegF, 10, v10->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   185
  reg_def V10_H( SOC, SOE, Op_RegF, 10, v10->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   186
  reg_def V11  ( SOC, SOE, Op_RegF, 11, v11->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   187
  reg_def V11_H( SOC, SOE, Op_RegF, 11, v11->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   188
  reg_def V12  ( SOC, SOE, Op_RegF, 12, v12->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   189
  reg_def V12_H( SOC, SOE, Op_RegF, 12, v12->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   190
  reg_def V13  ( SOC, SOE, Op_RegF, 13, v13->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   191
  reg_def V13_H( SOC, SOE, Op_RegF, 13, v13->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   192
  reg_def V14  ( SOC, SOE, Op_RegF, 14, v14->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   193
  reg_def V14_H( SOC, SOE, Op_RegF, 14, v14->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   194
  reg_def V15  ( SOC, SOE, Op_RegF, 15, v15->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   195
  reg_def V15_H( SOC, SOE, Op_RegF, 15, v15->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   196
  reg_def V16  ( SOC, SOC, Op_RegF, 16, v16->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   197
  reg_def V16_H( SOC, SOC, Op_RegF, 16, v16->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   198
  reg_def V17  ( SOC, SOC, Op_RegF, 17, v17->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   199
  reg_def V17_H( SOC, SOC, Op_RegF, 17, v17->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   200
  reg_def V18  ( SOC, SOC, Op_RegF, 18, v18->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   201
  reg_def V18_H( SOC, SOC, Op_RegF, 18, v18->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   202
  reg_def V19  ( SOC, SOC, Op_RegF, 19, v19->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   203
  reg_def V19_H( SOC, SOC, Op_RegF, 19, v19->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   204
  reg_def V20  ( SOC, SOC, Op_RegF, 20, v20->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   205
  reg_def V20_H( SOC, SOC, Op_RegF, 20, v20->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   206
  reg_def V21  ( SOC, SOC, Op_RegF, 21, v21->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   207
  reg_def V21_H( SOC, SOC, Op_RegF, 21, v21->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   208
  reg_def V22  ( SOC, SOC, Op_RegF, 22, v22->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   209
  reg_def V22_H( SOC, SOC, Op_RegF, 22, v22->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   210
  reg_def V23  ( SOC, SOC, Op_RegF, 23, v23->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   211
  reg_def V23_H( SOC, SOC, Op_RegF, 23, v23->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   212
  reg_def V24  ( SOC, SOC, Op_RegF, 24, v24->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   213
  reg_def V24_H( SOC, SOC, Op_RegF, 24, v24->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   214
  reg_def V25  ( SOC, SOC, Op_RegF, 25, v25->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   215
  reg_def V25_H( SOC, SOC, Op_RegF, 25, v25->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   216
  reg_def V26  ( SOC, SOC, Op_RegF, 26, v26->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   217
  reg_def V26_H( SOC, SOC, Op_RegF, 26, v26->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   218
  reg_def V27  ( SOC, SOC, Op_RegF, 27, v27->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   219
  reg_def V27_H( SOC, SOC, Op_RegF, 27, v27->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   220
  reg_def V28  ( SOC, SOC, Op_RegF, 28, v28->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   221
  reg_def V28_H( SOC, SOC, Op_RegF, 28, v28->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   222
  reg_def V29  ( SOC, SOC, Op_RegF, 29, v29->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   223
  reg_def V29_H( SOC, SOC, Op_RegF, 29, v29->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   224
  reg_def V30  ( SOC, SOC, Op_RegF, 30, v30->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   225
  reg_def V30_H( SOC, SOC, Op_RegF, 30, v30->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   226
  reg_def V31  ( SOC, SOC, Op_RegF, 31, v31->as_VMReg()        );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   227
  reg_def V31_H( SOC, SOC, Op_RegF, 31, v31->as_VMReg()->next());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   228
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   229
// ----------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   230
// Special Registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   231
// ----------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   232
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   233
// the AArch64 CSPR status flag register is not directly acessible as
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   234
// instruction operand. the FPSR status flag register is a system
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   235
// register which can be written/read using MSR/MRS but again does not
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   236
// appear as an operand (a code identifying the FSPR occurs as an
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   237
// immediate value in the instruction).
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   238
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   239
reg_def RFLAGS(SOC, SOC, 0, 32, VMRegImpl::Bad());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   240
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   241
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   242
// Specify priority of register selection within phases of register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   243
// allocation.  Highest priority is first.  A useful heuristic is to
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   244
// give registers a low priority when they are required by machine
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   245
// instructions, like EAX and EDX on I486, and choose no-save registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   246
// before save-on-call, & save-on-call before save-on-entry.  Registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   247
// which participate in fixed calling sequences should come last.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   248
// Registers which are used as pairs must fall on an even boundary.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   249
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   250
alloc_class chunk0(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   251
    // volatiles
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   252
    R10, R10_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   253
    R11, R11_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   254
    R12, R12_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   255
    R13, R13_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   256
    R14, R14_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   257
    R15, R15_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   258
    R16, R16_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   259
    R17, R17_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   260
    R18, R18_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   261
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   262
    // arg registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   263
    R0, R0_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   264
    R1, R1_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   265
    R2, R2_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   266
    R3, R3_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   267
    R4, R4_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   268
    R5, R5_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   269
    R6, R6_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   270
    R7, R7_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   271
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   272
    // non-volatiles
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   273
    R19, R19_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   274
    R20, R20_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   275
    R21, R21_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   276
    R22, R22_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   277
    R23, R23_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   278
    R24, R24_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   279
    R25, R25_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   280
    R26, R26_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   281
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   282
    // non-allocatable registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   283
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   284
    R27, R27_H, // heapbase
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   285
    R28, R28_H, // thread
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   286
    R29, R29_H, // fp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   287
    R30, R30_H, // lr
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   288
    R31, R31_H, // sp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   289
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   290
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   291
alloc_class chunk1(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   292
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   293
    // no save
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   294
    V16, V16_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   295
    V17, V17_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   296
    V18, V18_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   297
    V19, V19_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   298
    V20, V20_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   299
    V21, V21_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   300
    V22, V22_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   301
    V23, V23_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   302
    V24, V24_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   303
    V25, V25_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   304
    V26, V26_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   305
    V27, V27_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   306
    V28, V28_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   307
    V29, V29_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   308
    V30, V30_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   309
    V31, V31_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   310
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   311
    // arg registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   312
    V0, V0_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   313
    V1, V1_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   314
    V2, V2_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   315
    V3, V3_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   316
    V4, V4_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   317
    V5, V5_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   318
    V6, V6_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   319
    V7, V7_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   320
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   321
    // non-volatiles
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   322
    V8, V8_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   323
    V9, V9_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   324
    V10, V10_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   325
    V11, V11_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   326
    V12, V12_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   327
    V13, V13_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   328
    V14, V14_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   329
    V15, V15_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   330
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   331
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   332
alloc_class chunk2(RFLAGS);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   333
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   334
//----------Architecture Description Register Classes--------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   335
// Several register classes are automatically defined based upon information in
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   336
// this architecture description.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   337
// 1) reg_class inline_cache_reg           ( /* as def'd in frame section */ )
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   338
// 2) reg_class compiler_method_oop_reg    ( /* as def'd in frame section */ )
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   339
// 2) reg_class interpreter_method_oop_reg ( /* as def'd in frame section */ )
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   340
// 3) reg_class stack_slots( /* one chunk of stack-based "registers" */ )
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   341
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   342
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   343
// Class for all 32 bit integer registers -- excludes SP which will
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   344
// never be used as an integer register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   345
reg_class any_reg32(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   346
    R0,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   347
    R1,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   348
    R2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   349
    R3,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   350
    R4,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   351
    R5,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   352
    R6,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   353
    R7,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   354
    R10,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   355
    R11,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   356
    R12,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   357
    R13,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   358
    R14,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   359
    R15,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   360
    R16,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   361
    R17,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   362
    R18,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   363
    R19,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   364
    R20,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   365
    R21,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   366
    R22,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   367
    R23,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   368
    R24,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   369
    R25,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   370
    R26,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   371
    R27,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   372
    R28,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   373
    R29,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   374
    R30
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   375
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   376
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   377
// Singleton class for R0 int register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   378
reg_class int_r0_reg(R0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   379
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   380
// Singleton class for R2 int register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   381
reg_class int_r2_reg(R2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   382
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   383
// Singleton class for R3 int register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   384
reg_class int_r3_reg(R3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   385
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   386
// Singleton class for R4 int register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   387
reg_class int_r4_reg(R4);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   388
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   389
// Class for all long integer registers (including RSP)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   390
reg_class any_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   391
    R0, R0_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   392
    R1, R1_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   393
    R2, R2_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   394
    R3, R3_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   395
    R4, R4_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   396
    R5, R5_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   397
    R6, R6_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   398
    R7, R7_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   399
    R10, R10_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   400
    R11, R11_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   401
    R12, R12_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   402
    R13, R13_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   403
    R14, R14_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   404
    R15, R15_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   405
    R16, R16_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   406
    R17, R17_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   407
    R18, R18_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   408
    R19, R19_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   409
    R20, R20_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   410
    R21, R21_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   411
    R22, R22_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   412
    R23, R23_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   413
    R24, R24_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   414
    R25, R25_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   415
    R26, R26_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   416
    R27, R27_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   417
    R28, R28_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   418
    R29, R29_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   419
    R30, R30_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   420
    R31, R31_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   421
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   422
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   423
// Class for all non-special integer registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   424
reg_class no_special_reg32(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   425
    R0,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   426
    R1,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   427
    R2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   428
    R3,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   429
    R4,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   430
    R5,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   431
    R6,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   432
    R7,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   433
    R10,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   434
    R11,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   435
    R12,                        // rmethod
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   436
    R13,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   437
    R14,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   438
    R15,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   439
    R16,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   440
    R17,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   441
    R18,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   442
    R19,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   443
    R20,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   444
    R21,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   445
    R22,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   446
    R23,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   447
    R24,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   448
    R25,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   449
    R26
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   450
 /* R27, */                     // heapbase
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   451
 /* R28, */                     // thread
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   452
 /* R29, */                     // fp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   453
 /* R30, */                     // lr
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   454
 /* R31 */                      // sp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   455
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   456
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   457
// Class for all non-special long integer registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   458
reg_class no_special_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   459
    R0, R0_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   460
    R1, R1_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   461
    R2, R2_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   462
    R3, R3_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   463
    R4, R4_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   464
    R5, R5_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   465
    R6, R6_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   466
    R7, R7_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   467
    R10, R10_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   468
    R11, R11_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   469
    R12, R12_H,                 // rmethod
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   470
    R13, R13_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   471
    R14, R14_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   472
    R15, R15_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   473
    R16, R16_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   474
    R17, R17_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   475
    R18, R18_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   476
    R19, R19_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   477
    R20, R20_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   478
    R21, R21_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   479
    R22, R22_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   480
    R23, R23_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   481
    R24, R24_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   482
    R25, R25_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   483
    R26, R26_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   484
 /* R27, R27_H, */              // heapbase
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   485
 /* R28, R28_H, */              // thread
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   486
 /* R29, R29_H, */              // fp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   487
 /* R30, R30_H, */              // lr
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   488
 /* R31, R31_H */               // sp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   489
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   490
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   491
// Class for 64 bit register r0
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   492
reg_class r0_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   493
    R0, R0_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   494
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   495
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   496
// Class for 64 bit register r1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   497
reg_class r1_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   498
    R1, R1_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   499
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   500
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   501
// Class for 64 bit register r2
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   502
reg_class r2_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   503
    R2, R2_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   504
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   505
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   506
// Class for 64 bit register r3
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   507
reg_class r3_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   508
    R3, R3_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   509
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   510
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   511
// Class for 64 bit register r4
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   512
reg_class r4_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   513
    R4, R4_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   514
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   515
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   516
// Class for 64 bit register r5
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   517
reg_class r5_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   518
    R5, R5_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   519
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   520
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   521
// Class for 64 bit register r10
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   522
reg_class r10_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   523
    R10, R10_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   524
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   525
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   526
// Class for 64 bit register r11
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   527
reg_class r11_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   528
    R11, R11_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   529
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   530
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   531
// Class for method register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   532
reg_class method_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   533
    R12, R12_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   534
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   535
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   536
// Class for heapbase register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   537
reg_class heapbase_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   538
    R27, R27_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   539
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   540
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   541
// Class for thread register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   542
reg_class thread_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   543
    R28, R28_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   544
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   545
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   546
// Class for frame pointer register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   547
reg_class fp_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   548
    R29, R29_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   549
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   550
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   551
// Class for link register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   552
reg_class lr_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   553
    R30, R30_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   554
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   555
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   556
// Class for long sp register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   557
reg_class sp_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   558
  R31, R31_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   559
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   560
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   561
// Class for all pointer registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   562
reg_class ptr_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   563
    R0, R0_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   564
    R1, R1_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   565
    R2, R2_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   566
    R3, R3_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   567
    R4, R4_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   568
    R5, R5_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   569
    R6, R6_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   570
    R7, R7_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   571
    R10, R10_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   572
    R11, R11_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   573
    R12, R12_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   574
    R13, R13_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   575
    R14, R14_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   576
    R15, R15_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   577
    R16, R16_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   578
    R17, R17_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   579
    R18, R18_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   580
    R19, R19_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   581
    R20, R20_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   582
    R21, R21_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   583
    R22, R22_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   584
    R23, R23_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   585
    R24, R24_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   586
    R25, R25_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   587
    R26, R26_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   588
    R27, R27_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   589
    R28, R28_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   590
    R29, R29_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   591
    R30, R30_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   592
    R31, R31_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   593
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   594
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   595
// Class for all non_special pointer registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   596
reg_class no_special_ptr_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   597
    R0, R0_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   598
    R1, R1_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   599
    R2, R2_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   600
    R3, R3_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   601
    R4, R4_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   602
    R5, R5_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   603
    R6, R6_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   604
    R7, R7_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   605
    R10, R10_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   606
    R11, R11_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   607
    R12, R12_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   608
    R13, R13_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   609
    R14, R14_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   610
    R15, R15_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   611
    R16, R16_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   612
    R17, R17_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   613
    R18, R18_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   614
    R19, R19_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   615
    R20, R20_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   616
    R21, R21_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   617
    R22, R22_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   618
    R23, R23_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   619
    R24, R24_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   620
    R25, R25_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   621
    R26, R26_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   622
 /* R27, R27_H, */              // heapbase
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   623
 /* R28, R28_H, */              // thread
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   624
 /* R29, R29_H, */              // fp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   625
 /* R30, R30_H, */              // lr
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   626
 /* R31, R31_H */               // sp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   627
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   628
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   629
// Class for all float registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   630
reg_class float_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   631
    V0,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   632
    V1,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   633
    V2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   634
    V3,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   635
    V4,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   636
    V5,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   637
    V6,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   638
    V7,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   639
    V8,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   640
    V9,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   641
    V10,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   642
    V11,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   643
    V12,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   644
    V13,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   645
    V14,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   646
    V15,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   647
    V16,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   648
    V17,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   649
    V18,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   650
    V19,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   651
    V20,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   652
    V21,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   653
    V22,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   654
    V23,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   655
    V24,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   656
    V25,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   657
    V26,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   658
    V27,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   659
    V28,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   660
    V29,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   661
    V30,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   662
    V31
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   663
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   664
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   665
// Double precision float registers have virtual `high halves' that
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   666
// are needed by the allocator.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   667
// Class for all double registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   668
reg_class double_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   669
    V0, V0_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   670
    V1, V1_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   671
    V2, V2_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   672
    V3, V3_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   673
    V4, V4_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   674
    V5, V5_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   675
    V6, V6_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   676
    V7, V7_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   677
    V8, V8_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   678
    V9, V9_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   679
    V10, V10_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   680
    V11, V11_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   681
    V12, V12_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   682
    V13, V13_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   683
    V14, V14_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   684
    V15, V15_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   685
    V16, V16_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   686
    V17, V17_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   687
    V18, V18_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   688
    V19, V19_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   689
    V20, V20_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   690
    V21, V21_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   691
    V22, V22_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   692
    V23, V23_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   693
    V24, V24_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   694
    V25, V25_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   695
    V26, V26_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   696
    V27, V27_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   697
    V28, V28_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   698
    V29, V29_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   699
    V30, V30_H,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   700
    V31, V31_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   701
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   702
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   703
// Class for 128 bit register v0
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   704
reg_class v0_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   705
    V0, V0_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   706
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   707
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   708
// Class for 128 bit register v1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   709
reg_class v1_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   710
    V1, V1_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   711
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   712
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   713
// Class for 128 bit register v2
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   714
reg_class v2_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   715
    V2, V2_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   716
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   717
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   718
// Class for 128 bit register v3
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   719
reg_class v3_reg(
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   720
    V3, V3_H
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   721
);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   722
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   723
// Singleton class for condition codes
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   724
reg_class int_flags(RFLAGS);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   725
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   726
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   727
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   728
//----------DEFINITION BLOCK---------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   729
// Define name --> value mappings to inform the ADLC of an integer valued name
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   730
// Current support includes integer values in the range [0, 0x7FFFFFFF]
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   731
// Format:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   732
//        int_def  <name>         ( <int_value>, <expression>);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   733
// Generated Code in ad_<arch>.hpp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   734
//        #define  <name>   (<expression>)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   735
//        // value == <int_value>
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   736
// Generated code in ad_<arch>.cpp adlc_verification()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   737
//        assert( <name> == <int_value>, "Expect (<expression>) to equal <int_value>");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   738
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   739
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   740
// we follow the ppc-aix port in using a simple cost model which ranks
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   741
// register operations as cheap, memory ops as more expensive and
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   742
// branches as most expensive. the first two have a low as well as a
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   743
// normal cost. huge cost appears to be a way of saying don't do
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   744
// something
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   745
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   746
definitions %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   747
  // The default cost (of a register move instruction).
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   748
  int_def INSN_COST            (    100,     100);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   749
  int_def BRANCH_COST          (    200,     2 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   750
  int_def CALL_COST            (    200,     2 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   751
  int_def VOLATILE_REF_COST    (   1000,     10 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   752
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   753
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   754
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   755
//----------SOURCE BLOCK-------------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   756
// This is a block of C++ code which provides values, functions, and
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   757
// definitions necessary in the rest of the architecture description
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   758
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   759
source_hpp %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   760
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   761
class CallStubImpl {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   762
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   763
  //--------------------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   764
  //---<  Used for optimization in Compile::shorten_branches  >---
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   765
  //--------------------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   766
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   767
 public:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   768
  // Size of call trampoline stub.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   769
  static uint size_call_trampoline() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   770
    return 0; // no call trampolines on this platform
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   771
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   772
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   773
  // number of relocations needed by a call trampoline stub
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   774
  static uint reloc_call_trampoline() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   775
    return 0; // no call trampolines on this platform
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   776
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   777
};
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   778
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   779
class HandlerImpl {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   780
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   781
 public:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   782
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   783
  static int emit_exception_handler(CodeBuffer &cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   784
  static int emit_deopt_handler(CodeBuffer& cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   785
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   786
  static uint size_exception_handler() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   787
    return MacroAssembler::far_branch_size();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   788
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   789
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   790
  static uint size_deopt_handler() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   791
    // count one adr and one far branch instruction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   792
    return 4 * NativeInstruction::instruction_size;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   793
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   794
};
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   795
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   796
  bool preceded_by_ordered_load(const Node *barrier);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   797
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   798
  // Use barrier instructions rather than load acquire / store
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   799
  // release.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   800
  const bool UseBarriersForVolatile = true;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   801
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   802
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   803
source %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   804
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   805
  // AArch64 has load acquire and store release instructions which we
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   806
  // use for ordered memory accesses, e.g. for volatiles.  The ideal
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   807
  // graph generator also inserts memory barriers around volatile
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   808
  // accesses, and we don't want to generate both barriers and acq/rel
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   809
  // instructions.  So, when we emit a MemBarAcquire we look back in
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   810
  // the ideal graph for an ordered load and only emit the barrier if
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   811
  // we don't find one.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   812
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   813
bool preceded_by_ordered_load(const Node *barrier) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   814
  Node *x = barrier->lookup(TypeFunc::Parms);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   815
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   816
  if (! x)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   817
    return false;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   818
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   819
  if (x->is_DecodeNarrowPtr())
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   820
    x = x->in(1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   821
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   822
  if (x->is_Load())
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   823
    return ! x->as_Load()->is_unordered();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   824
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   825
  return false;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   826
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   827
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   828
#define __ _masm.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   829
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   830
// advance declarations for helper functions to convert register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   831
// indices to register objects
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   832
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   833
// the ad file has to provide implementations of certain methods
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   834
// expected by the generic code
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   835
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   836
// REQUIRED FUNCTIONALITY
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   837
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   838
//=============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   839
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   840
// !!!!! Special hack to get all types of calls to specify the byte offset
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   841
//       from the start of the call to the point where the return address
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   842
//       will point.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   843
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   844
int MachCallStaticJavaNode::ret_addr_offset()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   845
{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   846
  // call should be a simple bl
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   847
  // unless this is a method handle invoke in which case it is
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   848
  // mov(rfp, sp), bl, mov(sp, rfp)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   849
  int off = 4;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   850
  if (_method_handle_invoke) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   851
    off += 4;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   852
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   853
  return off;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   854
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   855
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   856
int MachCallDynamicJavaNode::ret_addr_offset()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   857
{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   858
  return 16; // movz, movk, movk, bl
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   859
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   860
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   861
int MachCallRuntimeNode::ret_addr_offset() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   862
  // for generated stubs the call will be
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   863
  //   far_call(addr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   864
  // for real runtime callouts it will be six instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   865
  // see aarch64_enc_java_to_runtime
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   866
  //   adr(rscratch2, retaddr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   867
  //   lea(rscratch1, RuntimeAddress(addr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   868
  //   stp(zr, rscratch2, Address(__ pre(sp, -2 * wordSize)))
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   869
  //   blrt rscratch1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   870
  CodeBlob *cb = CodeCache::find_blob(_entry_point);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   871
  if (cb) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   872
    return MacroAssembler::far_branch_size();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   873
  } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   874
    return 6 * NativeInstruction::instruction_size;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   875
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   876
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   877
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   878
// Indicate if the safepoint node needs the polling page as an input
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   879
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   880
// the shared code plants the oop data at the start of the generated
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   881
// code for the safepoint node and that needs ot be at the load
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   882
// instruction itself. so we cannot plant a mov of the safepoint poll
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   883
// address followed by a load. setting this to true means the mov is
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   884
// scheduled as a prior instruction. that's better for scheduling
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   885
// anyway.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   886
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   887
bool SafePointNode::needs_polling_address_input()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   888
{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   889
  return true;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   890
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   891
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   892
//=============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   893
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   894
#ifndef PRODUCT
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   895
void MachBreakpointNode::format(PhaseRegAlloc *ra_, outputStream *st) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   896
  st->print("BREAKPOINT");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   897
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   898
#endif
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   899
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   900
void MachBreakpointNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   901
  MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   902
  __ brk(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   903
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   904
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   905
uint MachBreakpointNode::size(PhaseRegAlloc *ra_) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   906
  return MachNode::size(ra_);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   907
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   908
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   909
//=============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   910
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   911
#ifndef PRODUCT
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   912
  void MachNopNode::format(PhaseRegAlloc*, outputStream* st) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   913
    st->print("nop \t# %d bytes pad for loops and calls", _count);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   914
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   915
#endif
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   916
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   917
  void MachNopNode::emit(CodeBuffer &cbuf, PhaseRegAlloc*) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   918
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   919
    for (int i = 0; i < _count; i++) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   920
      __ nop();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   921
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   922
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   923
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   924
  uint MachNopNode::size(PhaseRegAlloc*) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   925
    return _count * NativeInstruction::instruction_size;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   926
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   927
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   928
//=============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   929
const RegMask& MachConstantBaseNode::_out_RegMask = RegMask::Empty;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   930
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   931
int Compile::ConstantTable::calculate_table_base_offset() const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   932
  return 0;  // absolute addressing, no offset
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   933
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   934
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   935
bool MachConstantBaseNode::requires_postalloc_expand() const { return false; }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   936
void MachConstantBaseNode::postalloc_expand(GrowableArray <Node *> *nodes, PhaseRegAlloc *ra_) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   937
  ShouldNotReachHere();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   938
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   939
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   940
void MachConstantBaseNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   941
  // Empty encoding
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   942
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   943
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   944
uint MachConstantBaseNode::size(PhaseRegAlloc* ra_) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   945
  return 0;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   946
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   947
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   948
#ifndef PRODUCT
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   949
void MachConstantBaseNode::format(PhaseRegAlloc* ra_, outputStream* st) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   950
  st->print("-- \t// MachConstantBaseNode (empty encoding)");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   951
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   952
#endif
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   953
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   954
#ifndef PRODUCT
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   955
void MachPrologNode::format(PhaseRegAlloc *ra_, outputStream *st) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   956
  Compile* C = ra_->C;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   957
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   958
  int framesize = C->frame_slots() << LogBytesPerInt;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   959
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   960
  if (C->need_stack_bang(framesize))
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   961
    st->print("# stack bang size=%d\n\t", framesize);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   962
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   963
  if (framesize == 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   964
    // Is this even possible?
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   965
    st->print("stp  lr, rfp, [sp, #%d]!", -(2 * wordSize));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   966
  } else if (framesize < ((1 << 9) + 2 * wordSize)) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   967
    st->print("sub  sp, sp, #%d\n\t", framesize);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   968
    st->print("stp  rfp, lr, [sp, #%d]", framesize - 2 * wordSize);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   969
  } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   970
    st->print("stp  lr, rfp, [sp, #%d]!\n\t", -(2 * wordSize));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   971
    st->print("mov  rscratch1, #%d\n\t", framesize - 2 * wordSize);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   972
    st->print("sub  sp, sp, rscratch1");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   973
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   974
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   975
#endif
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   976
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   977
void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   978
  Compile* C = ra_->C;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   979
  MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   980
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   981
  // n.b. frame size includes space for return pc and rfp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   982
  const long framesize = C->frame_size_in_bytes();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   983
  assert(framesize%(2*wordSize) == 0, "must preserve 2*wordSize alignment");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   984
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   985
  // insert a nop at the start of the prolog so we can patch in a
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   986
  // branch if we need to invalidate the method later
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   987
  __ nop();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   988
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   989
  int bangsize = C->bang_size_in_bytes();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   990
  if (C->need_stack_bang(bangsize) && UseStackBanging)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   991
    __ generate_stack_overflow_check(bangsize);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   992
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   993
  __ build_frame(framesize);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   994
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   995
  if (NotifySimulator) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   996
    __ notify(Assembler::method_entry);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   997
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   998
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
   999
  if (VerifyStackAtCalls) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1000
    Unimplemented();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1001
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1002
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1003
  C->set_frame_complete(cbuf.insts_size());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1004
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1005
  if (C->has_mach_constant_base_node()) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1006
    // NOTE: We set the table base offset here because users might be
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1007
    // emitted before MachConstantBaseNode.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1008
    Compile::ConstantTable& constant_table = C->constant_table();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1009
    constant_table.set_table_base_offset(constant_table.calculate_table_base_offset());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1010
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1011
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1012
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1013
uint MachPrologNode::size(PhaseRegAlloc* ra_) const
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1014
{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1015
  return MachNode::size(ra_); // too many variables; just compute it
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1016
                              // the hard way
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1017
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1018
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1019
int MachPrologNode::reloc() const
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1020
{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1021
  return 0;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1022
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1023
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1024
//=============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1025
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1026
#ifndef PRODUCT
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1027
void MachEpilogNode::format(PhaseRegAlloc *ra_, outputStream *st) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1028
  Compile* C = ra_->C;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1029
  int framesize = C->frame_slots() << LogBytesPerInt;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1030
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1031
  st->print("# pop frame %d\n\t",framesize);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1032
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1033
  if (framesize == 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1034
    st->print("ldp  lr, rfp, [sp],#%d\n\t", (2 * wordSize));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1035
  } else if (framesize < ((1 << 9) + 2 * wordSize)) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1036
    st->print("ldp  lr, rfp, [sp,#%d]\n\t", framesize - 2 * wordSize);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1037
    st->print("add  sp, sp, #%d\n\t", framesize);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1038
  } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1039
    st->print("mov  rscratch1, #%d\n\t", framesize - 2 * wordSize);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1040
    st->print("add  sp, sp, rscratch1\n\t");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1041
    st->print("ldp  lr, rfp, [sp],#%d\n\t", (2 * wordSize));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1042
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1043
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1044
  if (do_polling() && C->is_method_compilation()) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1045
    st->print("# touch polling page\n\t");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1046
    st->print("mov  rscratch1, #0x%lx\n\t", p2i(os::get_polling_page()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1047
    st->print("ldr zr, [rscratch1]");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1048
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1049
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1050
#endif
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1051
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1052
void MachEpilogNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1053
  Compile* C = ra_->C;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1054
  MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1055
  int framesize = C->frame_slots() << LogBytesPerInt;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1056
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1057
  __ remove_frame(framesize);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1058
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1059
  if (NotifySimulator) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1060
    __ notify(Assembler::method_reentry);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1061
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1062
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1063
  if (do_polling() && C->is_method_compilation()) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1064
    __ read_polling_page(rscratch1, os::get_polling_page(), relocInfo::poll_return_type);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1065
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1066
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1067
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1068
uint MachEpilogNode::size(PhaseRegAlloc *ra_) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1069
  // Variable size. Determine dynamically.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1070
  return MachNode::size(ra_);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1071
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1072
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1073
int MachEpilogNode::reloc() const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1074
  // Return number of relocatable values contained in this instruction.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1075
  return 1; // 1 for polling page.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1076
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1077
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1078
const Pipeline * MachEpilogNode::pipeline() const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1079
  return MachNode::pipeline_class();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1080
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1081
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1082
// This method seems to be obsolete. It is declared in machnode.hpp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1083
// and defined in all *.ad files, but it is never called. Should we
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1084
// get rid of it?
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1085
int MachEpilogNode::safepoint_offset() const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1086
  assert(do_polling(), "no return for this epilog node");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1087
  return 4;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1088
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1089
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1090
//=============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1091
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1092
// Figure out which register class each belongs in: rc_int, rc_float or
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1093
// rc_stack.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1094
enum RC { rc_bad, rc_int, rc_float, rc_stack };
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1095
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1096
static enum RC rc_class(OptoReg::Name reg) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1097
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1098
  if (reg == OptoReg::Bad) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1099
    return rc_bad;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1100
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1101
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1102
  // we have 30 int registers * 2 halves
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1103
  // (rscratch1 and rscratch2 are omitted)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1104
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1105
  if (reg < 60) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1106
    return rc_int;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1107
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1108
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1109
  // we have 32 float register * 2 halves
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1110
  if (reg < 60 + 64) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1111
    return rc_float;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1112
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1113
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1114
  // Between float regs & stack is the flags regs.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1115
  assert(OptoReg::is_stack(reg), "blow up if spilling flags");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1116
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1117
  return rc_stack;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1118
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1119
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1120
uint MachSpillCopyNode::implementation(CodeBuffer *cbuf, PhaseRegAlloc *ra_, bool do_size, outputStream *st) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1121
  Compile* C = ra_->C;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1122
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1123
  // Get registers to move.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1124
  OptoReg::Name src_hi = ra_->get_reg_second(in(1));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1125
  OptoReg::Name src_lo = ra_->get_reg_first(in(1));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1126
  OptoReg::Name dst_hi = ra_->get_reg_second(this);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1127
  OptoReg::Name dst_lo = ra_->get_reg_first(this);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1128
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1129
  enum RC src_hi_rc = rc_class(src_hi);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1130
  enum RC src_lo_rc = rc_class(src_lo);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1131
  enum RC dst_hi_rc = rc_class(dst_hi);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1132
  enum RC dst_lo_rc = rc_class(dst_lo);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1133
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1134
  assert(src_lo != OptoReg::Bad && dst_lo != OptoReg::Bad, "must move at least 1 register");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1135
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1136
  if (src_hi != OptoReg::Bad) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1137
    assert((src_lo&1)==0 && src_lo+1==src_hi &&
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1138
           (dst_lo&1)==0 && dst_lo+1==dst_hi,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1139
           "expected aligned-adjacent pairs");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1140
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1141
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1142
  if (src_lo == dst_lo && src_hi == dst_hi) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1143
    return 0;            // Self copy, no move.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1144
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1145
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1146
  switch (src_lo_rc) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1147
  case rc_int:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1148
    if (dst_lo_rc == rc_int) {  // gpr --> gpr copy
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1149
      if (((src_lo & 1) == 0 && src_lo + 1 == src_hi) &&
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1150
          (dst_lo & 1) == 0 && dst_lo + 1 == dst_hi) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1151
          // 64 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1152
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1153
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1154
          __ mov(as_Register(Matcher::_regEncode[dst_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1155
                 as_Register(Matcher::_regEncode[src_lo]));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1156
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1157
          st->print("mov  %s, %s\t# shuffle",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1158
                    Matcher::regName[dst_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1159
                    Matcher::regName[src_lo]);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1160
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1161
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1162
        // 32 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1163
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1164
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1165
          __ movw(as_Register(Matcher::_regEncode[dst_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1166
                  as_Register(Matcher::_regEncode[src_lo]));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1167
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1168
          st->print("movw  %s, %s\t# shuffle",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1169
                    Matcher::regName[dst_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1170
                    Matcher::regName[src_lo]);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1171
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1172
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1173
    } else if (dst_lo_rc == rc_float) { // gpr --> fpr copy
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1174
      if (((src_lo & 1) == 0 && src_lo + 1 == src_hi) &&
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1175
          (dst_lo & 1) == 0 && dst_lo + 1 == dst_hi) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1176
          // 64 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1177
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1178
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1179
          __ fmovd(as_FloatRegister(Matcher::_regEncode[dst_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1180
                   as_Register(Matcher::_regEncode[src_lo]));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1181
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1182
          st->print("fmovd  %s, %s\t# shuffle",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1183
                    Matcher::regName[dst_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1184
                    Matcher::regName[src_lo]);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1185
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1186
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1187
        // 32 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1188
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1189
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1190
          __ fmovs(as_FloatRegister(Matcher::_regEncode[dst_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1191
                   as_Register(Matcher::_regEncode[src_lo]));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1192
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1193
          st->print("fmovs  %s, %s\t# shuffle",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1194
                    Matcher::regName[dst_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1195
                    Matcher::regName[src_lo]);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1196
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1197
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1198
    } else {                    // gpr --> stack spill
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1199
      assert(dst_lo_rc == rc_stack, "spill to bad register class");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1200
      int dst_offset = ra_->reg2offset(dst_lo);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1201
      if (((src_lo & 1) == 0 && src_lo + 1 == src_hi) &&
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1202
          (dst_lo & 1) == 0 && dst_lo + 1 == dst_hi) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1203
          // 64 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1204
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1205
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1206
          __ str(as_Register(Matcher::_regEncode[src_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1207
                 Address(sp, dst_offset));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1208
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1209
          st->print("str  %s, [sp, #%d]\t# spill",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1210
                    Matcher::regName[src_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1211
                    dst_offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1212
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1213
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1214
        // 32 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1215
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1216
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1217
          __ strw(as_Register(Matcher::_regEncode[src_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1218
                 Address(sp, dst_offset));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1219
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1220
          st->print("strw  %s, [sp, #%d]\t# spill",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1221
                    Matcher::regName[src_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1222
                    dst_offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1223
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1224
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1225
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1226
    return 4;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1227
  case rc_float:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1228
    if (dst_lo_rc == rc_int) {  // fpr --> gpr copy
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1229
      if (((src_lo & 1) == 0 && src_lo + 1 == src_hi) &&
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1230
          (dst_lo & 1) == 0 && dst_lo + 1 == dst_hi) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1231
          // 64 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1232
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1233
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1234
          __ fmovd(as_Register(Matcher::_regEncode[dst_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1235
                   as_FloatRegister(Matcher::_regEncode[src_lo]));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1236
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1237
          st->print("fmovd  %s, %s\t# shuffle",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1238
                    Matcher::regName[dst_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1239
                    Matcher::regName[src_lo]);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1240
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1241
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1242
        // 32 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1243
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1244
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1245
          __ fmovs(as_Register(Matcher::_regEncode[dst_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1246
                   as_FloatRegister(Matcher::_regEncode[src_lo]));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1247
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1248
          st->print("fmovs  %s, %s\t# shuffle",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1249
                    Matcher::regName[dst_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1250
                    Matcher::regName[src_lo]);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1251
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1252
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1253
    } else if (dst_lo_rc == rc_float) { // fpr --> fpr copy
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1254
      if (((src_lo & 1) == 0 && src_lo + 1 == src_hi) &&
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1255
          (dst_lo & 1) == 0 && dst_lo + 1 == dst_hi) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1256
          // 64 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1257
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1258
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1259
          __ fmovd(as_FloatRegister(Matcher::_regEncode[dst_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1260
                   as_FloatRegister(Matcher::_regEncode[src_lo]));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1261
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1262
          st->print("fmovd  %s, %s\t# shuffle",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1263
                    Matcher::regName[dst_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1264
                    Matcher::regName[src_lo]);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1265
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1266
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1267
        // 32 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1268
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1269
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1270
          __ fmovs(as_FloatRegister(Matcher::_regEncode[dst_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1271
                   as_FloatRegister(Matcher::_regEncode[src_lo]));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1272
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1273
          st->print("fmovs  %s, %s\t# shuffle",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1274
                    Matcher::regName[dst_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1275
                    Matcher::regName[src_lo]);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1276
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1277
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1278
    } else {                    // fpr --> stack spill
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1279
      assert(dst_lo_rc == rc_stack, "spill to bad register class");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1280
      int dst_offset = ra_->reg2offset(dst_lo);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1281
      if (((src_lo & 1) == 0 && src_lo + 1 == src_hi) &&
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1282
          (dst_lo & 1) == 0 && dst_lo + 1 == dst_hi) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1283
          // 64 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1284
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1285
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1286
          __ strd(as_FloatRegister(Matcher::_regEncode[src_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1287
                 Address(sp, dst_offset));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1288
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1289
          st->print("strd  %s, [sp, #%d]\t# spill",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1290
                    Matcher::regName[src_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1291
                    dst_offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1292
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1293
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1294
        // 32 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1295
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1296
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1297
          __ strs(as_FloatRegister(Matcher::_regEncode[src_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1298
                 Address(sp, dst_offset));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1299
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1300
          st->print("strs  %s, [sp, #%d]\t# spill",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1301
                    Matcher::regName[src_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1302
                    dst_offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1303
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1304
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1305
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1306
    return 4;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1307
  case rc_stack:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1308
    int src_offset = ra_->reg2offset(src_lo);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1309
    if (dst_lo_rc == rc_int) {  // stack --> gpr load
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1310
      if (((src_lo & 1) == 0 && src_lo + 1 == src_hi) &&
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1311
          (dst_lo & 1) == 0 && dst_lo + 1 == dst_hi) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1312
          // 64 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1313
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1314
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1315
          __ ldr(as_Register(Matcher::_regEncode[dst_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1316
                 Address(sp, src_offset));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1317
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1318
          st->print("ldr  %s, [sp, %d]\t# restore",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1319
                    Matcher::regName[dst_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1320
                    src_offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1321
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1322
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1323
        // 32 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1324
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1325
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1326
          __ ldrw(as_Register(Matcher::_regEncode[dst_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1327
                  Address(sp, src_offset));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1328
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1329
          st->print("ldr  %s, [sp, %d]\t# restore",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1330
                    Matcher::regName[dst_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1331
                   src_offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1332
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1333
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1334
      return 4;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1335
    } else if (dst_lo_rc == rc_float) { // stack --> fpr load
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1336
      if (((src_lo & 1) == 0 && src_lo + 1 == src_hi) &&
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1337
          (dst_lo & 1) == 0 && dst_lo + 1 == dst_hi) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1338
          // 64 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1339
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1340
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1341
          __ ldrd(as_FloatRegister(Matcher::_regEncode[dst_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1342
                 Address(sp, src_offset));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1343
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1344
          st->print("ldrd  %s, [sp, %d]\t# restore",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1345
                    Matcher::regName[dst_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1346
                    src_offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1347
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1348
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1349
        // 32 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1350
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1351
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1352
          __ ldrs(as_FloatRegister(Matcher::_regEncode[dst_lo]),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1353
                  Address(sp, src_offset));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1354
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1355
          st->print("ldrs  %s, [sp, %d]\t# restore",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1356
                    Matcher::regName[dst_lo],
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1357
                   src_offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1358
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1359
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1360
      return 4;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1361
    } else {                    // stack --> stack copy
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1362
      assert(dst_lo_rc == rc_stack, "spill to bad register class");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1363
      int dst_offset = ra_->reg2offset(dst_lo);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1364
      if (((src_lo & 1) == 0 && src_lo + 1 == src_hi) &&
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1365
          (dst_lo & 1) == 0 && dst_lo + 1 == dst_hi) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1366
          // 64 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1367
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1368
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1369
          __ ldr(rscratch1, Address(sp, src_offset));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1370
          __ str(rscratch1, Address(sp, dst_offset));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1371
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1372
          st->print("ldr  rscratch1, [sp, %d]\t# mem-mem spill",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1373
                    src_offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1374
          st->print("\n\t");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1375
          st->print("str  rscratch1, [sp, %d]",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1376
                    dst_offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1377
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1378
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1379
        // 32 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1380
        if (cbuf) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1381
          MacroAssembler _masm(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1382
          __ ldrw(rscratch1, Address(sp, src_offset));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1383
          __ strw(rscratch1, Address(sp, dst_offset));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1384
        } else if (st) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1385
          st->print("ldrw  rscratch1, [sp, %d]\t# mem-mem spill",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1386
                    src_offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1387
          st->print("\n\t");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1388
          st->print("strw  rscratch1, [sp, %d]",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1389
                    dst_offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1390
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1391
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1392
      return 8;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1393
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1394
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1395
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1396
  assert(false," bad rc_class for spill ");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1397
  Unimplemented();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1398
  return 0;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1399
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1400
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1401
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1402
#ifndef PRODUCT
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1403
void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream *st) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1404
  if (!ra_)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1405
    st->print("N%d = SpillCopy(N%d)", _idx, in(1)->_idx);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1406
  else
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1407
    implementation(NULL, ra_, false, st);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1408
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1409
#endif
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1410
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1411
void MachSpillCopyNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1412
  implementation(&cbuf, ra_, false, NULL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1413
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1414
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1415
uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1416
  return implementation(NULL, ra_, true, NULL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1417
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1418
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1419
//=============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1420
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1421
#ifndef PRODUCT
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1422
void BoxLockNode::format(PhaseRegAlloc *ra_, outputStream *st) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1423
  int offset = ra_->reg2offset(in_RegMask(0).find_first_elem());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1424
  int reg = ra_->get_reg_first(this);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1425
  st->print("add %s, rsp, #%d]\t# box lock",
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1426
            Matcher::regName[reg], offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1427
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1428
#endif
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1429
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1430
void BoxLockNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1431
  MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1432
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1433
  int offset = ra_->reg2offset(in_RegMask(0).find_first_elem());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1434
  int reg    = ra_->get_encode(this);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1435
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1436
  if (Assembler::operand_valid_for_add_sub_immediate(offset)) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1437
    __ add(as_Register(reg), sp, offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1438
  } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1439
    ShouldNotReachHere();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1440
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1441
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1442
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1443
uint BoxLockNode::size(PhaseRegAlloc *ra_) const {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1444
  // BoxLockNode is not a MachNode, so we can't just call MachNode::size(ra_).
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1445
  return 4;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1446
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1447
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1448
//=============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1449
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1450
#ifndef PRODUCT
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1451
void MachUEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1452
{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1453
  st->print_cr("# MachUEPNode");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1454
  if (UseCompressedClassPointers) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1455
    st->print_cr("\tldrw rscratch1, j_rarg0 + oopDesc::klass_offset_in_bytes()]\t# compressed klass");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1456
    if (Universe::narrow_klass_shift() != 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1457
      st->print_cr("\tdecode_klass_not_null rscratch1, rscratch1");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1458
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1459
  } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1460
   st->print_cr("\tldr rscratch1, j_rarg0 + oopDesc::klass_offset_in_bytes()]\t# compressed klass");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1461
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1462
  st->print_cr("\tcmp r0, rscratch1\t # Inline cache check");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1463
  st->print_cr("\tbne, SharedRuntime::_ic_miss_stub");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1464
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1465
#endif
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1466
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1467
void MachUEPNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1468
{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1469
  // This is the unverified entry point.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1470
  MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1471
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1472
  __ cmp_klass(j_rarg0, rscratch2, rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1473
  Label skip;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1474
  // TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1475
  // can we avoid this skip and still use a reloc?
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1476
  __ br(Assembler::EQ, skip);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1477
  __ far_jump(RuntimeAddress(SharedRuntime::get_ic_miss_stub()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1478
  __ bind(skip);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1479
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1480
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1481
uint MachUEPNode::size(PhaseRegAlloc* ra_) const
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1482
{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1483
  return MachNode::size(ra_);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1484
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1485
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1486
// REQUIRED EMIT CODE
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1487
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1488
//=============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1489
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1490
// Emit exception handler code.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1491
int HandlerImpl::emit_exception_handler(CodeBuffer& cbuf)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1492
{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1493
  // mov rscratch1 #exception_blob_entry_point
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1494
  // br rscratch1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1495
  // Note that the code buffer's insts_mark is always relative to insts.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1496
  // That's why we must use the macroassembler to generate a handler.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1497
  MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1498
  address base =
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1499
  __ start_a_stub(size_exception_handler());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1500
  if (base == NULL)  return 0;  // CodeBuffer::expand failed
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1501
  int offset = __ offset();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1502
  __ far_jump(RuntimeAddress(OptoRuntime::exception_blob()->entry_point()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1503
  assert(__ offset() - offset <= (int) size_exception_handler(), "overflow");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1504
  __ end_a_stub();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1505
  return offset;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1506
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1507
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1508
// Emit deopt handler code.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1509
int HandlerImpl::emit_deopt_handler(CodeBuffer& cbuf)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1510
{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1511
  // Note that the code buffer's insts_mark is always relative to insts.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1512
  // That's why we must use the macroassembler to generate a handler.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1513
  MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1514
  address base =
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1515
  __ start_a_stub(size_deopt_handler());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1516
  if (base == NULL)  return 0;  // CodeBuffer::expand failed
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1517
  int offset = __ offset();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1518
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1519
  __ adr(lr, __ pc());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1520
  __ far_jump(RuntimeAddress(SharedRuntime::deopt_blob()->unpack()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1521
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1522
  assert(__ offset() - offset <= (int) size_deopt_handler(), "overflow");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1523
  __ end_a_stub();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1524
  return offset;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1525
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1526
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1527
// REQUIRED MATCHER CODE
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1528
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1529
//=============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1530
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1531
const bool Matcher::match_rule_supported(int opcode) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1532
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1533
  // TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1534
  // identify extra cases that we might want to provide match rules for
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1535
  // e.g. Op_StrEquals and other intrinsics
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1536
  if (!has_match_rule(opcode)) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1537
    return false;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1538
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1539
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1540
  return true;  // Per default match rules are supported.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1541
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1542
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1543
int Matcher::regnum_to_fpu_offset(int regnum)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1544
{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1545
  Unimplemented();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1546
  return 0;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1547
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1548
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1549
bool Matcher::is_short_branch_offset(int rule, int br_size, int offset)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1550
{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1551
  Unimplemented();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1552
  return false;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1553
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1554
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1555
const bool Matcher::isSimpleConstant64(jlong value) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1556
  // Will one (StoreL ConL) be cheaper than two (StoreI ConI)?.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1557
  // Probably always true, even if a temp register is required.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1558
  return true;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1559
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1560
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1561
// true just means we have fast l2f conversion
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1562
const bool Matcher::convL2FSupported(void) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1563
  return true;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1564
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1565
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1566
// Vector width in bytes.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1567
const int Matcher::vector_width_in_bytes(BasicType bt) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1568
  // TODO fixme
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1569
  return 0;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1570
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1571
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1572
// Limits on vector size (number of elements) loaded into vector.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1573
const int Matcher::max_vector_size(const BasicType bt) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1574
  return vector_width_in_bytes(bt)/type2aelembytes(bt);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1575
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1576
const int Matcher::min_vector_size(const BasicType bt) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1577
  int max_size = max_vector_size(bt);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1578
  // Min size which can be loaded into vector is 4 bytes.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1579
  int size = (type2aelembytes(bt) == 1) ? 4 : 2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1580
  return MIN2(size,max_size);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1581
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1582
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1583
// Vector ideal reg.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1584
const int Matcher::vector_ideal_reg(int len) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1585
  // TODO fixme
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1586
  return Op_RegD;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1587
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1588
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1589
// Only lowest bits of xmm reg are used for vector shift count.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1590
const int Matcher::vector_shift_count_ideal_reg(int size) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1591
  // TODO fixme
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1592
  return Op_RegL;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1593
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1594
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1595
// AES support not yet implemented
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1596
const bool Matcher::pass_original_key_for_aes() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1597
  return false;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1598
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1599
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1600
// x86 supports misaligned vectors store/load.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1601
const bool Matcher::misaligned_vectors_ok() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1602
  // TODO fixme
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1603
  // return !AlignVector; // can be changed by flag
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1604
  return false;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1605
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1606
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1607
// false => size gets scaled to BytesPerLong, ok.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1608
const bool Matcher::init_array_count_is_in_bytes = false;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1609
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1610
// Threshold size for cleararray.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1611
const int Matcher::init_array_short_size = 18 * BytesPerLong;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1612
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1613
// Use conditional move (CMOVL)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1614
const int Matcher::long_cmove_cost() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1615
  // long cmoves are no more expensive than int cmoves
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1616
  return 0;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1617
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1618
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1619
const int Matcher::float_cmove_cost() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1620
  // float cmoves are no more expensive than int cmoves
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1621
  return 0;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1622
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1623
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1624
// Does the CPU require late expand (see block.cpp for description of late expand)?
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1625
const bool Matcher::require_postalloc_expand = false;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1626
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1627
// Should the Matcher clone shifts on addressing modes, expecting them
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1628
// to be subsumed into complex addressing expressions or compute them
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1629
// into registers?  True for Intel but false for most RISCs
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1630
const bool Matcher::clone_shift_expressions = false;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1631
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1632
// Do we need to mask the count passed to shift instructions or does
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1633
// the cpu only look at the lower 5/6 bits anyway?
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1634
const bool Matcher::need_masked_shift_count = false;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1635
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1636
// This affects two different things:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1637
//  - how Decode nodes are matched
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1638
//  - how ImplicitNullCheck opportunities are recognized
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1639
// If true, the matcher will try to remove all Decodes and match them
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1640
// (as operands) into nodes. NullChecks are not prepared to deal with
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1641
// Decodes by final_graph_reshaping().
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1642
// If false, final_graph_reshaping() forces the decode behind the Cmp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1643
// for a NullCheck. The matcher matches the Decode node into a register.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1644
// Implicit_null_check optimization moves the Decode along with the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1645
// memory operation back up before the NullCheck.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1646
bool Matcher::narrow_oop_use_complex_address() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1647
  return Universe::narrow_oop_shift() == 0;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1648
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1649
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1650
bool Matcher::narrow_klass_use_complex_address() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1651
// TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1652
// decide whether we need to set this to true
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1653
  return false;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1654
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1655
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1656
// Is it better to copy float constants, or load them directly from
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1657
// memory?  Intel can load a float constant from a direct address,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1658
// requiring no extra registers.  Most RISCs will have to materialize
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1659
// an address into a register first, so they would do better to copy
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1660
// the constant from stack.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1661
const bool Matcher::rematerialize_float_constants = false;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1662
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1663
// If CPU can load and store mis-aligned doubles directly then no
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1664
// fixup is needed.  Else we split the double into 2 integer pieces
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1665
// and move it piece-by-piece.  Only happens when passing doubles into
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1666
// C code as the Java calling convention forces doubles to be aligned.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1667
const bool Matcher::misaligned_doubles_ok = true;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1668
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1669
// No-op on amd64
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1670
void Matcher::pd_implicit_null_fixup(MachNode *node, uint idx) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1671
  Unimplemented();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1672
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1673
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1674
// Advertise here if the CPU requires explicit rounding operations to
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1675
// implement the UseStrictFP mode.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1676
const bool Matcher::strict_fp_requires_explicit_rounding = false;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1677
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1678
// Are floats converted to double when stored to stack during
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1679
// deoptimization?
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1680
bool Matcher::float_in_double() { return true; }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1681
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1682
// Do ints take an entire long register or just half?
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1683
// The relevant question is how the int is callee-saved:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1684
// the whole long is written but de-opt'ing will have to extract
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1685
// the relevant 32 bits.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1686
const bool Matcher::int_in_long = true;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1687
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1688
// Return whether or not this register is ever used as an argument.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1689
// This function is used on startup to build the trampoline stubs in
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1690
// generateOptoStub.  Registers not mentioned will be killed by the VM
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1691
// call in the trampoline, and arguments in those registers not be
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1692
// available to the callee.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1693
bool Matcher::can_be_java_arg(int reg)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1694
{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1695
  return
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1696
    reg ==  R0_num || reg == R0_H_num ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1697
    reg ==  R1_num || reg == R1_H_num ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1698
    reg ==  R2_num || reg == R2_H_num ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1699
    reg ==  R3_num || reg == R3_H_num ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1700
    reg ==  R4_num || reg == R4_H_num ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1701
    reg ==  R5_num || reg == R5_H_num ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1702
    reg ==  R6_num || reg == R6_H_num ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1703
    reg ==  R7_num || reg == R7_H_num ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1704
    reg ==  V0_num || reg == V0_H_num ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1705
    reg ==  V1_num || reg == V1_H_num ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1706
    reg ==  V2_num || reg == V2_H_num ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1707
    reg ==  V3_num || reg == V3_H_num ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1708
    reg ==  V4_num || reg == V4_H_num ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1709
    reg ==  V5_num || reg == V5_H_num ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1710
    reg ==  V6_num || reg == V6_H_num ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1711
    reg ==  V7_num || reg == V7_H_num;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1712
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1713
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1714
bool Matcher::is_spillable_arg(int reg)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1715
{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1716
  return can_be_java_arg(reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1717
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1718
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1719
bool Matcher::use_asm_for_ldiv_by_con(jlong divisor) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1720
  return false;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1721
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1722
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1723
RegMask Matcher::divI_proj_mask() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1724
  ShouldNotReachHere();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1725
  return RegMask();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1726
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1727
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1728
// Register for MODI projection of divmodI.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1729
RegMask Matcher::modI_proj_mask() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1730
  ShouldNotReachHere();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1731
  return RegMask();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1732
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1733
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1734
// Register for DIVL projection of divmodL.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1735
RegMask Matcher::divL_proj_mask() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1736
  ShouldNotReachHere();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1737
  return RegMask();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1738
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1739
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1740
// Register for MODL projection of divmodL.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1741
RegMask Matcher::modL_proj_mask() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1742
  ShouldNotReachHere();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1743
  return RegMask();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1744
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1745
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1746
const RegMask Matcher::method_handle_invoke_SP_save_mask() {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1747
  return RegMask();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1748
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1749
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1750
// helper for encoding java_to_runtime calls on sim
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1751
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1752
// this is needed to compute the extra arguments required when
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1753
// planting a call to the simulator blrt instruction. the TypeFunc
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1754
// can be queried to identify the counts for integral, and floating
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1755
// arguments and the return type
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1756
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1757
static void getCallInfo(const TypeFunc *tf, int &gpcnt, int &fpcnt, int &rtype)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1758
{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1759
  int gps = 0;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1760
  int fps = 0;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1761
  const TypeTuple *domain = tf->domain();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1762
  int max = domain->cnt();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1763
  for (int i = TypeFunc::Parms; i < max; i++) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1764
    const Type *t = domain->field_at(i);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1765
    switch(t->basic_type()) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1766
    case T_FLOAT:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1767
    case T_DOUBLE:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1768
      fps++;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1769
    default:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1770
      gps++;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1771
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1772
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1773
  gpcnt = gps;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1774
  fpcnt = fps;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1775
  BasicType rt = tf->return_type();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1776
  switch (rt) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1777
  case T_VOID:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1778
    rtype = MacroAssembler::ret_type_void;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1779
    break;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1780
  default:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1781
    rtype = MacroAssembler::ret_type_integral;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1782
    break;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1783
  case T_FLOAT:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1784
    rtype = MacroAssembler::ret_type_float;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1785
    break;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1786
  case T_DOUBLE:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1787
    rtype = MacroAssembler::ret_type_double;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1788
    break;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1789
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1790
}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1791
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1792
#define MOV_VOLATILE(REG, BASE, INDEX, SCALE, DISP, SCRATCH, INSN)      \
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1793
  MacroAssembler _masm(&cbuf);                                          \
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1794
  {                                                                     \
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1795
    guarantee(INDEX == -1, "mode not permitted for volatile");          \
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1796
    guarantee(DISP == 0, "mode not permitted for volatile");            \
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1797
    guarantee(SCALE == 0, "mode not permitted for volatile");           \
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1798
    __ INSN(REG, as_Register(BASE));                                    \
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1799
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1800
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1801
typedef void (MacroAssembler::* mem_insn)(Register Rt, const Address &adr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1802
typedef void (MacroAssembler::* mem_float_insn)(FloatRegister Rt, const Address &adr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1803
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1804
  // Used for all non-volatile memory accesses.  The use of
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1805
  // $mem->opcode() to discover whether this pattern uses sign-extended
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1806
  // offsets is something of a kludge.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1807
  static void loadStore(MacroAssembler masm, mem_insn insn,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1808
                         Register reg, int opcode,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1809
                         Register base, int index, int size, int disp)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1810
  {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1811
    Address::extend scale;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1812
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1813
    // Hooboy, this is fugly.  We need a way to communicate to the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1814
    // encoder that the index needs to be sign extended, so we have to
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1815
    // enumerate all the cases.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1816
    switch (opcode) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1817
    case INDINDEXSCALEDOFFSETI2L:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1818
    case INDINDEXSCALEDI2L:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1819
    case INDINDEXSCALEDOFFSETI2LN:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1820
    case INDINDEXSCALEDI2LN:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1821
      scale = Address::sxtw(size);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1822
      break;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1823
    default:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1824
      scale = Address::lsl(size);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1825
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1826
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1827
    if (index == -1) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1828
      (masm.*insn)(reg, Address(base, disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1829
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1830
      if (disp == 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1831
        (masm.*insn)(reg, Address(base, as_Register(index), scale));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1832
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1833
        masm.lea(rscratch1, Address(base, disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1834
        (masm.*insn)(reg, Address(rscratch1, as_Register(index), scale));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1835
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1836
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1837
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1838
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1839
  static void loadStore(MacroAssembler masm, mem_float_insn insn,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1840
                         FloatRegister reg, int opcode,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1841
                         Register base, int index, int size, int disp)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1842
  {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1843
    Address::extend scale;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1844
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1845
    switch (opcode) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1846
    case INDINDEXSCALEDOFFSETI2L:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1847
    case INDINDEXSCALEDI2L:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1848
    case INDINDEXSCALEDOFFSETI2LN:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1849
    case INDINDEXSCALEDI2LN:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1850
      scale = Address::sxtw(size);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1851
      break;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1852
    default:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1853
      scale = Address::lsl(size);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1854
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1855
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1856
     if (index == -1) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1857
      (masm.*insn)(reg, Address(base, disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1858
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1859
      if (disp == 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1860
        (masm.*insn)(reg, Address(base, as_Register(index), scale));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1861
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1862
        masm.lea(rscratch1, Address(base, disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1863
        (masm.*insn)(reg, Address(rscratch1, as_Register(index), scale));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1864
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1865
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1866
  }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1867
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1868
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1869
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1870
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1871
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1872
//----------ENCODING BLOCK-----------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1873
// This block specifies the encoding classes used by the compiler to
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1874
// output byte streams.  Encoding classes are parameterized macros
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1875
// used by Machine Instruction Nodes in order to generate the bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1876
// encoding of the instruction.  Operands specify their base encoding
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1877
// interface with the interface keyword.  There are currently
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1878
// supported four interfaces, REG_INTER, CONST_INTER, MEMORY_INTER, &
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1879
// COND_INTER.  REG_INTER causes an operand to generate a function
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1880
// which returns its register number when queried.  CONST_INTER causes
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1881
// an operand to generate a function which returns the value of the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1882
// constant when queried.  MEMORY_INTER causes an operand to generate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1883
// four functions which return the Base Register, the Index Register,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1884
// the Scale Value, and the Offset Value of the operand when queried.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1885
// COND_INTER causes an operand to generate six functions which return
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1886
// the encoding code (ie - encoding bits for the instruction)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1887
// associated with each basic boolean condition for a conditional
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1888
// instruction.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1889
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1890
// Instructions specify two basic values for encoding.  Again, a
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1891
// function is available to check if the constant displacement is an
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1892
// oop. They use the ins_encode keyword to specify their encoding
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1893
// classes (which must be a sequence of enc_class names, and their
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1894
// parameters, specified in the encoding block), and they use the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1895
// opcode keyword to specify, in order, their primary, secondary, and
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1896
// tertiary opcode.  Only the opcode sections which a particular
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1897
// instruction needs for encoding need to be specified.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1898
encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1899
  // Build emit functions for each basic byte or larger field in the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1900
  // intel encoding scheme (opcode, rm, sib, immediate), and call them
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1901
  // from C++ code in the enc_class source block.  Emit functions will
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1902
  // live in the main source block for now.  In future, we can
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1903
  // generalize this by adding a syntax that specifies the sizes of
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1904
  // fields in an order, so that the adlc can build the emit functions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1905
  // automagically
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1906
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1907
  // catch all for unimplemented encodings
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1908
  enc_class enc_unimplemented %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1909
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1910
    __ unimplemented("C2 catch all");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1911
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1912
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1913
  // BEGIN Non-volatile memory access
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1914
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1915
  enc_class aarch64_enc_ldrsbw(iRegI dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1916
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1917
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrsbw, dst_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1918
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1919
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1920
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1921
  enc_class aarch64_enc_ldrsb(iRegI dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1922
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1923
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrsb, dst_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1924
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1925
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1926
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1927
  enc_class aarch64_enc_ldrb(iRegI dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1928
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1929
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrb, dst_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1930
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1931
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1932
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1933
  enc_class aarch64_enc_ldrb(iRegL dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1934
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1935
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrb, dst_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1936
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1937
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1938
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1939
  enc_class aarch64_enc_ldrshw(iRegI dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1940
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1941
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrshw, dst_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1942
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1943
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1944
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1945
  enc_class aarch64_enc_ldrsh(iRegI dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1946
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1947
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrsh, dst_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1948
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1949
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1950
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1951
  enc_class aarch64_enc_ldrh(iRegI dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1952
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1953
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrh, dst_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1954
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1955
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1956
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1957
  enc_class aarch64_enc_ldrh(iRegL dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1958
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1959
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrh, dst_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1960
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1961
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1962
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1963
  enc_class aarch64_enc_ldrw(iRegI dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1964
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1965
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrw, dst_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1966
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1967
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1968
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1969
  enc_class aarch64_enc_ldrw(iRegL dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1970
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1971
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrw, dst_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1972
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1973
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1974
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1975
  enc_class aarch64_enc_ldrsw(iRegL dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1976
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1977
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrsw, dst_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1978
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1979
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1980
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1981
  enc_class aarch64_enc_ldr(iRegL dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1982
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1983
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldr, dst_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1984
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1985
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1986
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1987
  enc_class aarch64_enc_ldrs(vRegF dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1988
    FloatRegister dst_reg = as_FloatRegister($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1989
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrs, dst_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1990
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1991
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1992
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1993
  enc_class aarch64_enc_ldrd(vRegD dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1994
    FloatRegister dst_reg = as_FloatRegister($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1995
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::ldrd, dst_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1996
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1997
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1998
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  1999
  enc_class aarch64_enc_strb(iRegI src, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2000
    Register src_reg = as_Register($src$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2001
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::strb, src_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2002
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2003
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2004
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2005
  enc_class aarch64_enc_strb0(memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2006
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2007
    loadStore(_masm, &MacroAssembler::strb, zr, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2008
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2009
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2010
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2011
  enc_class aarch64_enc_strh(iRegI src, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2012
    Register src_reg = as_Register($src$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2013
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::strh, src_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2014
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2015
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2016
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2017
  enc_class aarch64_enc_strh0(memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2018
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2019
    loadStore(_masm, &MacroAssembler::strh, zr, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2020
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2021
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2022
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2023
  enc_class aarch64_enc_strw(iRegI src, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2024
    Register src_reg = as_Register($src$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2025
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::strw, src_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2026
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2027
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2028
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2029
  enc_class aarch64_enc_strw0(memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2030
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2031
    loadStore(_masm, &MacroAssembler::strw, zr, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2032
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2033
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2034
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2035
  enc_class aarch64_enc_str(iRegL src, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2036
    Register src_reg = as_Register($src$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2037
    // we sometimes get asked to store the stack pointer into the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2038
    // current thread -- we cannot do that directly on AArch64
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2039
    if (src_reg == r31_sp) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2040
      MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2041
      assert(as_Register($mem$$base) == rthread, "unexpected store for sp");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2042
      __ mov(rscratch2, sp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2043
      src_reg = rscratch2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2044
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2045
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::str, src_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2046
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2047
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2048
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2049
  enc_class aarch64_enc_str0(memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2050
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2051
    loadStore(_masm, &MacroAssembler::str, zr, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2052
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2053
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2054
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2055
  enc_class aarch64_enc_strs(vRegF src, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2056
    FloatRegister src_reg = as_FloatRegister($src$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2057
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::strs, src_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2058
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2059
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2060
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2061
  enc_class aarch64_enc_strd(vRegD src, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2062
    FloatRegister src_reg = as_FloatRegister($src$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2063
    loadStore(MacroAssembler(&cbuf), &MacroAssembler::strd, src_reg, $mem->opcode(),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2064
               as_Register($mem$$base), $mem$$index, $mem$$scale, $mem$$disp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2065
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2066
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2067
  // END Non-volatile memory access
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2068
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2069
  // volatile loads and stores
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2070
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2071
  enc_class aarch64_enc_stlrb(iRegI src, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2072
    MOV_VOLATILE(as_Register($src$$reg), $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2073
                 rscratch1, stlrb);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2074
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2075
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2076
  enc_class aarch64_enc_stlrh(iRegI src, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2077
    MOV_VOLATILE(as_Register($src$$reg), $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2078
                 rscratch1, stlrh);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2079
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2080
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2081
  enc_class aarch64_enc_stlrw(iRegI src, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2082
    MOV_VOLATILE(as_Register($src$$reg), $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2083
                 rscratch1, stlrw);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2084
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2085
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2086
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2087
  enc_class aarch64_enc_ldarsbw(iRegI dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2088
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2089
    MOV_VOLATILE(dst_reg, $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2090
             rscratch1, ldarb);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2091
    __ sxtbw(dst_reg, dst_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2092
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2093
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2094
  enc_class aarch64_enc_ldarsb(iRegL dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2095
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2096
    MOV_VOLATILE(dst_reg, $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2097
             rscratch1, ldarb);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2098
    __ sxtb(dst_reg, dst_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2099
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2100
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2101
  enc_class aarch64_enc_ldarbw(iRegI dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2102
    MOV_VOLATILE(as_Register($dst$$reg), $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2103
             rscratch1, ldarb);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2104
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2105
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2106
  enc_class aarch64_enc_ldarb(iRegL dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2107
    MOV_VOLATILE(as_Register($dst$$reg), $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2108
             rscratch1, ldarb);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2109
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2110
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2111
  enc_class aarch64_enc_ldarshw(iRegI dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2112
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2113
    MOV_VOLATILE(dst_reg, $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2114
             rscratch1, ldarh);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2115
    __ sxthw(dst_reg, dst_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2116
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2117
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2118
  enc_class aarch64_enc_ldarsh(iRegL dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2119
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2120
    MOV_VOLATILE(dst_reg, $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2121
             rscratch1, ldarh);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2122
    __ sxth(dst_reg, dst_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2123
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2124
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2125
  enc_class aarch64_enc_ldarhw(iRegI dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2126
    MOV_VOLATILE(as_Register($dst$$reg), $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2127
             rscratch1, ldarh);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2128
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2129
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2130
  enc_class aarch64_enc_ldarh(iRegL dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2131
    MOV_VOLATILE(as_Register($dst$$reg), $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2132
             rscratch1, ldarh);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2133
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2134
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2135
  enc_class aarch64_enc_ldarw(iRegI dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2136
    MOV_VOLATILE(as_Register($dst$$reg), $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2137
             rscratch1, ldarw);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2138
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2139
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2140
  enc_class aarch64_enc_ldarw(iRegL dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2141
    MOV_VOLATILE(as_Register($dst$$reg), $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2142
             rscratch1, ldarw);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2143
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2144
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2145
  enc_class aarch64_enc_ldar(iRegL dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2146
    MOV_VOLATILE(as_Register($dst$$reg), $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2147
             rscratch1, ldar);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2148
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2149
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2150
  enc_class aarch64_enc_fldars(vRegF dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2151
    MOV_VOLATILE(rscratch1, $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2152
             rscratch1, ldarw);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2153
    __ fmovs(as_FloatRegister($dst$$reg), rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2154
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2155
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2156
  enc_class aarch64_enc_fldard(vRegD dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2157
    MOV_VOLATILE(rscratch1, $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2158
             rscratch1, ldar);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2159
    __ fmovd(as_FloatRegister($dst$$reg), rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2160
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2161
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2162
  enc_class aarch64_enc_stlr(iRegL src, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2163
    Register src_reg = as_Register($src$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2164
    // we sometimes get asked to store the stack pointer into the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2165
    // current thread -- we cannot do that directly on AArch64
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2166
    if (src_reg == r31_sp) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2167
        MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2168
      assert(as_Register($mem$$base) == rthread, "unexpected store for sp");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2169
      __ mov(rscratch2, sp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2170
      src_reg = rscratch2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2171
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2172
    MOV_VOLATILE(src_reg, $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2173
                 rscratch1, stlr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2174
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2175
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2176
  enc_class aarch64_enc_fstlrs(vRegF src, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2177
    {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2178
      MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2179
      FloatRegister src_reg = as_FloatRegister($src$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2180
      __ fmovs(rscratch2, src_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2181
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2182
    MOV_VOLATILE(rscratch2, $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2183
                 rscratch1, stlrw);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2184
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2185
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2186
  enc_class aarch64_enc_fstlrd(vRegD src, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2187
    {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2188
      MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2189
      FloatRegister src_reg = as_FloatRegister($src$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2190
      __ fmovd(rscratch2, src_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2191
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2192
    MOV_VOLATILE(rscratch2, $mem$$base, $mem$$index, $mem$$scale, $mem$$disp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2193
                 rscratch1, stlr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2194
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2195
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2196
  // synchronized read/update encodings
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2197
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2198
  enc_class aarch64_enc_ldaxr(iRegL dst, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2199
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2200
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2201
    Register base = as_Register($mem$$base);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2202
    int index = $mem$$index;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2203
    int scale = $mem$$scale;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2204
    int disp = $mem$$disp;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2205
    if (index == -1) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2206
       if (disp != 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2207
        __ lea(rscratch1, Address(base, disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2208
        __ ldaxr(dst_reg, rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2209
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2210
        // TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2211
        // should we ever get anything other than this case?
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2212
        __ ldaxr(dst_reg, base);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2213
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2214
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2215
      Register index_reg = as_Register(index);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2216
      if (disp == 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2217
        __ lea(rscratch1, Address(base, index_reg, Address::lsl(scale)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2218
        __ ldaxr(dst_reg, rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2219
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2220
        __ lea(rscratch1, Address(base, disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2221
        __ lea(rscratch1, Address(rscratch1, index_reg, Address::lsl(scale)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2222
        __ ldaxr(dst_reg, rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2223
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2224
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2225
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2226
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2227
  enc_class aarch64_enc_stlxr(iRegLNoSp src, memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2228
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2229
    Register src_reg = as_Register($src$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2230
    Register base = as_Register($mem$$base);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2231
    int index = $mem$$index;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2232
    int scale = $mem$$scale;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2233
    int disp = $mem$$disp;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2234
    if (index == -1) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2235
       if (disp != 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2236
        __ lea(rscratch2, Address(base, disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2237
        __ stlxr(rscratch1, src_reg, rscratch2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2238
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2239
        // TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2240
        // should we ever get anything other than this case?
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2241
        __ stlxr(rscratch1, src_reg, base);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2242
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2243
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2244
      Register index_reg = as_Register(index);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2245
      if (disp == 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2246
        __ lea(rscratch2, Address(base, index_reg, Address::lsl(scale)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2247
        __ stlxr(rscratch1, src_reg, rscratch2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2248
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2249
        __ lea(rscratch2, Address(base, disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2250
        __ lea(rscratch2, Address(rscratch2, index_reg, Address::lsl(scale)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2251
        __ stlxr(rscratch1, src_reg, rscratch2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2252
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2253
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2254
    __ cmpw(rscratch1, zr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2255
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2256
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2257
  enc_class aarch64_enc_cmpxchg(memory mem, iRegLNoSp oldval, iRegLNoSp newval) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2258
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2259
    Register old_reg = as_Register($oldval$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2260
    Register new_reg = as_Register($newval$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2261
    Register base = as_Register($mem$$base);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2262
    Register addr_reg;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2263
    int index = $mem$$index;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2264
    int scale = $mem$$scale;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2265
    int disp = $mem$$disp;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2266
    if (index == -1) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2267
       if (disp != 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2268
        __ lea(rscratch2, Address(base, disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2269
        addr_reg = rscratch2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2270
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2271
        // TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2272
        // should we ever get anything other than this case?
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2273
        addr_reg = base;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2274
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2275
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2276
      Register index_reg = as_Register(index);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2277
      if (disp == 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2278
        __ lea(rscratch2, Address(base, index_reg, Address::lsl(scale)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2279
        addr_reg = rscratch2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2280
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2281
        __ lea(rscratch2, Address(base, disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2282
        __ lea(rscratch2, Address(rscratch2, index_reg, Address::lsl(scale)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2283
        addr_reg = rscratch2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2284
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2285
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2286
    Label retry_load, done;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2287
    __ bind(retry_load);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2288
    __ ldxr(rscratch1, addr_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2289
    __ cmp(rscratch1, old_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2290
    __ br(Assembler::NE, done);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2291
    __ stlxr(rscratch1, new_reg, addr_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2292
    __ cbnzw(rscratch1, retry_load);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2293
    __ bind(done);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2294
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2295
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2296
  enc_class aarch64_enc_cmpxchgw(memory mem, iRegINoSp oldval, iRegINoSp newval) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2297
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2298
    Register old_reg = as_Register($oldval$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2299
    Register new_reg = as_Register($newval$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2300
    Register base = as_Register($mem$$base);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2301
    Register addr_reg;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2302
    int index = $mem$$index;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2303
    int scale = $mem$$scale;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2304
    int disp = $mem$$disp;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2305
    if (index == -1) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2306
       if (disp != 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2307
        __ lea(rscratch2, Address(base, disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2308
        addr_reg = rscratch2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2309
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2310
        // TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2311
        // should we ever get anything other than this case?
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2312
        addr_reg = base;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2313
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2314
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2315
      Register index_reg = as_Register(index);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2316
      if (disp == 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2317
        __ lea(rscratch2, Address(base, index_reg, Address::lsl(scale)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2318
        addr_reg = rscratch2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2319
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2320
        __ lea(rscratch2, Address(base, disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2321
        __ lea(rscratch2, Address(rscratch2, index_reg, Address::lsl(scale)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2322
        addr_reg = rscratch2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2323
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2324
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2325
    Label retry_load, done;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2326
    __ bind(retry_load);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2327
    __ ldxrw(rscratch1, addr_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2328
    __ cmpw(rscratch1, old_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2329
    __ br(Assembler::NE, done);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2330
    __ stlxrw(rscratch1, new_reg, addr_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2331
    __ cbnzw(rscratch1, retry_load);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2332
    __ bind(done);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2333
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2334
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2335
  // auxiliary used for CompareAndSwapX to set result register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2336
  enc_class aarch64_enc_cset_eq(iRegINoSp res) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2337
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2338
    Register res_reg = as_Register($res$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2339
    __ cset(res_reg, Assembler::EQ);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2340
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2341
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2342
  // prefetch encodings
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2343
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2344
  enc_class aarch64_enc_prefetchw(memory mem) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2345
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2346
    Register base = as_Register($mem$$base);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2347
    int index = $mem$$index;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2348
    int scale = $mem$$scale;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2349
    int disp = $mem$$disp;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2350
    if (index == -1) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2351
      __ prfm(Address(base, disp), PSTL1KEEP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2352
      __ nop();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2353
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2354
      Register index_reg = as_Register(index);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2355
      if (disp == 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2356
        __ prfm(Address(base, index_reg, Address::lsl(scale)), PSTL1KEEP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2357
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2358
        __ lea(rscratch1, Address(base, disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2359
	__ prfm(Address(rscratch1, index_reg, Address::lsl(scale)), PSTL1KEEP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2360
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2361
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2362
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2363
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2364
  enc_class aarch64_enc_clear_array_reg_reg(iRegL_R11 cnt, iRegP_R10 base) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2365
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2366
    Register cnt_reg = as_Register($cnt$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2367
    Register base_reg = as_Register($base$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2368
    // base is word aligned
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2369
    // cnt is count of words
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2370
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2371
    Label loop;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2372
    Label entry;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2373
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2374
//  Algorithm:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2375
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2376
//    scratch1 = cnt & 7;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2377
//    cnt -= scratch1;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2378
//    p += scratch1;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2379
//    switch (scratch1) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2380
//      do {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2381
//        cnt -= 8;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2382
//          p[-8] = 0;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2383
//        case 7:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2384
//          p[-7] = 0;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2385
//        case 6:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2386
//          p[-6] = 0;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2387
//          // ...
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2388
//        case 1:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2389
//          p[-1] = 0;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2390
//        case 0:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2391
//          p += 8;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2392
//      } while (cnt);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2393
//    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2394
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2395
    const int unroll = 8; // Number of str(zr) instructions we'll unroll
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2396
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2397
    __ andr(rscratch1, cnt_reg, unroll - 1);  // tmp1 = cnt % unroll
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2398
    __ sub(cnt_reg, cnt_reg, rscratch1);      // cnt -= unroll
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2399
    // base_reg always points to the end of the region we're about to zero
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2400
    __ add(base_reg, base_reg, rscratch1, Assembler::LSL, exact_log2(wordSize));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2401
    __ adr(rscratch2, entry);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2402
    __ sub(rscratch2, rscratch2, rscratch1, Assembler::LSL, 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2403
    __ br(rscratch2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2404
    __ bind(loop);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2405
    __ sub(cnt_reg, cnt_reg, unroll);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2406
    for (int i = -unroll; i < 0; i++)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2407
      __ str(zr, Address(base_reg, i * wordSize));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2408
    __ bind(entry);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2409
    __ add(base_reg, base_reg, unroll * wordSize);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2410
    __ cbnz(cnt_reg, loop);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2411
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2412
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2413
  /// mov envcodings
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2414
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2415
  enc_class aarch64_enc_movw_imm(iRegI dst, immI src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2416
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2417
    u_int32_t con = (u_int32_t)$src$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2418
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2419
    if (con == 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2420
      __ movw(dst_reg, zr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2421
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2422
      __ movw(dst_reg, con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2423
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2424
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2425
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2426
  enc_class aarch64_enc_mov_imm(iRegL dst, immL src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2427
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2428
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2429
    u_int64_t con = (u_int64_t)$src$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2430
    if (con == 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2431
      __ mov(dst_reg, zr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2432
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2433
      __ mov(dst_reg, con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2434
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2435
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2436
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2437
  enc_class aarch64_enc_mov_p(iRegP dst, immP src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2438
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2439
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2440
    address con = (address)$src$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2441
    if (con == NULL || con == (address)1) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2442
      ShouldNotReachHere();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2443
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2444
      relocInfo::relocType rtype = $src->constant_reloc();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2445
      if (rtype == relocInfo::oop_type) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2446
        __ movoop(dst_reg, (jobject)con, /*immediate*/true);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2447
      } else if (rtype == relocInfo::metadata_type) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2448
        __ mov_metadata(dst_reg, (Metadata*)con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2449
      } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2450
        assert(rtype == relocInfo::none, "unexpected reloc type");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2451
        if (con < (address)(uintptr_t)os::vm_page_size()) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2452
          __ mov(dst_reg, con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2453
        } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2454
          unsigned long offset;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2455
          __ adrp(dst_reg, con, offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2456
          __ add(dst_reg, dst_reg, offset);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2457
        }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2458
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2459
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2460
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2461
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2462
  enc_class aarch64_enc_mov_p0(iRegP dst, immP0 src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2463
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2464
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2465
    __ mov(dst_reg, zr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2466
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2467
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2468
  enc_class aarch64_enc_mov_p1(iRegP dst, immP_1 src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2469
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2470
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2471
    __ mov(dst_reg, (u_int64_t)1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2472
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2473
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2474
  enc_class aarch64_enc_mov_poll_page(iRegP dst, immPollPage src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2475
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2476
    address page = (address)$src$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2477
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2478
    unsigned long off;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2479
    __ adrp(dst_reg, Address(page, relocInfo::poll_type), off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2480
    assert(off == 0, "assumed offset == 0");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2481
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2482
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2483
  enc_class aarch64_enc_mov_byte_map_base(iRegP dst, immByteMapBase src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2484
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2485
    address page = (address)$src$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2486
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2487
    unsigned long off;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2488
    __ adrp(dst_reg, ExternalAddress(page), off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2489
    assert(off == 0, "assumed offset == 0");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2490
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2491
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2492
  enc_class aarch64_enc_mov_n(iRegN dst, immN src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2493
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2494
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2495
    address con = (address)$src$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2496
    if (con == NULL) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2497
      ShouldNotReachHere();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2498
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2499
      relocInfo::relocType rtype = $src->constant_reloc();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2500
      assert(rtype == relocInfo::oop_type, "unexpected reloc type");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2501
      __ set_narrow_oop(dst_reg, (jobject)con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2502
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2503
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2504
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2505
  enc_class aarch64_enc_mov_n0(iRegN dst, immN0 src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2506
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2507
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2508
    __ mov(dst_reg, zr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2509
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2510
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2511
  enc_class aarch64_enc_mov_nk(iRegN dst, immNKlass src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2512
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2513
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2514
    address con = (address)$src$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2515
    if (con == NULL) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2516
      ShouldNotReachHere();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2517
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2518
      relocInfo::relocType rtype = $src->constant_reloc();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2519
      assert(rtype == relocInfo::metadata_type, "unexpected reloc type");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2520
      __ set_narrow_klass(dst_reg, (Klass *)con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2521
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2522
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2523
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2524
  // arithmetic encodings
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2525
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2526
  enc_class aarch64_enc_addsubw_imm(iRegI dst, iRegI src1, immIAddSub src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2527
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2528
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2529
    Register src_reg = as_Register($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2530
    int32_t con = (int32_t)$src2$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2531
    // add has primary == 0, subtract has primary == 1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2532
    if ($primary) { con = -con; }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2533
    if (con < 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2534
      __ subw(dst_reg, src_reg, -con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2535
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2536
      __ addw(dst_reg, src_reg, con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2537
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2538
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2539
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2540
  enc_class aarch64_enc_addsub_imm(iRegL dst, iRegL src1, immLAddSub src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2541
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2542
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2543
    Register src_reg = as_Register($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2544
    int32_t con = (int32_t)$src2$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2545
    // add has primary == 0, subtract has primary == 1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2546
    if ($primary) { con = -con; }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2547
    if (con < 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2548
      __ sub(dst_reg, src_reg, -con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2549
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2550
      __ add(dst_reg, src_reg, con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2551
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2552
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2553
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2554
  enc_class aarch64_enc_divw(iRegI dst, iRegI src1, iRegI src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2555
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2556
   Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2557
   Register src1_reg = as_Register($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2558
   Register src2_reg = as_Register($src2$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2559
    __ corrected_idivl(dst_reg, src1_reg, src2_reg, false, rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2560
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2561
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2562
  enc_class aarch64_enc_div(iRegI dst, iRegI src1, iRegI src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2563
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2564
   Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2565
   Register src1_reg = as_Register($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2566
   Register src2_reg = as_Register($src2$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2567
    __ corrected_idivq(dst_reg, src1_reg, src2_reg, false, rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2568
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2569
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2570
  enc_class aarch64_enc_modw(iRegI dst, iRegI src1, iRegI src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2571
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2572
   Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2573
   Register src1_reg = as_Register($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2574
   Register src2_reg = as_Register($src2$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2575
    __ corrected_idivl(dst_reg, src1_reg, src2_reg, true, rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2576
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2577
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2578
  enc_class aarch64_enc_mod(iRegI dst, iRegI src1, iRegI src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2579
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2580
   Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2581
   Register src1_reg = as_Register($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2582
   Register src2_reg = as_Register($src2$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2583
    __ corrected_idivq(dst_reg, src1_reg, src2_reg, true, rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2584
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2585
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2586
  // compare instruction encodings
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2587
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2588
  enc_class aarch64_enc_cmpw(iRegI src1, iRegI src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2589
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2590
    Register reg1 = as_Register($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2591
    Register reg2 = as_Register($src2$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2592
    __ cmpw(reg1, reg2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2593
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2594
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2595
  enc_class aarch64_enc_cmpw_imm_addsub(iRegI src1, immIAddSub src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2596
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2597
    Register reg = as_Register($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2598
    int32_t val = $src2$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2599
    if (val >= 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2600
      __ subsw(zr, reg, val);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2601
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2602
      __ addsw(zr, reg, -val);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2603
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2604
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2605
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2606
  enc_class aarch64_enc_cmpw_imm(iRegI src1, immI src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2607
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2608
    Register reg1 = as_Register($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2609
    u_int32_t val = (u_int32_t)$src2$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2610
    __ movw(rscratch1, val);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2611
    __ cmpw(reg1, rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2612
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2613
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2614
  enc_class aarch64_enc_cmp(iRegL src1, iRegL src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2615
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2616
    Register reg1 = as_Register($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2617
    Register reg2 = as_Register($src2$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2618
    __ cmp(reg1, reg2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2619
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2620
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2621
  enc_class aarch64_enc_cmp_imm_addsub(iRegL src1, immL12 src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2622
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2623
    Register reg = as_Register($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2624
    int64_t val = $src2$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2625
    if (val >= 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2626
      __ subs(zr, reg, val);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2627
    } else if (val != -val) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2628
      __ adds(zr, reg, -val);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2629
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2630
    // aargh, Long.MIN_VALUE is a special case
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2631
      __ orr(rscratch1, zr, (u_int64_t)val);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2632
      __ subs(zr, reg, rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2633
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2634
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2635
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2636
  enc_class aarch64_enc_cmp_imm(iRegL src1, immL src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2637
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2638
    Register reg1 = as_Register($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2639
    u_int64_t val = (u_int64_t)$src2$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2640
    __ mov(rscratch1, val);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2641
    __ cmp(reg1, rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2642
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2643
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2644
  enc_class aarch64_enc_cmpp(iRegP src1, iRegP src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2645
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2646
    Register reg1 = as_Register($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2647
    Register reg2 = as_Register($src2$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2648
    __ cmp(reg1, reg2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2649
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2650
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2651
  enc_class aarch64_enc_cmpn(iRegN src1, iRegN src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2652
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2653
    Register reg1 = as_Register($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2654
    Register reg2 = as_Register($src2$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2655
    __ cmpw(reg1, reg2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2656
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2657
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2658
  enc_class aarch64_enc_testp(iRegP src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2659
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2660
    Register reg = as_Register($src$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2661
    __ cmp(reg, zr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2662
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2663
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2664
  enc_class aarch64_enc_testn(iRegN src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2665
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2666
    Register reg = as_Register($src$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2667
    __ cmpw(reg, zr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2668
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2669
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2670
  enc_class aarch64_enc_b(label lbl) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2671
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2672
    Label *L = $lbl$$label;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2673
    __ b(*L);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2674
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2675
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2676
  enc_class aarch64_enc_br_con(cmpOp cmp, label lbl) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2677
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2678
    Label *L = $lbl$$label;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2679
    __ br ((Assembler::Condition)$cmp$$cmpcode, *L);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2680
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2681
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2682
  enc_class aarch64_enc_br_conU(cmpOpU cmp, label lbl) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2683
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2684
    Label *L = $lbl$$label;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2685
    __ br ((Assembler::Condition)$cmp$$cmpcode, *L);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2686
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2687
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2688
  enc_class aarch64_enc_partial_subtype_check(iRegP sub, iRegP super, iRegP temp, iRegP result)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2689
  %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2690
     Register sub_reg = as_Register($sub$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2691
     Register super_reg = as_Register($super$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2692
     Register temp_reg = as_Register($temp$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2693
     Register result_reg = as_Register($result$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2694
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2695
     Label miss;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2696
     MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2697
     __ check_klass_subtype_slow_path(sub_reg, super_reg, temp_reg, result_reg,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2698
                                     NULL, &miss,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2699
                                     /*set_cond_codes:*/ true);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2700
     if ($primary) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2701
       __ mov(result_reg, zr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2702
     }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2703
     __ bind(miss);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2704
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2705
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2706
  enc_class aarch64_enc_java_static_call(method meth) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2707
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2708
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2709
    address addr = (address)$meth$$method;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2710
    if (!_method) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2711
      // A call to a runtime wrapper, e.g. new, new_typeArray_Java, uncommon_trap.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2712
      __ trampoline_call(Address(addr, relocInfo::runtime_call_type), &cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2713
    } else if (_optimized_virtual) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2714
      __ trampoline_call(Address(addr, relocInfo::opt_virtual_call_type), &cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2715
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2716
      __ trampoline_call(Address(addr, relocInfo::static_call_type), &cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2717
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2718
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2719
    if (_method) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2720
      // Emit stub for static call
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2721
      CompiledStaticCall::emit_to_interp_stub(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2722
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2723
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2724
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2725
  enc_class aarch64_enc_java_handle_call(method meth) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2726
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2727
    relocInfo::relocType reloc;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2728
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2729
    // RFP is preserved across all calls, even compiled calls.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2730
    // Use it to preserve SP.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2731
    __ mov(rfp, sp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2732
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2733
    const int start_offset = __ offset();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2734
    address addr = (address)$meth$$method;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2735
    if (!_method) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2736
      // A call to a runtime wrapper, e.g. new, new_typeArray_Java, uncommon_trap.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2737
      __ trampoline_call(Address(addr, relocInfo::runtime_call_type), &cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2738
    } else if (_optimized_virtual) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2739
      __ trampoline_call(Address(addr, relocInfo::opt_virtual_call_type), &cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2740
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2741
      __ trampoline_call(Address(addr, relocInfo::static_call_type), &cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2742
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2743
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2744
    if (_method) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2745
      // Emit stub for static call
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2746
      CompiledStaticCall::emit_to_interp_stub(cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2747
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2748
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2749
    // now restore sp
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2750
    __ mov(sp, rfp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2751
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2752
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2753
  enc_class aarch64_enc_java_dynamic_call(method meth) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2754
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2755
    __ ic_call((address)$meth$$method);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2756
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2757
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2758
  enc_class aarch64_enc_call_epilog() %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2759
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2760
    if (VerifyStackAtCalls) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2761
      // Check that stack depth is unchanged: find majik cookie on stack
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2762
      __ call_Unimplemented();
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2763
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2764
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2765
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2766
  enc_class aarch64_enc_java_to_runtime(method meth) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2767
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2768
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2769
    // some calls to generated routines (arraycopy code) are scheduled
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2770
    // by C2 as runtime calls. if so we can call them using a br (they
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2771
    // will be in a reachable segment) otherwise we have to use a blrt
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2772
    // which loads the absolute address into a register.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2773
    address entry = (address)$meth$$method;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2774
    CodeBlob *cb = CodeCache::find_blob(entry);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2775
    if (cb) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2776
      __ trampoline_call(Address(entry, relocInfo::runtime_call_type));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2777
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2778
      int gpcnt;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2779
      int fpcnt;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2780
      int rtype;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2781
      getCallInfo(tf(), gpcnt, fpcnt, rtype);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2782
      Label retaddr;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2783
      __ adr(rscratch2, retaddr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2784
      __ lea(rscratch1, RuntimeAddress(entry));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2785
      // Leave a breadcrumb for JavaThread::pd_last_frame().
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2786
      __ stp(zr, rscratch2, Address(__ pre(sp, -2 * wordSize)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2787
      __ blrt(rscratch1, gpcnt, fpcnt, rtype);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2788
      __ bind(retaddr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2789
      __ add(sp, sp, 2 * wordSize);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2790
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2791
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2792
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2793
  enc_class aarch64_enc_rethrow() %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2794
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2795
    __ far_jump(RuntimeAddress(OptoRuntime::rethrow_stub()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2796
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2797
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2798
  enc_class aarch64_enc_ret() %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2799
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2800
    __ ret(lr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2801
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2802
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2803
  enc_class aarch64_enc_tail_call(iRegP jump_target) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2804
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2805
    Register target_reg = as_Register($jump_target$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2806
    __ br(target_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2807
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2808
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2809
  enc_class aarch64_enc_tail_jmp(iRegP jump_target) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2810
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2811
    Register target_reg = as_Register($jump_target$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2812
    // exception oop should be in r0
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2813
    // ret addr has been popped into lr
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2814
    // callee expects it in r3
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2815
    __ mov(r3, lr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2816
    __ br(target_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2817
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2818
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2819
  enc_class aarch64_enc_fast_lock(iRegP object, iRegP box, iRegP tmp, iRegP tmp2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2820
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2821
    Register oop = as_Register($object$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2822
    Register box = as_Register($box$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2823
    Register disp_hdr = as_Register($tmp$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2824
    Register tmp = as_Register($tmp2$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2825
    Label cont;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2826
    Label object_has_monitor;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2827
    Label cas_failed;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2828
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2829
    assert_different_registers(oop, box, tmp, disp_hdr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2830
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2831
    // Load markOop from object into displaced_header.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2832
    __ ldr(disp_hdr, Address(oop, oopDesc::mark_offset_in_bytes()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2833
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2834
    // Always do locking in runtime.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2835
    if (EmitSync & 0x01) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2836
      __ cmp(oop, zr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2837
      return;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2838
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2839
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2840
    if (UseBiasedLocking) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2841
      __ biased_locking_enter(disp_hdr, oop, box, tmp, true, cont);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2842
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2843
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2844
    // Handle existing monitor
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2845
    if (EmitSync & 0x02) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2846
      // we can use AArch64's bit test and branch here but
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2847
      // markoopDesc does not define a bit index just the bit value
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2848
      // so assert in case the bit pos changes
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2849
#     define __monitor_value_log2 1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2850
      assert(markOopDesc::monitor_value == (1 << __monitor_value_log2), "incorrect bit position");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2851
      __ tbnz(disp_hdr, __monitor_value_log2, object_has_monitor);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2852
#     undef __monitor_value_log2
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2853
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2854
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2855
    // Set displaced_header to be (markOop of object | UNLOCK_VALUE).
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2856
    __ orr(disp_hdr, disp_hdr, markOopDesc::unlocked_value);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2857
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2858
    // Load Compare Value application register.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2859
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2860
    // Initialize the box. (Must happen before we update the object mark!)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2861
    __ str(disp_hdr, Address(box, BasicLock::displaced_header_offset_in_bytes()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2862
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2863
    // Compare object markOop with mark and if equal exchange scratch1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2864
    // with object markOop.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2865
    // Note that this is simply a CAS: it does not generate any
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2866
    // barriers.  These are separately generated by
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2867
    // membar_acquire_lock().
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2868
    {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2869
      Label retry_load;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2870
      __ bind(retry_load);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2871
      __ ldxr(tmp, oop);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2872
      __ cmp(tmp, disp_hdr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2873
      __ br(Assembler::NE, cas_failed);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2874
      // use stlxr to ensure update is immediately visible
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2875
      __ stlxr(tmp, box, oop);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2876
      __ cbzw(tmp, cont);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2877
      __ b(retry_load);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2878
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2879
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2880
    // Formerly:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2881
    // __ cmpxchgptr(/*oldv=*/disp_hdr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2882
    //               /*newv=*/box,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2883
    //               /*addr=*/oop,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2884
    //               /*tmp=*/tmp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2885
    //               cont,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2886
    //               /*fail*/NULL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2887
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2888
    assert(oopDesc::mark_offset_in_bytes() == 0, "offset of _mark is not 0");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2889
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2890
    // If the compare-and-exchange succeeded, then we found an unlocked
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2891
    // object, will have now locked it will continue at label cont
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2892
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2893
    __ bind(cas_failed);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2894
    // We did not see an unlocked object so try the fast recursive case.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2895
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2896
    // Check if the owner is self by comparing the value in the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2897
    // markOop of object (disp_hdr) with the stack pointer.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2898
    __ mov(rscratch1, sp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2899
    __ sub(disp_hdr, disp_hdr, rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2900
    __ mov(tmp, (address) (~(os::vm_page_size()-1) | markOopDesc::lock_mask_in_place));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2901
    // If condition is true we are cont and hence we can store 0 as the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2902
    // displaced header in the box, which indicates that it is a recursive lock.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2903
    __ ands(tmp/*==0?*/, disp_hdr, tmp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2904
    __ str(tmp/*==0, perhaps*/, Address(box, BasicLock::displaced_header_offset_in_bytes()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2905
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2906
    // Handle existing monitor.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2907
    if ((EmitSync & 0x02) == 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2908
      __ b(cont);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2909
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2910
      __ bind(object_has_monitor);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2911
      // The object's monitor m is unlocked iff m->owner == NULL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2912
      // otherwise m->owner may contain a thread or a stack address.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2913
      //
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2914
      // Try to CAS m->owner from NULL to current thread.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2915
      __ add(tmp, disp_hdr, (ObjectMonitor::owner_offset_in_bytes()-markOopDesc::monitor_value));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2916
      __ mov(disp_hdr, zr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2917
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2918
      {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2919
        Label retry_load, fail;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2920
        __ bind(retry_load);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2921
        __ ldxr(rscratch1, tmp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2922
        __ cmp(disp_hdr, rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2923
        __ br(Assembler::NE, fail);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2924
        // use stlxr to ensure update is immediately visible
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2925
        __ stlxr(rscratch1, rthread, tmp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2926
        __ cbnzw(rscratch1, retry_load);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2927
        __ bind(fail);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2928
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2929
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2930
      // Label next;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2931
      // __ cmpxchgptr(/*oldv=*/disp_hdr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2932
      //               /*newv=*/rthread,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2933
      //               /*addr=*/tmp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2934
      //               /*tmp=*/rscratch1,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2935
      //               /*succeed*/next,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2936
      //               /*fail*/NULL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2937
      // __ bind(next);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2938
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2939
      // store a non-null value into the box.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2940
      __ str(box, Address(box, BasicLock::displaced_header_offset_in_bytes()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2941
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2942
      // PPC port checks the following invariants
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2943
      // #ifdef ASSERT
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2944
      // bne(flag, cont);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2945
      // We have acquired the monitor, check some invariants.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2946
      // addw(/*monitor=*/tmp, tmp, -ObjectMonitor::owner_offset_in_bytes());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2947
      // Invariant 1: _recursions should be 0.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2948
      // assert(ObjectMonitor::recursions_size_in_bytes() == 8, "unexpected size");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2949
      // assert_mem8_is_zero(ObjectMonitor::recursions_offset_in_bytes(), tmp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2950
      //                        "monitor->_recursions should be 0", -1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2951
      // Invariant 2: OwnerIsThread shouldn't be 0.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2952
      // assert(ObjectMonitor::OwnerIsThread_size_in_bytes() == 4, "unexpected size");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2953
      //assert_mem4_isnot_zero(ObjectMonitor::OwnerIsThread_offset_in_bytes(), tmp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2954
      //                           "monitor->OwnerIsThread shouldn't be 0", -1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2955
      // #endif
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2956
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2957
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2958
    __ bind(cont);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2959
    // flag == EQ indicates success
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2960
    // flag == NE indicates failure
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2961
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2962
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2963
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2964
  // TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2965
  // reimplement this with custom cmpxchgptr code
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2966
  // which avoids some of the unnecessary branching
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2967
  enc_class aarch64_enc_fast_unlock(iRegP object, iRegP box, iRegP tmp, iRegP tmp2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2968
    MacroAssembler _masm(&cbuf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2969
    Register oop = as_Register($object$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2970
    Register box = as_Register($box$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2971
    Register disp_hdr = as_Register($tmp$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2972
    Register tmp = as_Register($tmp2$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2973
    Label cont;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2974
    Label object_has_monitor;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2975
    Label cas_failed;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2976
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2977
    assert_different_registers(oop, box, tmp, disp_hdr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2978
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2979
    // Always do locking in runtime.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2980
    if (EmitSync & 0x01) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2981
      __ cmp(oop, zr); // Oop can't be 0 here => always false.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2982
      return;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2983
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2984
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2985
    if (UseBiasedLocking) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2986
      __ biased_locking_exit(oop, tmp, cont);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2987
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2988
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2989
    // Find the lock address and load the displaced header from the stack.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2990
    __ ldr(disp_hdr, Address(box, BasicLock::displaced_header_offset_in_bytes()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2991
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2992
    // If the displaced header is 0, we have a recursive unlock.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2993
    __ cmp(disp_hdr, zr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2994
    __ br(Assembler::EQ, cont);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2995
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2996
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2997
    // Handle existing monitor.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2998
    if ((EmitSync & 0x02) == 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  2999
      __ ldr(tmp, Address(oop, oopDesc::mark_offset_in_bytes()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3000
      __ tbnz(disp_hdr, exact_log2(markOopDesc::monitor_value), object_has_monitor);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3001
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3002
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3003
    // Check if it is still a light weight lock, this is is true if we
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3004
    // see the stack address of the basicLock in the markOop of the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3005
    // object.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3006
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3007
      {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3008
        Label retry_load;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3009
        __ bind(retry_load);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3010
        __ ldxr(tmp, oop);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3011
        __ cmp(box, tmp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3012
        __ br(Assembler::NE, cas_failed);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3013
        // use stlxr to ensure update is immediately visible
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3014
        __ stlxr(tmp, disp_hdr, oop);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3015
        __ cbzw(tmp, cont);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3016
        __ b(retry_load);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3017
      }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3018
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3019
    // __ cmpxchgptr(/*compare_value=*/box,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3020
    //               /*exchange_value=*/disp_hdr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3021
    //               /*where=*/oop,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3022
    //               /*result=*/tmp,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3023
    //               cont,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3024
    //               /*cas_failed*/NULL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3025
    assert(oopDesc::mark_offset_in_bytes() == 0, "offset of _mark is not 0");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3026
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3027
    __ bind(cas_failed);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3028
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3029
    // Handle existing monitor.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3030
    if ((EmitSync & 0x02) == 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3031
      __ b(cont);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3032
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3033
      __ bind(object_has_monitor);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3034
      __ add(tmp, tmp, -markOopDesc::monitor_value); // monitor
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3035
      __ ldr(rscratch1, Address(tmp, ObjectMonitor::owner_offset_in_bytes()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3036
      __ ldr(disp_hdr, Address(tmp, ObjectMonitor::recursions_offset_in_bytes()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3037
      __ eor(rscratch1, rscratch1, rthread); // Will be 0 if we are the owner.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3038
      __ orr(rscratch1, rscratch1, disp_hdr); // Will be 0 if there are 0 recursions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3039
      __ cmp(rscratch1, zr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3040
      __ br(Assembler::NE, cont);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3041
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3042
      __ ldr(rscratch1, Address(tmp, ObjectMonitor::EntryList_offset_in_bytes()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3043
      __ ldr(disp_hdr, Address(tmp, ObjectMonitor::cxq_offset_in_bytes()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3044
      __ orr(rscratch1, rscratch1, disp_hdr); // Will be 0 if both are 0.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3045
      __ cmp(rscratch1, zr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3046
      __ cbnz(rscratch1, cont);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3047
      // need a release store here
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3048
      __ lea(tmp, Address(tmp, ObjectMonitor::owner_offset_in_bytes()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3049
      __ stlr(rscratch1, tmp); // rscratch1 is zero
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3050
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3051
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3052
    __ bind(cont);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3053
    // flag == EQ indicates success
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3054
    // flag == NE indicates failure
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3055
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3056
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3057
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3058
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3059
//----------FRAME--------------------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3060
// Definition of frame structure and management information.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3061
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3062
//  S T A C K   L A Y O U T    Allocators stack-slot number
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3063
//                             |   (to get allocators register number
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3064
//  G  Owned by    |        |  v    add OptoReg::stack0())
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3065
//  r   CALLER     |        |
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3066
//  o     |        +--------+      pad to even-align allocators stack-slot
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3067
//  w     V        |  pad0  |        numbers; owned by CALLER
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3068
//  t   -----------+--------+----> Matcher::_in_arg_limit, unaligned
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3069
//  h     ^        |   in   |  5
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3070
//        |        |  args  |  4   Holes in incoming args owned by SELF
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3071
//  |     |        |        |  3
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3072
//  |     |        +--------+
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3073
//  V     |        | old out|      Empty on Intel, window on Sparc
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3074
//        |    old |preserve|      Must be even aligned.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3075
//        |     SP-+--------+----> Matcher::_old_SP, even aligned
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3076
//        |        |   in   |  3   area for Intel ret address
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3077
//     Owned by    |preserve|      Empty on Sparc.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3078
//       SELF      +--------+
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3079
//        |        |  pad2  |  2   pad to align old SP
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3080
//        |        +--------+  1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3081
//        |        | locks  |  0
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3082
//        |        +--------+----> OptoReg::stack0(), even aligned
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3083
//        |        |  pad1  | 11   pad to align new SP
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3084
//        |        +--------+
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3085
//        |        |        | 10
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3086
//        |        | spills |  9   spills
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3087
//        V        |        |  8   (pad0 slot for callee)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3088
//      -----------+--------+----> Matcher::_out_arg_limit, unaligned
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3089
//        ^        |  out   |  7
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3090
//        |        |  args  |  6   Holes in outgoing args owned by CALLEE
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3091
//     Owned by    +--------+
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3092
//      CALLEE     | new out|  6   Empty on Intel, window on Sparc
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3093
//        |    new |preserve|      Must be even-aligned.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3094
//        |     SP-+--------+----> Matcher::_new_SP, even aligned
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3095
//        |        |        |
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3096
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3097
// Note 1: Only region 8-11 is determined by the allocator.  Region 0-5 is
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3098
//         known from SELF's arguments and the Java calling convention.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3099
//         Region 6-7 is determined per call site.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3100
// Note 2: If the calling convention leaves holes in the incoming argument
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3101
//         area, those holes are owned by SELF.  Holes in the outgoing area
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3102
//         are owned by the CALLEE.  Holes should not be nessecary in the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3103
//         incoming area, as the Java calling convention is completely under
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3104
//         the control of the AD file.  Doubles can be sorted and packed to
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3105
//         avoid holes.  Holes in the outgoing arguments may be nessecary for
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3106
//         varargs C calling conventions.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3107
// Note 3: Region 0-3 is even aligned, with pad2 as needed.  Region 3-5 is
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3108
//         even aligned with pad0 as needed.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3109
//         Region 6 is even aligned.  Region 6-7 is NOT even aligned;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3110
//           (the latter is true on Intel but is it false on AArch64?)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3111
//         region 6-11 is even aligned; it may be padded out more so that
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3112
//         the region from SP to FP meets the minimum stack alignment.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3113
// Note 4: For I2C adapters, the incoming FP may not meet the minimum stack
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3114
//         alignment.  Region 11, pad1, may be dynamically extended so that
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3115
//         SP meets the minimum alignment.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3116
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3117
frame %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3118
  // What direction does stack grow in (assumed to be same for C & Java)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3119
  stack_direction(TOWARDS_LOW);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3120
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3121
  // These three registers define part of the calling convention
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3122
  // between compiled code and the interpreter.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3123
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3124
  // Inline Cache Register or methodOop for I2C.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3125
  inline_cache_reg(R12);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3126
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3127
  // Method Oop Register when calling interpreter.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3128
  interpreter_method_oop_reg(R12);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3129
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3130
  // Number of stack slots consumed by locking an object
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3131
  sync_stack_slots(2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3132
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3133
  // Compiled code's Frame Pointer
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3134
  frame_pointer(R31);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3135
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3136
  // Interpreter stores its frame pointer in a register which is
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3137
  // stored to the stack by I2CAdaptors.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3138
  // I2CAdaptors convert from interpreted java to compiled java.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3139
  interpreter_frame_pointer(R29);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3140
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3141
  // Stack alignment requirement
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3142
  stack_alignment(StackAlignmentInBytes); // Alignment size in bytes (128-bit -> 16 bytes)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3143
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3144
  // Number of stack slots between incoming argument block and the start of
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3145
  // a new frame.  The PROLOG must add this many slots to the stack.  The
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3146
  // EPILOG must remove this many slots. aarch64 needs two slots for
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3147
  // return address and fp.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3148
  // TODO think this is correct but check
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3149
  in_preserve_stack_slots(4);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3150
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3151
  // Number of outgoing stack slots killed above the out_preserve_stack_slots
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3152
  // for calls to C.  Supports the var-args backing area for register parms.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3153
  varargs_C_out_slots_killed(frame::arg_reg_save_area_bytes/BytesPerInt);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3154
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3155
  // The after-PROLOG location of the return address.  Location of
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3156
  // return address specifies a type (REG or STACK) and a number
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3157
  // representing the register number (i.e. - use a register name) or
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3158
  // stack slot.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3159
  // Ret Addr is on stack in slot 0 if no locks or verification or alignment.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3160
  // Otherwise, it is above the locks and verification slot and alignment word
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3161
  // TODO this may well be correct but need to check why that - 2 is there
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3162
  // ppc port uses 0 but we definitely need to allow for fixed_slots
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3163
  // which folds in the space used for monitors
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3164
  return_addr(STACK - 2 +
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3165
              round_to((Compile::current()->in_preserve_stack_slots() +
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3166
                        Compile::current()->fixed_slots()),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3167
                       stack_alignment_in_slots()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3168
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3169
  // Body of function which returns an integer array locating
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3170
  // arguments either in registers or in stack slots.  Passed an array
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3171
  // of ideal registers called "sig" and a "length" count.  Stack-slot
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3172
  // offsets are based on outgoing arguments, i.e. a CALLER setting up
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3173
  // arguments for a CALLEE.  Incoming stack arguments are
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3174
  // automatically biased by the preserve_stack_slots field above.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3175
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3176
  calling_convention
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3177
  %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3178
    // No difference between ingoing/outgoing just pass false
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3179
    SharedRuntime::java_calling_convention(sig_bt, regs, length, false);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3180
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3181
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3182
  c_calling_convention
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3183
  %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3184
    // This is obviously always outgoing
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3185
    (void) SharedRuntime::c_calling_convention(sig_bt, regs, NULL, length);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3186
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3187
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3188
  // Location of compiled Java return values.  Same as C for now.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3189
  return_value
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3190
  %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3191
    // TODO do we allow ideal_reg == Op_RegN???
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3192
    assert(ideal_reg >= Op_RegI && ideal_reg <= Op_RegL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3193
           "only return normal values");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3194
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3195
    static const int lo[Op_RegL + 1] = { // enum name
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3196
      0,                                 // Op_Node
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3197
      0,                                 // Op_Set
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3198
      R0_num,                            // Op_RegN
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3199
      R0_num,                            // Op_RegI
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3200
      R0_num,                            // Op_RegP
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3201
      V0_num,                            // Op_RegF
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3202
      V0_num,                            // Op_RegD
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3203
      R0_num                             // Op_RegL
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3204
    };
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3205
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3206
    static const int hi[Op_RegL + 1] = { // enum name
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3207
      0,                                 // Op_Node
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3208
      0,                                 // Op_Set
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3209
      OptoReg::Bad,                       // Op_RegN
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3210
      OptoReg::Bad,                      // Op_RegI
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3211
      R0_H_num,                          // Op_RegP
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3212
      OptoReg::Bad,                      // Op_RegF
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3213
      V0_H_num,                          // Op_RegD
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3214
      R0_H_num                           // Op_RegL
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3215
    };
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3216
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3217
    return OptoRegPair(hi[ideal_reg], lo[ideal_reg]);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3218
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3219
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3220
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3221
//----------ATTRIBUTES---------------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3222
//----------Operand Attributes-------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3223
op_attrib op_cost(1);        // Required cost attribute
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3224
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3225
//----------Instruction Attributes---------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3226
ins_attrib ins_cost(INSN_COST); // Required cost attribute
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3227
ins_attrib ins_size(32);        // Required size attribute (in bits)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3228
ins_attrib ins_short_branch(0); // Required flag: is this instruction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3229
                                // a non-matching short branch variant
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3230
                                // of some long branch?
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3231
ins_attrib ins_alignment(4);    // Required alignment attribute (must
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3232
                                // be a power of 2) specifies the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3233
                                // alignment that some part of the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3234
                                // instruction (not necessarily the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3235
                                // start) requires.  If > 1, a
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3236
                                // compute_padding() function must be
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3237
                                // provided for the instruction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3238
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3239
//----------OPERANDS-----------------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3240
// Operand definitions must precede instruction definitions for correct parsing
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3241
// in the ADLC because operands constitute user defined types which are used in
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3242
// instruction definitions.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3243
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3244
//----------Simple Operands----------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3245
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3246
// Integer operands 32 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3247
// 32 bit immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3248
operand immI()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3249
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3250
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3251
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3252
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3253
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3254
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3255
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3256
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3257
// 32 bit zero
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3258
operand immI0()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3259
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3260
  predicate(n->get_int() == 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3261
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3262
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3263
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3264
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3265
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3266
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3267
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3268
// 32 bit unit increment
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3269
operand immI_1()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3270
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3271
  predicate(n->get_int() == 1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3272
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3273
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3274
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3275
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3276
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3277
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3278
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3279
// 32 bit unit decrement
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3280
operand immI_M1()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3281
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3282
  predicate(n->get_int() == -1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3283
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3284
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3285
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3286
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3287
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3288
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3289
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3290
operand immI_le_4()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3291
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3292
  predicate(n->get_int() <= 4);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3293
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3294
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3295
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3296
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3297
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3298
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3299
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3300
operand immI_31()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3301
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3302
  predicate(n->get_int() == 31);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3303
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3304
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3305
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3306
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3307
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3308
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3309
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3310
operand immI_8()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3311
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3312
  predicate(n->get_int() == 8);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3313
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3314
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3315
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3316
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3317
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3318
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3319
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3320
operand immI_16()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3321
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3322
  predicate(n->get_int() == 16);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3323
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3324
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3325
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3326
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3327
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3328
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3329
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3330
operand immI_24()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3331
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3332
  predicate(n->get_int() == 24);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3333
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3334
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3335
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3336
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3337
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3338
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3339
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3340
operand immI_32()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3341
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3342
  predicate(n->get_int() == 32);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3343
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3344
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3345
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3346
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3347
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3348
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3349
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3350
operand immI_48()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3351
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3352
  predicate(n->get_int() == 48);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3353
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3354
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3355
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3356
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3357
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3358
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3359
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3360
operand immI_56()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3361
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3362
  predicate(n->get_int() == 56);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3363
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3364
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3365
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3366
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3367
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3368
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3369
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3370
operand immI_64()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3371
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3372
  predicate(n->get_int() == 64);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3373
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3374
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3375
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3376
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3377
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3378
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3379
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3380
operand immI_255()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3381
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3382
  predicate(n->get_int() == 255);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3383
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3384
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3385
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3386
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3387
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3388
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3389
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3390
operand immI_65535()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3391
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3392
  predicate(n->get_int() == 65535);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3393
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3394
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3395
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3396
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3397
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3398
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3399
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3400
operand immL_63()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3401
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3402
  predicate(n->get_int() == 63);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3403
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3404
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3405
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3406
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3407
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3408
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3409
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3410
operand immL_255()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3411
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3412
  predicate(n->get_int() == 255);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3413
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3414
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3415
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3416
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3417
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3418
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3419
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3420
operand immL_65535()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3421
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3422
  predicate(n->get_long() == 65535L);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3423
  match(ConL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3424
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3425
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3426
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3427
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3428
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3429
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3430
operand immL_4294967295()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3431
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3432
  predicate(n->get_long() == 4294967295L);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3433
  match(ConL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3434
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3435
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3436
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3437
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3438
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3439
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3440
operand immL_bitmask()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3441
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3442
  predicate(((n->get_long() & 0xc000000000000000l) == 0)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3443
            && is_power_of_2(n->get_long() + 1));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3444
  match(ConL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3445
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3446
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3447
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3448
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3449
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3450
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3451
operand immI_bitmask()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3452
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3453
  predicate(((n->get_int() & 0xc0000000) == 0)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3454
            && is_power_of_2(n->get_int() + 1));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3455
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3456
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3457
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3458
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3459
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3460
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3461
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3462
// Scale values for scaled offset addressing modes (up to long but not quad)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3463
operand immIScale()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3464
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3465
  predicate(0 <= n->get_int() && (n->get_int() <= 3));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3466
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3467
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3468
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3469
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3470
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3471
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3472
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3473
// 26 bit signed offset -- for pc-relative branches
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3474
operand immI26()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3475
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3476
  predicate(((-(1 << 25)) <= n->get_int()) && (n->get_int() < (1 << 25)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3477
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3478
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3479
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3480
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3481
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3482
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3483
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3484
// 19 bit signed offset -- for pc-relative loads
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3485
operand immI19()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3486
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3487
  predicate(((-(1 << 18)) <= n->get_int()) && (n->get_int() < (1 << 18)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3488
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3489
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3490
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3491
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3492
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3493
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3494
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3495
// 12 bit unsigned offset -- for base plus immediate loads
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3496
operand immIU12()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3497
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3498
  predicate((0 <= n->get_int()) && (n->get_int() < (1 << 12)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3499
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3500
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3501
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3502
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3503
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3504
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3505
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3506
operand immLU12()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3507
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3508
  predicate((0 <= n->get_long()) && (n->get_long() < (1 << 12)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3509
  match(ConL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3510
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3511
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3512
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3513
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3514
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3515
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3516
// Offset for scaled or unscaled immediate loads and stores
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3517
operand immIOffset()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3518
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3519
  predicate(Address::offset_ok_for_immed(n->get_int()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3520
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3521
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3522
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3523
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3524
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3525
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3526
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3527
operand immLoffset()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3528
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3529
  predicate(Address::offset_ok_for_immed(n->get_long()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3530
  match(ConL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3531
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3532
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3533
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3534
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3535
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3536
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3537
// 32 bit integer valid for add sub immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3538
operand immIAddSub()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3539
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3540
  predicate(Assembler::operand_valid_for_add_sub_immediate((long)n->get_int()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3541
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3542
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3543
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3544
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3545
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3546
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3547
// 32 bit unsigned integer valid for logical immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3548
// TODO -- check this is right when e.g the mask is 0x80000000
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3549
operand immILog()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3550
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3551
  predicate(Assembler::operand_valid_for_logical_immediate(/*is32*/true, (unsigned long)n->get_int()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3552
  match(ConI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3553
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3554
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3555
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3556
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3557
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3558
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3559
// Integer operands 64 bit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3560
// 64 bit immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3561
operand immL()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3562
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3563
  match(ConL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3564
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3565
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3566
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3567
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3568
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3569
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3570
// 64 bit zero
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3571
operand immL0()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3572
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3573
  predicate(n->get_long() == 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3574
  match(ConL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3575
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3576
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3577
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3578
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3579
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3580
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3581
// 64 bit unit increment
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3582
operand immL_1()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3583
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3584
  predicate(n->get_long() == 1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3585
  match(ConL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3586
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3587
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3588
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3589
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3590
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3591
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3592
// 64 bit unit decrement
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3593
operand immL_M1()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3594
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3595
  predicate(n->get_long() == -1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3596
  match(ConL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3597
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3598
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3599
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3600
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3601
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3602
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3603
// 32 bit offset of pc in thread anchor
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3604
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3605
operand immL_pc_off()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3606
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3607
  predicate(n->get_long() == in_bytes(JavaThread::frame_anchor_offset()) +
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3608
                             in_bytes(JavaFrameAnchor::last_Java_pc_offset()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3609
  match(ConL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3610
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3611
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3612
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3613
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3614
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3615
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3616
// 64 bit integer valid for add sub immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3617
operand immLAddSub()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3618
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3619
  predicate(Assembler::operand_valid_for_add_sub_immediate(n->get_long()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3620
  match(ConL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3621
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3622
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3623
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3624
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3625
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3626
// 64 bit integer valid for logical immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3627
operand immLLog()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3628
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3629
  predicate(Assembler::operand_valid_for_logical_immediate(/*is32*/false, (unsigned long)n->get_long()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3630
  match(ConL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3631
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3632
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3633
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3634
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3635
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3636
// Long Immediate: low 32-bit mask
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3637
operand immL_32bits()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3638
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3639
  predicate(n->get_long() == 0xFFFFFFFFL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3640
  match(ConL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3641
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3642
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3643
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3644
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3645
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3646
// Pointer operands
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3647
// Pointer Immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3648
operand immP()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3649
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3650
  match(ConP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3651
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3652
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3653
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3654
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3655
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3656
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3657
// NULL Pointer Immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3658
operand immP0()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3659
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3660
  predicate(n->get_ptr() == 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3661
  match(ConP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3662
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3663
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3664
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3665
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3666
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3667
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3668
// Pointer Immediate One
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3669
// this is used in object initialization (initial object header)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3670
operand immP_1()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3671
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3672
  predicate(n->get_ptr() == 1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3673
  match(ConP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3674
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3675
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3676
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3677
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3678
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3679
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3680
// Polling Page Pointer Immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3681
operand immPollPage()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3682
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3683
  predicate((address)n->get_ptr() == os::get_polling_page());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3684
  match(ConP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3685
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3686
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3687
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3688
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3689
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3690
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3691
// Card Table Byte Map Base
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3692
operand immByteMapBase()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3693
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3694
  // Get base of card map
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3695
  predicate((jbyte*)n->get_ptr() ==
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3696
        ((CardTableModRefBS*)(Universe::heap()->barrier_set()))->byte_map_base);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3697
  match(ConP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3698
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3699
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3700
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3701
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3702
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3703
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3704
// Pointer Immediate Minus One
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3705
// this is used when we want to write the current PC to the thread anchor
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3706
operand immP_M1()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3707
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3708
  predicate(n->get_ptr() == -1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3709
  match(ConP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3710
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3711
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3712
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3713
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3714
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3715
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3716
// Pointer Immediate Minus Two
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3717
// this is used when we want to write the current PC to the thread anchor
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3718
operand immP_M2()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3719
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3720
  predicate(n->get_ptr() == -2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3721
  match(ConP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3722
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3723
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3724
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3725
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3726
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3727
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3728
// Float and Double operands
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3729
// Double Immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3730
operand immD()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3731
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3732
  match(ConD);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3733
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3734
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3735
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3736
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3737
29581
b8d83fef0c8e 8074869: C2 code generator can replace -0.0f with +0.0f on Linux
zmajo
parents: 29214
diff changeset
  3738
// Double Immediate: +0.0d
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3739
operand immD0()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3740
%{
29581
b8d83fef0c8e 8074869: C2 code generator can replace -0.0f with +0.0f on Linux
zmajo
parents: 29214
diff changeset
  3741
  predicate(jlong_cast(n->getd()) == 0);
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3742
  match(ConD);
29581
b8d83fef0c8e 8074869: C2 code generator can replace -0.0f with +0.0f on Linux
zmajo
parents: 29214
diff changeset
  3743
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3744
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3745
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3746
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3747
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3748
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3749
// constant 'double +0.0'.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3750
operand immDPacked()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3751
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3752
  predicate(Assembler::operand_valid_for_float_immediate(n->getd()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3753
  match(ConD);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3754
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3755
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3756
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3757
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3758
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3759
// Float Immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3760
operand immF()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3761
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3762
  match(ConF);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3763
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3764
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3765
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3766
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3767
29581
b8d83fef0c8e 8074869: C2 code generator can replace -0.0f with +0.0f on Linux
zmajo
parents: 29214
diff changeset
  3768
// Float Immediate: +0.0f.
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3769
operand immF0()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3770
%{
29581
b8d83fef0c8e 8074869: C2 code generator can replace -0.0f with +0.0f on Linux
zmajo
parents: 29214
diff changeset
  3771
  predicate(jint_cast(n->getf()) == 0);
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3772
  match(ConF);
29581
b8d83fef0c8e 8074869: C2 code generator can replace -0.0f with +0.0f on Linux
zmajo
parents: 29214
diff changeset
  3773
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3774
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3775
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3776
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3777
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3778
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3779
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3780
operand immFPacked()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3781
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3782
  predicate(Assembler::operand_valid_for_float_immediate((double)n->getf()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3783
  match(ConF);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3784
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3785
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3786
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3787
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3788
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3789
// Narrow pointer operands
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3790
// Narrow Pointer Immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3791
operand immN()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3792
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3793
  match(ConN);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3794
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3795
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3796
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3797
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3798
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3799
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3800
// Narrow NULL Pointer Immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3801
operand immN0()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3802
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3803
  predicate(n->get_narrowcon() == 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3804
  match(ConN);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3805
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3806
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3807
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3808
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3809
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3810
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3811
operand immNKlass()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3812
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3813
  match(ConNKlass);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3814
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3815
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3816
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3817
  interface(CONST_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3818
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3819
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3820
// Integer 32 bit Register Operands
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3821
// Integer 32 bitRegister (excludes SP)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3822
operand iRegI()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3823
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3824
  constraint(ALLOC_IN_RC(any_reg32));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3825
  match(RegI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3826
  match(iRegINoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3827
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3828
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3829
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3830
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3831
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3832
// Integer 32 bit Register not Special
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3833
operand iRegINoSp()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3834
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3835
  constraint(ALLOC_IN_RC(no_special_reg32));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3836
  match(RegI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3837
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3838
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3839
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3840
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3841
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3842
// Integer 64 bit Register Operands
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3843
// Integer 64 bit Register (includes SP)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3844
operand iRegL()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3845
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3846
  constraint(ALLOC_IN_RC(any_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3847
  match(RegL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3848
  match(iRegLNoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3849
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3850
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3851
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3852
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3853
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3854
// Integer 64 bit Register not Special
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3855
operand iRegLNoSp()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3856
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3857
  constraint(ALLOC_IN_RC(no_special_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3858
  match(RegL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3859
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3860
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3861
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3862
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3863
// Pointer Register Operands
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3864
// Pointer Register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3865
operand iRegP()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3866
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3867
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3868
  match(RegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3869
  match(iRegPNoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3870
  match(iRegP_R0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3871
  //match(iRegP_R2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3872
  //match(iRegP_R4);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3873
  //match(iRegP_R5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3874
  match(thread_RegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3875
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3876
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3877
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3878
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3879
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3880
// Pointer 64 bit Register not Special
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3881
operand iRegPNoSp()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3882
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3883
  constraint(ALLOC_IN_RC(no_special_ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3884
  match(RegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3885
  // match(iRegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3886
  // match(iRegP_R0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3887
  // match(iRegP_R2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3888
  // match(iRegP_R4);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3889
  // match(iRegP_R5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3890
  // match(thread_RegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3891
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3892
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3893
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3894
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3895
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3896
// Pointer 64 bit Register R0 only
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3897
operand iRegP_R0()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3898
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3899
  constraint(ALLOC_IN_RC(r0_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3900
  match(RegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3901
  // match(iRegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3902
  match(iRegPNoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3903
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3904
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3905
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3906
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3907
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3908
// Pointer 64 bit Register R1 only
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3909
operand iRegP_R1()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3910
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3911
  constraint(ALLOC_IN_RC(r1_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3912
  match(RegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3913
  // match(iRegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3914
  match(iRegPNoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3915
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3916
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3917
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3918
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3919
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3920
// Pointer 64 bit Register R2 only
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3921
operand iRegP_R2()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3922
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3923
  constraint(ALLOC_IN_RC(r2_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3924
  match(RegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3925
  // match(iRegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3926
  match(iRegPNoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3927
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3928
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3929
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3930
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3931
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3932
// Pointer 64 bit Register R3 only
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3933
operand iRegP_R3()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3934
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3935
  constraint(ALLOC_IN_RC(r3_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3936
  match(RegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3937
  // match(iRegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3938
  match(iRegPNoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3939
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3940
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3941
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3942
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3943
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3944
// Pointer 64 bit Register R4 only
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3945
operand iRegP_R4()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3946
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3947
  constraint(ALLOC_IN_RC(r4_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3948
  match(RegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3949
  // match(iRegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3950
  match(iRegPNoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3951
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3952
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3953
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3954
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3955
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3956
// Pointer 64 bit Register R5 only
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3957
operand iRegP_R5()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3958
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3959
  constraint(ALLOC_IN_RC(r5_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3960
  match(RegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3961
  // match(iRegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3962
  match(iRegPNoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3963
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3964
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3965
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3966
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3967
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3968
// Pointer 64 bit Register R10 only
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3969
operand iRegP_R10()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3970
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3971
  constraint(ALLOC_IN_RC(r10_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3972
  match(RegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3973
  // match(iRegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3974
  match(iRegPNoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3975
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3976
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3977
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3978
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3979
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3980
// Long 64 bit Register R11 only
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3981
operand iRegL_R11()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3982
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3983
  constraint(ALLOC_IN_RC(r11_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3984
  match(RegL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3985
  match(iRegLNoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3986
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3987
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3988
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3989
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3990
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3991
// Pointer 64 bit Register FP only
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3992
operand iRegP_FP()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3993
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3994
  constraint(ALLOC_IN_RC(fp_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3995
  match(RegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3996
  // match(iRegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3997
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3998
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  3999
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4000
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4001
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4002
// Register R0 only
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4003
operand iRegI_R0()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4004
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4005
  constraint(ALLOC_IN_RC(int_r0_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4006
  match(RegI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4007
  match(iRegINoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4008
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4009
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4010
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4011
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4012
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4013
// Register R2 only
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4014
operand iRegI_R2()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4015
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4016
  constraint(ALLOC_IN_RC(int_r2_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4017
  match(RegI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4018
  match(iRegINoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4019
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4020
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4021
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4022
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4023
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4024
// Register R3 only
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4025
operand iRegI_R3()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4026
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4027
  constraint(ALLOC_IN_RC(int_r3_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4028
  match(RegI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4029
  match(iRegINoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4030
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4031
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4032
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4033
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4034
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4035
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4036
// Register R2 only
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4037
operand iRegI_R4()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4038
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4039
  constraint(ALLOC_IN_RC(int_r4_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4040
  match(RegI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4041
  match(iRegINoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4042
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4043
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4044
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4045
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4046
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4047
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4048
// Pointer Register Operands
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4049
// Narrow Pointer Register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4050
operand iRegN()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4051
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4052
  constraint(ALLOC_IN_RC(any_reg32));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4053
  match(RegN);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4054
  match(iRegNNoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4055
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4056
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4057
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4058
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4059
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4060
// Integer 64 bit Register not Special
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4061
operand iRegNNoSp()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4062
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4063
  constraint(ALLOC_IN_RC(no_special_reg32));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4064
  match(RegN);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4065
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4066
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4067
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4068
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4069
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4070
// heap base register -- used for encoding immN0
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4071
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4072
operand iRegIHeapbase()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4073
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4074
  constraint(ALLOC_IN_RC(heapbase_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4075
  match(RegI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4076
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4077
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4078
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4079
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4080
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4081
// Float Register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4082
// Float register operands
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4083
operand vRegF()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4084
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4085
  constraint(ALLOC_IN_RC(float_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4086
  match(RegF);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4087
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4088
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4089
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4090
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4091
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4092
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4093
// Double Register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4094
// Double register operands
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4095
operand vRegD()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4096
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4097
  constraint(ALLOC_IN_RC(double_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4098
  match(RegD);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4099
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4100
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4101
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4102
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4103
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4104
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4105
operand vRegD_V0()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4106
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4107
  constraint(ALLOC_IN_RC(v0_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4108
  match(RegD);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4109
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4110
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4111
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4112
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4113
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4114
operand vRegD_V1()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4115
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4116
  constraint(ALLOC_IN_RC(v1_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4117
  match(RegD);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4118
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4119
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4120
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4121
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4122
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4123
operand vRegD_V2()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4124
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4125
  constraint(ALLOC_IN_RC(v2_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4126
  match(RegD);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4127
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4128
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4129
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4130
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4131
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4132
operand vRegD_V3()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4133
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4134
  constraint(ALLOC_IN_RC(v3_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4135
  match(RegD);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4136
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4137
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4138
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4139
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4140
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4141
// Flags register, used as output of signed compare instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4142
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4143
// note that on AArch64 we also use this register as the output for
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4144
// for floating point compare instructions (CmpF CmpD). this ensures
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4145
// that ordered inequality tests use GT, GE, LT or LE none of which
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4146
// pass through cases where the result is unordered i.e. one or both
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4147
// inputs to the compare is a NaN. this means that the ideal code can
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4148
// replace e.g. a GT with an LE and not end up capturing the NaN case
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4149
// (where the comparison should always fail). EQ and NE tests are
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4150
// always generated in ideal code so that unordered folds into the NE
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4151
// case, matching the behaviour of AArch64 NE.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4152
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4153
// This differs from x86 where the outputs of FP compares use a
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4154
// special FP flags registers and where compares based on this
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4155
// register are distinguished into ordered inequalities (cmpOpUCF) and
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4156
// EQ/NEQ tests (cmpOpUCF2). x86 has to special case the latter tests
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4157
// to explicitly handle the unordered case in branches. x86 also has
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4158
// to include extra CMoveX rules to accept a cmpOpUCF input.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4159
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4160
operand rFlagsReg()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4161
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4162
  constraint(ALLOC_IN_RC(int_flags));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4163
  match(RegFlags);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4164
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4165
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4166
  format %{ "RFLAGS" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4167
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4168
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4169
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4170
// Flags register, used as output of unsigned compare instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4171
operand rFlagsRegU()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4172
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4173
  constraint(ALLOC_IN_RC(int_flags));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4174
  match(RegFlags);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4175
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4176
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4177
  format %{ "RFLAGSU" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4178
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4179
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4180
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4181
// Special Registers
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4182
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4183
// Method Register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4184
operand inline_cache_RegP(iRegP reg)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4185
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4186
  constraint(ALLOC_IN_RC(method_reg)); // inline_cache_reg
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4187
  match(reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4188
  match(iRegPNoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4189
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4190
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4191
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4192
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4193
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4194
operand interpreter_method_oop_RegP(iRegP reg)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4195
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4196
  constraint(ALLOC_IN_RC(method_reg)); // interpreter_method_oop_reg
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4197
  match(reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4198
  match(iRegPNoSp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4199
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4200
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4201
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4202
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4203
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4204
// Thread Register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4205
operand thread_RegP(iRegP reg)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4206
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4207
  constraint(ALLOC_IN_RC(thread_reg)); // link_reg
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4208
  match(reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4209
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4210
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4211
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4212
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4213
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4214
operand lr_RegP(iRegP reg)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4215
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4216
  constraint(ALLOC_IN_RC(lr_reg)); // link_reg
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4217
  match(reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4218
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4219
  format %{ %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4220
  interface(REG_INTER);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4221
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4222
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4223
//----------Memory Operands----------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4224
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4225
operand indirect(iRegP reg)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4226
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4227
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4228
  match(reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4229
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4230
  format %{ "[$reg]" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4231
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4232
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4233
    index(0xffffffff);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4234
    scale(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4235
    disp(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4236
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4237
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4238
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4239
operand indIndexScaledOffsetI(iRegP reg, iRegL lreg, immIScale scale, immIU12 off)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4240
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4241
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4242
  match(AddP (AddP reg (LShiftL lreg scale)) off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4243
  op_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4244
  format %{ "$reg, $lreg lsl($scale), $off" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4245
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4246
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4247
    index($lreg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4248
    scale($scale);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4249
    disp($off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4250
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4251
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4252
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4253
operand indIndexScaledOffsetL(iRegP reg, iRegL lreg, immIScale scale, immLU12 off)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4254
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4255
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4256
  match(AddP (AddP reg (LShiftL lreg scale)) off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4257
  op_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4258
  format %{ "$reg, $lreg lsl($scale), $off" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4259
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4260
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4261
    index($lreg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4262
    scale($scale);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4263
    disp($off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4264
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4265
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4266
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4267
operand indIndexScaledOffsetI2L(iRegP reg, iRegI ireg, immIScale scale, immLU12 off)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4268
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4269
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4270
  match(AddP (AddP reg (LShiftL (ConvI2L ireg) scale)) off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4271
  op_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4272
  format %{ "$reg, $ireg sxtw($scale), $off I2L" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4273
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4274
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4275
    index($ireg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4276
    scale($scale);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4277
    disp($off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4278
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4279
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4280
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4281
operand indIndexScaledI2L(iRegP reg, iRegI ireg, immIScale scale)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4282
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4283
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4284
  match(AddP reg (LShiftL (ConvI2L ireg) scale));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4285
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4286
  format %{ "$reg, $ireg sxtw($scale), 0, I2L" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4287
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4288
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4289
    index($ireg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4290
    scale($scale);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4291
    disp(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4292
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4293
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4294
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4295
operand indIndexScaled(iRegP reg, iRegL lreg, immIScale scale)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4296
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4297
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4298
  match(AddP reg (LShiftL lreg scale));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4299
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4300
  format %{ "$reg, $lreg lsl($scale)" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4301
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4302
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4303
    index($lreg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4304
    scale($scale);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4305
    disp(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4306
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4307
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4308
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4309
operand indIndex(iRegP reg, iRegL lreg)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4310
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4311
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4312
  match(AddP reg lreg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4313
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4314
  format %{ "$reg, $lreg" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4315
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4316
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4317
    index($lreg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4318
    scale(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4319
    disp(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4320
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4321
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4322
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4323
operand indOffI(iRegP reg, immIOffset off)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4324
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4325
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4326
  match(AddP reg off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4327
  op_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4328
  format %{ "[$reg, $off]" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4329
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4330
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4331
    index(0xffffffff);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4332
    scale(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4333
    disp($off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4334
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4335
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4336
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4337
operand indOffL(iRegP reg, immLoffset off)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4338
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4339
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4340
  match(AddP reg off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4341
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4342
  format %{ "[$reg, $off]" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4343
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4344
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4345
    index(0xffffffff);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4346
    scale(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4347
    disp($off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4348
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4349
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4350
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4351
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4352
operand indirectN(iRegN reg)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4353
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4354
  predicate(Universe::narrow_oop_shift() == 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4355
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4356
  match(DecodeN reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4357
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4358
  format %{ "[$reg]\t# narrow" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4359
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4360
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4361
    index(0xffffffff);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4362
    scale(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4363
    disp(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4364
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4365
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4366
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4367
operand indIndexScaledOffsetIN(iRegN reg, iRegL lreg, immIScale scale, immIU12 off)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4368
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4369
  predicate(Universe::narrow_oop_shift() == 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4370
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4371
  match(AddP (AddP (DecodeN reg) (LShiftL lreg scale)) off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4372
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4373
  format %{ "$reg, $lreg lsl($scale), $off\t# narrow" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4374
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4375
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4376
    index($lreg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4377
    scale($scale);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4378
    disp($off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4379
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4380
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4381
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4382
operand indIndexScaledOffsetLN(iRegN reg, iRegL lreg, immIScale scale, immLU12 off)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4383
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4384
  predicate(Universe::narrow_oop_shift() == 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4385
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4386
  match(AddP (AddP (DecodeN reg) (LShiftL lreg scale)) off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4387
  op_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4388
  format %{ "$reg, $lreg lsl($scale), $off\t# narrow" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4389
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4390
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4391
    index($lreg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4392
    scale($scale);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4393
    disp($off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4394
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4395
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4396
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4397
operand indIndexScaledOffsetI2LN(iRegN reg, iRegI ireg, immIScale scale, immLU12 off)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4398
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4399
  predicate(Universe::narrow_oop_shift() == 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4400
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4401
  match(AddP (AddP (DecodeN reg) (LShiftL (ConvI2L ireg) scale)) off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4402
  op_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4403
  format %{ "$reg, $ireg sxtw($scale), $off I2L\t# narrow" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4404
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4405
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4406
    index($ireg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4407
    scale($scale);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4408
    disp($off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4409
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4410
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4411
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4412
operand indIndexScaledI2LN(iRegN reg, iRegI ireg, immIScale scale)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4413
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4414
  predicate(Universe::narrow_oop_shift() == 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4415
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4416
  match(AddP (DecodeN reg) (LShiftL (ConvI2L ireg) scale));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4417
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4418
  format %{ "$reg, $ireg sxtw($scale), 0, I2L\t# narrow" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4419
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4420
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4421
    index($ireg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4422
    scale($scale);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4423
    disp(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4424
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4425
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4426
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4427
operand indIndexScaledN(iRegN reg, iRegL lreg, immIScale scale)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4428
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4429
  predicate(Universe::narrow_oop_shift() == 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4430
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4431
  match(AddP (DecodeN reg) (LShiftL lreg scale));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4432
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4433
  format %{ "$reg, $lreg lsl($scale)\t# narrow" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4434
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4435
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4436
    index($lreg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4437
    scale($scale);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4438
    disp(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4439
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4440
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4441
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4442
operand indIndexN(iRegN reg, iRegL lreg)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4443
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4444
  predicate(Universe::narrow_oop_shift() == 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4445
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4446
  match(AddP (DecodeN reg) lreg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4447
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4448
  format %{ "$reg, $lreg\t# narrow" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4449
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4450
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4451
    index($lreg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4452
    scale(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4453
    disp(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4454
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4455
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4456
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4457
operand indOffIN(iRegN reg, immIOffset off)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4458
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4459
  predicate(Universe::narrow_oop_shift() == 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4460
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4461
  match(AddP (DecodeN reg) off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4462
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4463
  format %{ "[$reg, $off]\t# narrow" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4464
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4465
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4466
    index(0xffffffff);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4467
    scale(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4468
    disp($off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4469
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4470
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4471
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4472
operand indOffLN(iRegN reg, immLoffset off)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4473
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4474
  predicate(Universe::narrow_oop_shift() == 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4475
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4476
  match(AddP (DecodeN reg) off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4477
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4478
  format %{ "[$reg, $off]\t# narrow" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4479
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4480
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4481
    index(0xffffffff);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4482
    scale(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4483
    disp($off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4484
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4485
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4486
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4487
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4488
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4489
// AArch64 opto stubs need to write to the pc slot in the thread anchor
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4490
operand thread_anchor_pc(thread_RegP reg, immL_pc_off off)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4491
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4492
  constraint(ALLOC_IN_RC(ptr_reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4493
  match(AddP reg off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4494
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4495
  format %{ "[$reg, $off]" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4496
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4497
    base($reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4498
    index(0xffffffff);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4499
    scale(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4500
    disp($off);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4501
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4502
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4503
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4504
//----------Special Memory Operands--------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4505
// Stack Slot Operand - This operand is used for loading and storing temporary
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4506
//                      values on the stack where a match requires a value to
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4507
//                      flow through memory.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4508
operand stackSlotP(sRegP reg)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4509
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4510
  constraint(ALLOC_IN_RC(stack_slots));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4511
  op_cost(100);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4512
  // No match rule because this operand is only generated in matching
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4513
  // match(RegP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4514
  format %{ "[$reg]" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4515
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4516
    base(0x1e);  // RSP
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4517
    index(0x0);  // No Index
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4518
    scale(0x0);  // No Scale
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4519
    disp($reg);  // Stack Offset
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4520
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4521
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4522
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4523
operand stackSlotI(sRegI reg)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4524
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4525
  constraint(ALLOC_IN_RC(stack_slots));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4526
  // No match rule because this operand is only generated in matching
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4527
  // match(RegI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4528
  format %{ "[$reg]" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4529
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4530
    base(0x1e);  // RSP
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4531
    index(0x0);  // No Index
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4532
    scale(0x0);  // No Scale
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4533
    disp($reg);  // Stack Offset
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4534
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4535
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4536
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4537
operand stackSlotF(sRegF reg)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4538
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4539
  constraint(ALLOC_IN_RC(stack_slots));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4540
  // No match rule because this operand is only generated in matching
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4541
  // match(RegF);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4542
  format %{ "[$reg]" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4543
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4544
    base(0x1e);  // RSP
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4545
    index(0x0);  // No Index
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4546
    scale(0x0);  // No Scale
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4547
    disp($reg);  // Stack Offset
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4548
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4549
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4550
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4551
operand stackSlotD(sRegD reg)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4552
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4553
  constraint(ALLOC_IN_RC(stack_slots));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4554
  // No match rule because this operand is only generated in matching
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4555
  // match(RegD);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4556
  format %{ "[$reg]" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4557
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4558
    base(0x1e);  // RSP
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4559
    index(0x0);  // No Index
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4560
    scale(0x0);  // No Scale
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4561
    disp($reg);  // Stack Offset
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4562
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4563
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4564
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4565
operand stackSlotL(sRegL reg)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4566
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4567
  constraint(ALLOC_IN_RC(stack_slots));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4568
  // No match rule because this operand is only generated in matching
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4569
  // match(RegL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4570
  format %{ "[$reg]" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4571
  interface(MEMORY_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4572
    base(0x1e);  // RSP
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4573
    index(0x0);  // No Index
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4574
    scale(0x0);  // No Scale
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4575
    disp($reg);  // Stack Offset
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4576
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4577
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4578
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4579
// Operands for expressing Control Flow
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4580
// NOTE: Label is a predefined operand which should not be redefined in
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4581
//       the AD file. It is generically handled within the ADLC.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4582
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4583
//----------Conditional Branch Operands----------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4584
// Comparison Op  - This is the operation of the comparison, and is limited to
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4585
//                  the following set of codes:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4586
//                  L (<), LE (<=), G (>), GE (>=), E (==), NE (!=)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4587
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4588
// Other attributes of the comparison, such as unsignedness, are specified
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4589
// by the comparison instruction that sets a condition code flags register.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4590
// That result is represented by a flags operand whose subtype is appropriate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4591
// to the unsignedness (etc.) of the comparison.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4592
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4593
// Later, the instruction which matches both the Comparison Op (a Bool) and
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4594
// the flags (produced by the Cmp) specifies the coding of the comparison op
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4595
// by matching a specific subtype of Bool operand below, such as cmpOpU.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4596
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4597
// used for signed integral comparisons and fp comparisons
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4598
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4599
operand cmpOp()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4600
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4601
  match(Bool);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4602
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4603
  format %{ "" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4604
  interface(COND_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4605
    equal(0x0, "eq");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4606
    not_equal(0x1, "ne");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4607
    less(0xb, "lt");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4608
    greater_equal(0xa, "ge");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4609
    less_equal(0xd, "le");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4610
    greater(0xc, "gt");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4611
    overflow(0x6, "vs");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4612
    no_overflow(0x7, "vc");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4613
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4614
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4615
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4616
// used for unsigned integral comparisons
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4617
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4618
operand cmpOpU()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4619
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4620
  match(Bool);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4621
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4622
  format %{ "" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4623
  interface(COND_INTER) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4624
    equal(0x0, "eq");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4625
    not_equal(0x1, "ne");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4626
    less(0x3, "lo");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4627
    greater_equal(0x2, "hs");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4628
    less_equal(0x9, "ls");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4629
    greater(0x8, "hi");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4630
    overflow(0x6, "vs");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4631
    no_overflow(0x7, "vc");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4632
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4633
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4634
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4635
// Special operand allowing long args to int ops to be truncated for free
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4636
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4637
operand iRegL2I(iRegL reg) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4638
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4639
  op_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4640
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4641
  match(ConvL2I reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4642
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4643
  format %{ "l2i($reg)" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4644
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4645
  interface(REG_INTER)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4646
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4647
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4648
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4649
//----------OPERAND CLASSES----------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4650
// Operand Classes are groups of operands that are used as to simplify
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4651
// instruction definitions by not requiring the AD writer to specify
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4652
// separate instructions for every form of operand when the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4653
// instruction accepts multiple operand types with the same basic
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4654
// encoding and format. The classic case of this is memory operands.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4655
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4656
// memory is used to define read/write location for load/store
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4657
// instruction defs. we can turn a memory op into an Address
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4658
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4659
opclass memory(indirect, indIndexScaledOffsetI,  indIndexScaledOffsetL, indIndexScaledOffsetI2L, indIndexScaled, indIndexScaledI2L, indIndex, indOffI, indOffL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4660
               indirectN, indIndexScaledOffsetIN,  indIndexScaledOffsetLN, indIndexScaledOffsetI2LN, indIndexScaledN, indIndexScaledI2LN, indIndexN, indOffIN, indOffLN);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4661
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4662
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4663
// iRegIorL2I is used for src inputs in rules for 32 bit int (I)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4664
// operations. it allows the src to be either an iRegI or a (ConvL2I
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4665
// iRegL). in the latter case the l2i normally planted for a ConvL2I
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4666
// can be elided because the 32-bit instruction will just employ the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4667
// lower 32 bits anyway.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4668
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4669
// n.b. this does not elide all L2I conversions. if the truncated
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4670
// value is consumed by more than one operation then the ConvL2I
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4671
// cannot be bundled into the consuming nodes so an l2i gets planted
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4672
// (actually a movw $dst $src) and the downstream instructions consume
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4673
// the result of the l2i as an iRegI input. That's a shame since the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4674
// movw is actually redundant but its not too costly.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4675
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4676
opclass iRegIorL2I(iRegI, iRegL2I);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4677
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4678
//----------PIPELINE-----------------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4679
// Rules which define the behavior of the target architectures pipeline.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4680
// Integer ALU reg operation
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4681
pipeline %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4682
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4683
attributes %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4684
  // ARM instructions are of fixed length
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4685
  fixed_size_instructions;        // Fixed size instructions TODO does
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4686
  max_instructions_per_bundle = 2;   // A53 = 2, A57 = 4
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4687
  // ARM instructions come in 32-bit word units
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4688
  instruction_unit_size = 4;         // An instruction is 4 bytes long
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4689
  instruction_fetch_unit_size = 64;  // The processor fetches one line
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4690
  instruction_fetch_units = 1;       // of 64 bytes
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4691
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4692
  // List of nop instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4693
  nops( MachNop );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4694
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4695
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4696
// We don't use an actual pipeline model so don't care about resources
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4697
// or description. we do use pipeline classes to introduce fixed
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4698
// latencies
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4699
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4700
//----------RESOURCES----------------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4701
// Resources are the functional units available to the machine
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4702
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4703
resources( INS0, INS1, INS01 = INS0 | INS1,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4704
           ALU0, ALU1, ALU = ALU0 | ALU1,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4705
           MAC,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4706
           DIV,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4707
           BRANCH,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4708
           LDST,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4709
           NEON_FP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4710
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4711
//----------PIPELINE DESCRIPTION-----------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4712
// Pipeline Description specifies the stages in the machine's pipeline
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4713
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4714
pipe_desc(ISS, EX1, EX2, WR);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4715
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4716
//----------PIPELINE CLASSES---------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4717
// Pipeline Classes describe the stages in which input and output are
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4718
// referenced by the hardware pipeline.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4719
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4720
//------- Integer ALU operations --------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4721
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4722
// Integer ALU reg-reg operation
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4723
// Operands needed in EX1, result generated in EX2
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4724
// Eg.  ADD     x0, x1, x2
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4725
pipe_class ialu_reg_reg(iRegI dst, iRegI src1, iRegI src2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4726
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4727
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4728
  dst    : EX2(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4729
  src1   : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4730
  src2   : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4731
  INS01  : ISS; // Dual issue as instruction 0 or 1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4732
  ALU    : EX2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4733
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4734
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4735
// Integer ALU reg-reg operation with constant shift
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4736
// Shifted register must be available in LATE_ISS instead of EX1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4737
// Eg.  ADD     x0, x1, x2, LSL #2
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4738
pipe_class ialu_reg_reg_shift(iRegI dst, iRegI src1, iRegI src2, immI shift)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4739
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4740
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4741
  dst    : EX2(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4742
  src1   : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4743
  src2   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4744
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4745
  ALU    : EX2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4746
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4747
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4748
// Integer ALU reg operation with constant shift
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4749
// Eg.  LSL     x0, x1, #shift
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4750
pipe_class ialu_reg_shift(iRegI dst, iRegI src1)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4751
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4752
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4753
  dst    : EX2(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4754
  src1   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4755
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4756
  ALU    : EX2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4757
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4758
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4759
// Integer ALU reg-reg operation with variable shift
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4760
// Both operands must be available in LATE_ISS instead of EX1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4761
// Result is available in EX1 instead of EX2
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4762
// Eg.  LSLV    x0, x1, x2
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4763
pipe_class ialu_reg_reg_vshift(iRegI dst, iRegI src1, iRegI src2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4764
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4765
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4766
  dst    : EX1(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4767
  src1   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4768
  src2   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4769
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4770
  ALU    : EX1;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4771
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4772
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4773
// Integer ALU reg-reg operation with extract
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4774
// As for _vshift above, but result generated in EX2
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4775
// Eg.  EXTR    x0, x1, x2, #N
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4776
pipe_class ialu_reg_reg_extr(iRegI dst, iRegI src1, iRegI src2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4777
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4778
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4779
  dst    : EX2(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4780
  src1   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4781
  src2   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4782
  INS1   : ISS; // Can only dual issue as Instruction 1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4783
  ALU    : EX1;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4784
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4785
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4786
// Integer ALU reg operation
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4787
// Eg.  NEG     x0, x1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4788
pipe_class ialu_reg(iRegI dst, iRegI src)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4789
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4790
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4791
  dst    : EX2(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4792
  src    : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4793
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4794
  ALU    : EX2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4795
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4796
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4797
// Integer ALU reg mmediate operation
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4798
// Eg.  ADD     x0, x1, #N
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4799
pipe_class ialu_reg_imm(iRegI dst, iRegI src1)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4800
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4801
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4802
  dst    : EX2(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4803
  src1   : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4804
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4805
  ALU    : EX2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4806
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4807
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4808
// Integer ALU immediate operation (no source operands)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4809
// Eg.  MOV     x0, #N
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4810
pipe_class ialu_imm(iRegI dst)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4811
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4812
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4813
  dst    : EX1(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4814
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4815
  ALU    : EX1;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4816
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4817
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4818
//------- Compare operation -------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4819
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4820
// Compare reg-reg
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4821
// Eg.  CMP     x0, x1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4822
pipe_class icmp_reg_reg(rFlagsReg cr, iRegI op1, iRegI op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4823
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4824
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4825
//  fixed_latency(16);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4826
  cr     : EX2(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4827
  op1    : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4828
  op2    : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4829
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4830
  ALU    : EX2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4831
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4832
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4833
// Compare reg-reg
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4834
// Eg.  CMP     x0, #N
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4835
pipe_class icmp_reg_imm(rFlagsReg cr, iRegI op1)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4836
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4837
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4838
//  fixed_latency(16);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4839
  cr     : EX2(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4840
  op1    : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4841
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4842
  ALU    : EX2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4843
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4844
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4845
//------- Conditional instructions ------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4846
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4847
// Conditional no operands
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4848
// Eg.  CSINC   x0, zr, zr, <cond>
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4849
pipe_class icond_none(iRegI dst, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4850
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4851
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4852
  cr     : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4853
  dst    : EX2(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4854
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4855
  ALU    : EX2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4856
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4857
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4858
// Conditional 2 operand
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4859
// EG.  CSEL    X0, X1, X2, <cond>
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4860
pipe_class icond_reg_reg(iRegI dst, iRegI src1, iRegI src2, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4861
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4862
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4863
  cr     : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4864
  src1   : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4865
  src2   : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4866
  dst    : EX2(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4867
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4868
  ALU    : EX2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4869
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4870
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4871
// Conditional 2 operand
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4872
// EG.  CSEL    X0, X1, X2, <cond>
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4873
pipe_class icond_reg(iRegI dst, iRegI src, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4874
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4875
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4876
  cr     : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4877
  src    : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4878
  dst    : EX2(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4879
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4880
  ALU    : EX2;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4881
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4882
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4883
//------- Multiply pipeline operations --------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4884
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4885
// Multiply reg-reg
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4886
// Eg.  MUL     w0, w1, w2
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4887
pipe_class imul_reg_reg(iRegI dst, iRegI src1, iRegI src2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4888
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4889
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4890
  dst    : WR(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4891
  src1   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4892
  src2   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4893
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4894
  MAC    : WR;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4895
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4896
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4897
// Multiply accumulate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4898
// Eg.  MADD    w0, w1, w2, w3
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4899
pipe_class imac_reg_reg(iRegI dst, iRegI src1, iRegI src2, iRegI src3)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4900
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4901
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4902
  dst    : WR(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4903
  src1   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4904
  src2   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4905
  src3   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4906
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4907
  MAC    : WR;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4908
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4909
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4910
// Eg.  MUL     w0, w1, w2
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4911
pipe_class lmul_reg_reg(iRegI dst, iRegI src1, iRegI src2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4912
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4913
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4914
  fixed_latency(3); // Maximum latency for 64 bit mul
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4915
  dst    : WR(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4916
  src1   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4917
  src2   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4918
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4919
  MAC    : WR;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4920
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4921
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4922
// Multiply accumulate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4923
// Eg.  MADD    w0, w1, w2, w3
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4924
pipe_class lmac_reg_reg(iRegI dst, iRegI src1, iRegI src2, iRegI src3)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4925
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4926
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4927
  fixed_latency(3); // Maximum latency for 64 bit mul
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4928
  dst    : WR(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4929
  src1   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4930
  src2   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4931
  src3   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4932
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4933
  MAC    : WR;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4934
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4935
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4936
//------- Divide pipeline operations --------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4937
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4938
// Eg.  SDIV    w0, w1, w2
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4939
pipe_class idiv_reg_reg(iRegI dst, iRegI src1, iRegI src2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4940
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4941
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4942
  fixed_latency(8); // Maximum latency for 32 bit divide
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4943
  dst    : WR(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4944
  src1   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4945
  src2   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4946
  INS0   : ISS; // Can only dual issue as instruction 0
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4947
  DIV    : WR;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4948
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4949
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4950
// Eg.  SDIV    x0, x1, x2
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4951
pipe_class ldiv_reg_reg(iRegI dst, iRegI src1, iRegI src2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4952
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4953
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4954
  fixed_latency(16); // Maximum latency for 64 bit divide
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4955
  dst    : WR(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4956
  src1   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4957
  src2   : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4958
  INS0   : ISS; // Can only dual issue as instruction 0
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4959
  DIV    : WR;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4960
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4961
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4962
//------- Load pipeline operations ------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4963
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4964
// Load - prefetch
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4965
// Eg.  PFRM    <mem>
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4966
pipe_class iload_prefetch(memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4967
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4968
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4969
  mem    : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4970
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4971
  LDST   : WR;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4972
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4973
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4974
// Load - reg, mem
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4975
// Eg.  LDR     x0, <mem>
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4976
pipe_class iload_reg_mem(iRegI dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4977
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4978
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4979
  dst    : WR(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4980
  mem    : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4981
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4982
  LDST   : WR;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4983
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4984
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4985
// Load - reg, reg
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4986
// Eg.  LDR     x0, [sp, x1]
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4987
pipe_class iload_reg_reg(iRegI dst, iRegI src)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4988
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4989
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4990
  dst    : WR(write);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4991
  src    : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4992
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4993
  LDST   : WR;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4994
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4995
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4996
//------- Store pipeline operations -----------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4997
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4998
// Store - zr, mem
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  4999
// Eg.  STR     zr, <mem>
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5000
pipe_class istore_mem(memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5001
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5002
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5003
  mem    : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5004
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5005
  LDST   : WR;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5006
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5007
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5008
// Store - reg, mem
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5009
// Eg.  STR     x0, <mem>
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5010
pipe_class istore_reg_mem(iRegI src, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5011
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5012
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5013
  mem    : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5014
  src    : EX2(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5015
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5016
  LDST   : WR;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5017
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5018
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5019
// Store - reg, reg
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5020
// Eg. STR      x0, [sp, x1]
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5021
pipe_class istore_reg_reg(iRegI dst, iRegI src)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5022
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5023
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5024
  dst    : ISS(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5025
  src    : EX2(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5026
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5027
  LDST   : WR;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5028
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5029
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5030
//------- Store pipeline operations -----------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5031
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5032
// Branch
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5033
pipe_class pipe_branch()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5034
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5035
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5036
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5037
  BRANCH : EX1;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5038
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5039
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5040
// Conditional branch
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5041
pipe_class pipe_branch_cond(rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5042
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5043
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5044
  cr     : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5045
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5046
  BRANCH : EX1;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5047
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5048
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5049
// Compare & Branch
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5050
// EG.  CBZ/CBNZ
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5051
pipe_class pipe_cmp_branch(iRegI op1)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5052
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5053
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5054
  op1    : EX1(read);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5055
  INS01  : ISS;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5056
  BRANCH : EX1;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5057
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5058
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5059
//------- Synchronisation operations ----------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5060
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5061
// Any operation requiring serialization.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5062
// EG.  DMB/Atomic Ops/Load Acquire/Str Release
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5063
pipe_class pipe_serial()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5064
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5065
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5066
  force_serialization;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5067
  fixed_latency(16);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5068
  INS01  : ISS(2); // Cannot dual issue with any other instruction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5069
  LDST   : WR;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5070
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5071
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5072
// Generic big/slow expanded idiom - also serialized
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5073
pipe_class pipe_slow()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5074
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5075
  instruction_count(10);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5076
  multiple_bundles;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5077
  force_serialization;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5078
  fixed_latency(16);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5079
  INS01  : ISS(2); // Cannot dual issue with any other instruction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5080
  LDST   : WR;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5081
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5082
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5083
// Empty pipeline class
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5084
pipe_class pipe_class_empty()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5085
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5086
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5087
  fixed_latency(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5088
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5089
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5090
// Default pipeline class.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5091
pipe_class pipe_class_default()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5092
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5093
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5094
  fixed_latency(2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5095
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5096
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5097
// Pipeline class for compares.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5098
pipe_class pipe_class_compare()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5099
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5100
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5101
  fixed_latency(16);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5102
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5103
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5104
// Pipeline class for memory operations.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5105
pipe_class pipe_class_memory()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5106
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5107
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5108
  fixed_latency(16);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5109
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5110
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5111
// Pipeline class for call.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5112
pipe_class pipe_class_call()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5113
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5114
  single_instruction;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5115
  fixed_latency(100);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5116
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5117
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5118
// Define the class for the Nop node.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5119
define %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5120
   MachNop = pipe_class_empty;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5121
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5122
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5123
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5124
//----------INSTRUCTIONS-------------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5125
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5126
// match      -- States which machine-independent subtree may be replaced
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5127
//               by this instruction.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5128
// ins_cost   -- The estimated cost of this instruction is used by instruction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5129
//               selection to identify a minimum cost tree of machine
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5130
//               instructions that matches a tree of machine-independent
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5131
//               instructions.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5132
// format     -- A string providing the disassembly for this instruction.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5133
//               The value of an instruction's operand may be inserted
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5134
//               by referring to it with a '$' prefix.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5135
// opcode     -- Three instruction opcodes may be provided.  These are referred
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5136
//               to within an encode class as $primary, $secondary, and $tertiary
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5137
//               rrspectively.  The primary opcode is commonly used to
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5138
//               indicate the type of machine instruction, while secondary
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5139
//               and tertiary are often used for prefix options or addressing
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5140
//               modes.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5141
// ins_encode -- A list of encode classes with parameters. The encode class
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5142
//               name must have been defined in an 'enc_class' specification
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5143
//               in the encode section of the architecture description.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5144
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5145
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5146
// Memory (Load/Store) Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5147
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5148
// Load Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5149
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5150
// Load Byte (8 bit signed)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5151
instruct loadB(iRegINoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5152
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5153
  match(Set dst (LoadB mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5154
  predicate(UseBarriersForVolatile || n->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5155
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5156
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5157
  format %{ "ldrsbw  $dst, $mem\t# byte" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5158
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5159
  ins_encode(aarch64_enc_ldrsbw(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5160
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5161
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5162
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5163
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5164
// Load Byte (8 bit signed) into long
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5165
instruct loadB2L(iRegLNoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5166
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5167
  match(Set dst (ConvI2L (LoadB mem)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5168
  predicate(UseBarriersForVolatile || n->in(1)->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5169
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5170
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5171
  format %{ "ldrsb  $dst, $mem\t# byte" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5172
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5173
  ins_encode(aarch64_enc_ldrsb(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5174
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5175
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5176
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5177
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5178
// Load Byte (8 bit unsigned)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5179
instruct loadUB(iRegINoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5180
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5181
  match(Set dst (LoadUB mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5182
  predicate(UseBarriersForVolatile || n->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5183
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5184
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5185
  format %{ "ldrbw  $dst, $mem\t# byte" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5186
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5187
  ins_encode(aarch64_enc_ldrb(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5188
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5189
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5190
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5191
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5192
// Load Byte (8 bit unsigned) into long
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5193
instruct loadUB2L(iRegLNoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5194
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5195
  match(Set dst (ConvI2L (LoadUB mem)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5196
  predicate(UseBarriersForVolatile || n->in(1)->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5197
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5198
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5199
  format %{ "ldrb  $dst, $mem\t# byte" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5200
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5201
  ins_encode(aarch64_enc_ldrb(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5202
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5203
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5204
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5205
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5206
// Load Short (16 bit signed)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5207
instruct loadS(iRegINoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5208
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5209
  match(Set dst (LoadS mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5210
  predicate(UseBarriersForVolatile || n->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5211
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5212
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5213
  format %{ "ldrshw  $dst, $mem\t# short" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5214
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5215
  ins_encode(aarch64_enc_ldrshw(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5216
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5217
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5218
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5219
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5220
// Load Short (16 bit signed) into long
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5221
instruct loadS2L(iRegLNoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5222
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5223
  match(Set dst (ConvI2L (LoadS mem)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5224
  predicate(UseBarriersForVolatile || n->in(1)->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5225
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5226
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5227
  format %{ "ldrsh  $dst, $mem\t# short" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5228
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5229
  ins_encode(aarch64_enc_ldrsh(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5230
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5231
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5232
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5233
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5234
// Load Char (16 bit unsigned)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5235
instruct loadUS(iRegINoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5236
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5237
  match(Set dst (LoadUS mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5238
  predicate(UseBarriersForVolatile || n->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5239
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5240
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5241
  format %{ "ldrh  $dst, $mem\t# short" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5242
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5243
  ins_encode(aarch64_enc_ldrh(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5244
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5245
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5246
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5247
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5248
// Load Short/Char (16 bit unsigned) into long
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5249
instruct loadUS2L(iRegLNoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5250
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5251
  match(Set dst (ConvI2L (LoadUS mem)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5252
  predicate(UseBarriersForVolatile || n->in(1)->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5253
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5254
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5255
  format %{ "ldrh  $dst, $mem\t# short" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5256
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5257
  ins_encode(aarch64_enc_ldrh(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5258
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5259
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5260
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5261
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5262
// Load Integer (32 bit signed)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5263
instruct loadI(iRegINoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5264
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5265
  match(Set dst (LoadI mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5266
  predicate(UseBarriersForVolatile || n->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5267
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5268
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5269
  format %{ "ldrw  $dst, $mem\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5270
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5271
  ins_encode(aarch64_enc_ldrw(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5272
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5273
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5274
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5275
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5276
// Load Integer (32 bit signed) into long
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5277
instruct loadI2L(iRegLNoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5278
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5279
  match(Set dst (ConvI2L (LoadI mem)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5280
  predicate(UseBarriersForVolatile || n->in(1)->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5281
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5282
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5283
  format %{ "ldrsw  $dst, $mem\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5284
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5285
  ins_encode(aarch64_enc_ldrsw(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5286
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5287
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5288
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5289
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5290
// Load Integer (32 bit unsigned) into long
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5291
instruct loadUI2L(iRegLNoSp dst, memory mem, immL_32bits mask)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5292
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5293
  match(Set dst (AndL (ConvI2L (LoadI mem)) mask));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5294
  predicate(UseBarriersForVolatile || n->in(1)->in(1)->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5295
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5296
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5297
  format %{ "ldrw  $dst, $mem\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5298
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5299
  ins_encode(aarch64_enc_ldrw(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5300
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5301
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5302
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5303
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5304
// Load Long (64 bit signed)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5305
instruct loadL(iRegLNoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5306
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5307
  match(Set dst (LoadL mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5308
  predicate(UseBarriersForVolatile || n->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5309
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5310
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5311
  format %{ "ldr  $dst, $mem\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5312
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5313
  ins_encode(aarch64_enc_ldr(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5314
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5315
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5316
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5317
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5318
// Load Range
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5319
instruct loadRange(iRegINoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5320
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5321
  match(Set dst (LoadRange mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5322
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5323
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5324
  format %{ "ldrw  $dst, $mem\t# range" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5325
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5326
  ins_encode(aarch64_enc_ldrw(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5327
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5328
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5329
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5330
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5331
// Load Pointer
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5332
instruct loadP(iRegPNoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5333
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5334
  match(Set dst (LoadP mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5335
  predicate(UseBarriersForVolatile || n->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5336
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5337
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5338
  format %{ "ldr  $dst, $mem\t# ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5339
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5340
  ins_encode(aarch64_enc_ldr(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5341
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5342
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5343
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5344
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5345
// Load Compressed Pointer
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5346
instruct loadN(iRegNNoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5347
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5348
  match(Set dst (LoadN mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5349
  predicate(UseBarriersForVolatile || n->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5350
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5351
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5352
  format %{ "ldrw  $dst, $mem\t# compressed ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5353
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5354
  ins_encode(aarch64_enc_ldrw(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5355
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5356
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5357
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5358
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5359
// Load Klass Pointer
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5360
instruct loadKlass(iRegPNoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5361
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5362
  match(Set dst (LoadKlass mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5363
  predicate(UseBarriersForVolatile || n->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5364
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5365
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5366
  format %{ "ldr  $dst, $mem\t# class" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5367
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5368
  ins_encode(aarch64_enc_ldr(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5369
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5370
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5371
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5372
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5373
// Load Narrow Klass Pointer
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5374
instruct loadNKlass(iRegNNoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5375
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5376
  match(Set dst (LoadNKlass mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5377
  predicate(UseBarriersForVolatile || n->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5378
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5379
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5380
  format %{ "ldrw  $dst, $mem\t# compressed class ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5381
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5382
  ins_encode(aarch64_enc_ldrw(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5383
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5384
  ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5385
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5386
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5387
// Load Float
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5388
instruct loadF(vRegF dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5389
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5390
  match(Set dst (LoadF mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5391
  predicate(UseBarriersForVolatile || n->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5392
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5393
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5394
  format %{ "ldrs  $dst, $mem\t# float" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5395
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5396
  ins_encode( aarch64_enc_ldrs(dst, mem) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5397
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5398
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5399
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5400
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5401
// Load Double
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5402
instruct loadD(vRegD dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5403
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5404
  match(Set dst (LoadD mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5405
  predicate(UseBarriersForVolatile || n->as_Load()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5406
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5407
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5408
  format %{ "ldrd  $dst, $mem\t# double" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5409
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5410
  ins_encode( aarch64_enc_ldrd(dst, mem) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5411
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5412
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5413
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5414
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5415
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5416
// Load Int Constant
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5417
instruct loadConI(iRegINoSp dst, immI src)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5418
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5419
  match(Set dst src);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5420
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5421
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5422
  format %{ "mov $dst, $src\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5423
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5424
  ins_encode( aarch64_enc_movw_imm(dst, src) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5425
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5426
  ins_pipe(ialu_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5427
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5428
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5429
// Load Long Constant
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5430
instruct loadConL(iRegLNoSp dst, immL src)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5431
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5432
  match(Set dst src);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5433
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5434
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5435
  format %{ "mov $dst, $src\t# long" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5436
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5437
  ins_encode( aarch64_enc_mov_imm(dst, src) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5438
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5439
  ins_pipe(ialu_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5440
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5441
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5442
// Load Pointer Constant
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5443
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5444
instruct loadConP(iRegPNoSp dst, immP con)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5445
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5446
  match(Set dst con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5447
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5448
  ins_cost(INSN_COST * 4);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5449
  format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5450
    "mov  $dst, $con\t# ptr\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5451
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5452
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5453
  ins_encode(aarch64_enc_mov_p(dst, con));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5454
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5455
  ins_pipe(ialu_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5456
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5457
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5458
// Load Null Pointer Constant
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5459
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5460
instruct loadConP0(iRegPNoSp dst, immP0 con)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5461
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5462
  match(Set dst con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5463
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5464
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5465
  format %{ "mov  $dst, $con\t# NULL ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5466
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5467
  ins_encode(aarch64_enc_mov_p0(dst, con));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5468
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5469
  ins_pipe(ialu_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5470
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5471
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5472
// Load Pointer Constant One
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5473
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5474
instruct loadConP1(iRegPNoSp dst, immP_1 con)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5475
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5476
  match(Set dst con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5477
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5478
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5479
  format %{ "mov  $dst, $con\t# NULL ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5480
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5481
  ins_encode(aarch64_enc_mov_p1(dst, con));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5482
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5483
  ins_pipe(ialu_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5484
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5485
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5486
// Load Poll Page Constant
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5487
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5488
instruct loadConPollPage(iRegPNoSp dst, immPollPage con)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5489
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5490
  match(Set dst con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5491
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5492
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5493
  format %{ "adr  $dst, $con\t# Poll Page Ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5494
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5495
  ins_encode(aarch64_enc_mov_poll_page(dst, con));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5496
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5497
  ins_pipe(ialu_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5498
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5499
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5500
// Load Byte Map Base Constant
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5501
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5502
instruct loadByteMapBase(iRegPNoSp dst, immByteMapBase con)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5503
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5504
  match(Set dst con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5505
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5506
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5507
  format %{ "adr  $dst, $con\t# Byte Map Base" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5508
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5509
  ins_encode(aarch64_enc_mov_byte_map_base(dst, con));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5510
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5511
  ins_pipe(ialu_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5512
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5513
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5514
// Load Narrow Pointer Constant
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5515
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5516
instruct loadConN(iRegNNoSp dst, immN con)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5517
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5518
  match(Set dst con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5519
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5520
  ins_cost(INSN_COST * 4);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5521
  format %{ "mov  $dst, $con\t# compressed ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5522
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5523
  ins_encode(aarch64_enc_mov_n(dst, con));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5524
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5525
  ins_pipe(ialu_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5526
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5527
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5528
// Load Narrow Null Pointer Constant
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5529
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5530
instruct loadConN0(iRegNNoSp dst, immN0 con)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5531
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5532
  match(Set dst con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5533
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5534
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5535
  format %{ "mov  $dst, $con\t# compressed NULL ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5536
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5537
  ins_encode(aarch64_enc_mov_n0(dst, con));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5538
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5539
  ins_pipe(ialu_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5540
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5541
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5542
// Load Narrow Klass Constant
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5543
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5544
instruct loadConNKlass(iRegNNoSp dst, immNKlass con)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5545
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5546
  match(Set dst con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5547
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5548
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5549
  format %{ "mov  $dst, $con\t# compressed klass ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5550
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5551
  ins_encode(aarch64_enc_mov_nk(dst, con));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5552
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5553
  ins_pipe(ialu_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5554
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5555
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5556
// Load Packed Float Constant
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5557
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5558
instruct loadConF_packed(vRegF dst, immFPacked con) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5559
  match(Set dst con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5560
  ins_cost(INSN_COST * 4);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5561
  format %{ "fmovs  $dst, $con"%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5562
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5563
    __ fmovs(as_FloatRegister($dst$$reg), (double)$con$$constant);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5564
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5565
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5566
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5567
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5568
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5569
// Load Float Constant
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5570
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5571
instruct loadConF(vRegF dst, immF con) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5572
  match(Set dst con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5573
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5574
  ins_cost(INSN_COST * 4);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5575
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5576
  format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5577
    "ldrs $dst, [$constantaddress]\t# load from constant table: float=$con\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5578
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5579
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5580
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5581
    __ ldrs(as_FloatRegister($dst$$reg), $constantaddress($con));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5582
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5583
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5584
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5585
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5586
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5587
// Load Packed Double Constant
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5588
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5589
instruct loadConD_packed(vRegD dst, immDPacked con) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5590
  match(Set dst con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5591
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5592
  format %{ "fmovd  $dst, $con"%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5593
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5594
    __ fmovd(as_FloatRegister($dst$$reg), $con$$constant);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5595
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5596
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5597
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5598
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5599
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5600
// Load Double Constant
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5601
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5602
instruct loadConD(vRegD dst, immD con) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5603
  match(Set dst con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5604
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5605
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5606
  format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5607
    "ldrd $dst, [$constantaddress]\t# load from constant table: float=$con\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5608
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5609
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5610
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5611
    __ ldrd(as_FloatRegister($dst$$reg), $constantaddress($con));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5612
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5613
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5614
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5615
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5616
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5617
// Store Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5618
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5619
// Store CMS card-mark Immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5620
instruct storeimmCM0(immI0 zero, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5621
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5622
  match(Set mem (StoreCM mem zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5623
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5624
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5625
  format %{ "strb zr, $mem\t# byte" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5626
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5627
  ins_encode(aarch64_enc_strb0(mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5628
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5629
  ins_pipe(istore_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5630
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5631
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5632
// Store Byte
29214
cb399be02b39 8074349: AARCH64: C2 generates poor code for some byte and character stores
aph
parents: 29195
diff changeset
  5633
instruct storeB(iRegIorL2I src, memory mem)
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5634
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5635
  match(Set mem (StoreB mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5636
  predicate(UseBarriersForVolatile || n->as_Store()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5637
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5638
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5639
  format %{ "strb  $src, $mem\t# byte" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5640
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5641
  ins_encode(aarch64_enc_strb(src, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5642
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5643
  ins_pipe(istore_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5644
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5645
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5646
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5647
instruct storeimmB0(immI0 zero, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5648
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5649
  match(Set mem (StoreB mem zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5650
  predicate(UseBarriersForVolatile || n->as_Store()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5651
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5652
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5653
  format %{ "strb zr, $mem\t# byte" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5654
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5655
  ins_encode(aarch64_enc_strb0(mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5656
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5657
  ins_pipe(istore_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5658
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5659
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5660
// Store Char/Short
29214
cb399be02b39 8074349: AARCH64: C2 generates poor code for some byte and character stores
aph
parents: 29195
diff changeset
  5661
instruct storeC(iRegIorL2I src, memory mem)
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5662
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5663
  match(Set mem (StoreC mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5664
  predicate(UseBarriersForVolatile || n->as_Store()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5665
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5666
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5667
  format %{ "strh  $src, $mem\t# short" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5668
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5669
  ins_encode(aarch64_enc_strh(src, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5670
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5671
  ins_pipe(istore_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5672
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5673
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5674
instruct storeimmC0(immI0 zero, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5675
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5676
  match(Set mem (StoreC mem zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5677
  predicate(UseBarriersForVolatile || n->as_Store()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5678
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5679
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5680
  format %{ "strh  zr, $mem\t# short" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5681
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5682
  ins_encode(aarch64_enc_strh0(mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5683
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5684
  ins_pipe(istore_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5685
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5686
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5687
// Store Integer
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5688
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5689
instruct storeI(iRegIorL2I src, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5690
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5691
  match(Set mem(StoreI mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5692
  predicate(UseBarriersForVolatile || n->as_Store()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5693
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5694
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5695
  format %{ "strw  $src, $mem\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5696
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5697
  ins_encode(aarch64_enc_strw(src, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5698
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5699
  ins_pipe(istore_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5700
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5701
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5702
instruct storeimmI0(immI0 zero, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5703
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5704
  match(Set mem(StoreI mem zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5705
  predicate(UseBarriersForVolatile || n->as_Store()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5706
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5707
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5708
  format %{ "strw  zr, $mem\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5709
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5710
  ins_encode(aarch64_enc_strw0(mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5711
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5712
  ins_pipe(istore_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5713
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5714
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5715
// Store Long (64 bit signed)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5716
instruct storeL(iRegL src, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5717
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5718
  match(Set mem (StoreL mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5719
  predicate(UseBarriersForVolatile || n->as_Store()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5720
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5721
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5722
  format %{ "str  $src, $mem\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5723
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5724
  ins_encode(aarch64_enc_str(src, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5725
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5726
  ins_pipe(istore_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5727
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5728
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5729
// Store Long (64 bit signed)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5730
instruct storeimmL0(immL0 zero, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5731
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5732
  match(Set mem (StoreL mem zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5733
  predicate(UseBarriersForVolatile || n->as_Store()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5734
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5735
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5736
  format %{ "str  zr, $mem\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5737
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5738
  ins_encode(aarch64_enc_str0(mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5739
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5740
  ins_pipe(istore_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5741
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5742
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5743
// Store Pointer
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5744
instruct storeP(iRegP src, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5745
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5746
  match(Set mem (StoreP mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5747
  predicate(UseBarriersForVolatile || n->as_Store()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5748
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5749
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5750
  format %{ "str  $src, $mem\t# ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5751
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5752
  ins_encode(aarch64_enc_str(src, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5753
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5754
  ins_pipe(istore_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5755
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5756
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5757
// Store Pointer
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5758
instruct storeimmP0(immP0 zero, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5759
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5760
  match(Set mem (StoreP mem zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5761
  predicate(UseBarriersForVolatile || n->as_Store()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5762
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5763
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5764
  format %{ "str zr, $mem\t# ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5765
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5766
  ins_encode(aarch64_enc_str0(mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5767
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5768
  ins_pipe(istore_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5769
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5770
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5771
// Store Compressed Pointer
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5772
instruct storeN(iRegN src, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5773
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5774
  match(Set mem (StoreN mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5775
  predicate(UseBarriersForVolatile || n->as_Store()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5776
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5777
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5778
  format %{ "strw  $src, $mem\t# compressed ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5779
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5780
  ins_encode(aarch64_enc_strw(src, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5781
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5782
  ins_pipe(istore_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5783
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5784
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5785
instruct storeImmN0(iRegIHeapbase heapbase, immN0 zero, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5786
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5787
  match(Set mem (StoreN mem zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5788
  predicate(Universe::narrow_oop_base() == NULL &&
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5789
            Universe::narrow_klass_base() == NULL &&
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5790
            (UseBarriersForVolatile || n->as_Store()->is_unordered()));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5791
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5792
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5793
  format %{ "strw  rheapbase, $mem\t# compressed ptr (rheapbase==0)" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5794
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5795
  ins_encode(aarch64_enc_strw(heapbase, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5796
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5797
  ins_pipe(istore_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5798
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5799
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5800
// Store Float
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5801
instruct storeF(vRegF src, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5802
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5803
  match(Set mem (StoreF mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5804
  predicate(UseBarriersForVolatile || n->as_Store()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5805
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5806
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5807
  format %{ "strs  $src, $mem\t# float" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5808
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5809
  ins_encode( aarch64_enc_strs(src, mem) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5810
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5811
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5812
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5813
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5814
// TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5815
// implement storeImmF0 and storeFImmPacked
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5816
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5817
// Store Double
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5818
instruct storeD(vRegD src, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5819
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5820
  match(Set mem (StoreD mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5821
  predicate(UseBarriersForVolatile || n->as_Store()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5822
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5823
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5824
  format %{ "strd  $src, $mem\t# double" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5825
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5826
  ins_encode( aarch64_enc_strd(src, mem) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5827
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5828
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5829
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5830
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5831
// Store Compressed Klass Pointer
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5832
instruct storeNKlass(iRegN src, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5833
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5834
  predicate(UseBarriersForVolatile || n->as_Store()->is_unordered());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5835
  match(Set mem (StoreNKlass mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5836
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5837
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5838
  format %{ "strw  $src, $mem\t# compressed klass ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5839
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5840
  ins_encode(aarch64_enc_strw(src, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5841
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5842
  ins_pipe(istore_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5843
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5844
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5845
// TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5846
// implement storeImmD0 and storeDImmPacked
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5847
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5848
// prefetch instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5849
// Must be safe to execute with invalid address (cannot fault).
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5850
29195
7d6208ea1775 8074119: [AARCH64] stage repo misses fixes from several Hotspot changes
adinn
parents: 29190
diff changeset
  5851
instruct prefetchalloc( memory mem ) %{
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5852
  match(PrefetchAllocation mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5853
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5854
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5855
  format %{ "prfm $mem, PSTL1KEEP\t# Prefetch into level 1 cache write keep" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5856
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5857
  ins_encode( aarch64_enc_prefetchw(mem) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5858
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5859
  ins_pipe(iload_prefetch);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5860
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5861
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5862
//  ---------------- volatile loads and stores ----------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5863
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5864
// Load Byte (8 bit signed)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5865
instruct loadB_volatile(iRegINoSp dst, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5866
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5867
  match(Set dst (LoadB mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5868
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5869
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5870
  format %{ "ldarsb  $dst, $mem\t# byte" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5871
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5872
  ins_encode(aarch64_enc_ldarsb(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5873
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5874
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5875
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5876
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5877
// Load Byte (8 bit signed) into long
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5878
instruct loadB2L_volatile(iRegLNoSp dst, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5879
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5880
  match(Set dst (ConvI2L (LoadB mem)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5881
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5882
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5883
  format %{ "ldarsb  $dst, $mem\t# byte" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5884
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5885
  ins_encode(aarch64_enc_ldarsb(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5886
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5887
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5888
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5889
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5890
// Load Byte (8 bit unsigned)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5891
instruct loadUB_volatile(iRegINoSp dst, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5892
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5893
  match(Set dst (LoadUB mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5894
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5895
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5896
  format %{ "ldarb  $dst, $mem\t# byte" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5897
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5898
  ins_encode(aarch64_enc_ldarb(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5899
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5900
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5901
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5902
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5903
// Load Byte (8 bit unsigned) into long
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5904
instruct loadUB2L_volatile(iRegLNoSp dst, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5905
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5906
  match(Set dst (ConvI2L (LoadUB mem)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5907
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5908
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5909
  format %{ "ldarb  $dst, $mem\t# byte" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5910
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5911
  ins_encode(aarch64_enc_ldarb(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5912
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5913
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5914
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5915
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5916
// Load Short (16 bit signed)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5917
instruct loadS_volatile(iRegINoSp dst, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5918
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5919
  match(Set dst (LoadS mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5920
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5921
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5922
  format %{ "ldarshw  $dst, $mem\t# short" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5923
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5924
  ins_encode(aarch64_enc_ldarshw(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5925
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5926
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5927
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5928
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5929
instruct loadUS_volatile(iRegINoSp dst, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5930
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5931
  match(Set dst (LoadUS mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5932
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5933
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5934
  format %{ "ldarhw  $dst, $mem\t# short" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5935
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5936
  ins_encode(aarch64_enc_ldarhw(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5937
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5938
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5939
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5940
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5941
// Load Short/Char (16 bit unsigned) into long
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5942
instruct loadUS2L_volatile(iRegLNoSp dst, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5943
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5944
  match(Set dst (ConvI2L (LoadUS mem)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5945
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5946
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5947
  format %{ "ldarh  $dst, $mem\t# short" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5948
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5949
  ins_encode(aarch64_enc_ldarh(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5950
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5951
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5952
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5953
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5954
// Load Short/Char (16 bit signed) into long
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5955
instruct loadS2L_volatile(iRegLNoSp dst, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5956
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5957
  match(Set dst (ConvI2L (LoadS mem)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5958
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5959
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5960
  format %{ "ldarh  $dst, $mem\t# short" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5961
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5962
  ins_encode(aarch64_enc_ldarsh(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5963
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5964
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5965
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5966
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5967
// Load Integer (32 bit signed)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5968
instruct loadI_volatile(iRegINoSp dst, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5969
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5970
  match(Set dst (LoadI mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5971
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5972
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5973
  format %{ "ldarw  $dst, $mem\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5974
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5975
  ins_encode(aarch64_enc_ldarw(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5976
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5977
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5978
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5979
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5980
// Load Integer (32 bit unsigned) into long
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5981
instruct loadUI2L_volatile(iRegLNoSp dst, /* sync_memory*/indirect mem, immL_32bits mask)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5982
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5983
  match(Set dst (AndL (ConvI2L (LoadI mem)) mask));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5984
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5985
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5986
  format %{ "ldarw  $dst, $mem\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5987
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5988
  ins_encode(aarch64_enc_ldarw(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5989
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5990
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5991
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5992
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5993
// Load Long (64 bit signed)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5994
instruct loadL_volatile(iRegLNoSp dst, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5995
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5996
  match(Set dst (LoadL mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5997
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5998
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  5999
  format %{ "ldar  $dst, $mem\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6000
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6001
  ins_encode(aarch64_enc_ldar(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6002
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6003
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6004
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6005
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6006
// Load Pointer
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6007
instruct loadP_volatile(iRegPNoSp dst, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6008
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6009
  match(Set dst (LoadP mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6010
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6011
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6012
  format %{ "ldar  $dst, $mem\t# ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6013
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6014
  ins_encode(aarch64_enc_ldar(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6015
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6016
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6017
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6018
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6019
// Load Compressed Pointer
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6020
instruct loadN_volatile(iRegNNoSp dst, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6021
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6022
  match(Set dst (LoadN mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6023
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6024
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6025
  format %{ "ldarw  $dst, $mem\t# compressed ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6026
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6027
  ins_encode(aarch64_enc_ldarw(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6028
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6029
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6030
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6031
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6032
// Load Float
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6033
instruct loadF_volatile(vRegF dst, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6034
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6035
  match(Set dst (LoadF mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6036
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6037
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6038
  format %{ "ldars  $dst, $mem\t# float" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6039
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6040
  ins_encode( aarch64_enc_fldars(dst, mem) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6041
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6042
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6043
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6044
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6045
// Load Double
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6046
instruct loadD_volatile(vRegD dst, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6047
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6048
  match(Set dst (LoadD mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6049
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6050
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6051
  format %{ "ldard  $dst, $mem\t# double" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6052
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6053
  ins_encode( aarch64_enc_fldard(dst, mem) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6054
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6055
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6056
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6057
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6058
// Store Byte
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6059
instruct storeB_volatile(iRegI src, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6060
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6061
  match(Set mem (StoreB mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6062
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6063
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6064
  format %{ "stlrb  $src, $mem\t# byte" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6065
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6066
  ins_encode(aarch64_enc_stlrb(src, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6067
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6068
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6069
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6070
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6071
// Store Char/Short
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6072
instruct storeC_volatile(iRegI src, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6073
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6074
  match(Set mem (StoreC mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6075
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6076
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6077
  format %{ "stlrh  $src, $mem\t# short" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6078
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6079
  ins_encode(aarch64_enc_stlrh(src, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6080
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6081
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6082
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6083
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6084
// Store Integer
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6085
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6086
instruct storeI_volatile(iRegIorL2I src, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6087
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6088
  match(Set mem(StoreI mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6089
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6090
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6091
  format %{ "stlrw  $src, $mem\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6092
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6093
  ins_encode(aarch64_enc_stlrw(src, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6094
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6095
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6096
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6097
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6098
// Store Long (64 bit signed)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6099
instruct storeL_volatile(iRegL src, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6100
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6101
  match(Set mem (StoreL mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6102
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6103
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6104
  format %{ "stlr  $src, $mem\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6105
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6106
  ins_encode(aarch64_enc_stlr(src, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6107
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6108
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6109
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6110
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6111
// Store Pointer
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6112
instruct storeP_volatile(iRegP src, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6113
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6114
  match(Set mem (StoreP mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6115
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6116
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6117
  format %{ "stlr  $src, $mem\t# ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6118
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6119
  ins_encode(aarch64_enc_stlr(src, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6120
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6121
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6122
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6123
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6124
// Store Compressed Pointer
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6125
instruct storeN_volatile(iRegN src, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6126
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6127
  match(Set mem (StoreN mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6128
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6129
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6130
  format %{ "stlrw  $src, $mem\t# compressed ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6131
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6132
  ins_encode(aarch64_enc_stlrw(src, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6133
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6134
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6135
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6136
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6137
// Store Float
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6138
instruct storeF_volatile(vRegF src, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6139
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6140
  match(Set mem (StoreF mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6141
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6142
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6143
  format %{ "stlrs  $src, $mem\t# float" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6144
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6145
  ins_encode( aarch64_enc_fstlrs(src, mem) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6146
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6147
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6148
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6149
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6150
// TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6151
// implement storeImmF0 and storeFImmPacked
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6152
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6153
// Store Double
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6154
instruct storeD_volatile(vRegD src, /* sync_memory*/indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6155
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6156
  match(Set mem (StoreD mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6157
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6158
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6159
  format %{ "stlrd  $src, $mem\t# double" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6160
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6161
  ins_encode( aarch64_enc_fstlrd(src, mem) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6162
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6163
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6164
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6165
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6166
//  ---------------- end of volatile loads and stores ----------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6167
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6168
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6169
// BSWAP Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6170
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6171
instruct bytes_reverse_int(iRegINoSp dst, iRegIorL2I src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6172
  match(Set dst (ReverseBytesI src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6173
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6174
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6175
  format %{ "revw  $dst, $src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6176
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6177
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6178
    __ revw(as_Register($dst$$reg), as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6179
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6180
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6181
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6182
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6183
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6184
instruct bytes_reverse_long(iRegLNoSp dst, iRegL src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6185
  match(Set dst (ReverseBytesL src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6186
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6187
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6188
  format %{ "rev  $dst, $src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6189
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6190
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6191
    __ rev(as_Register($dst$$reg), as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6192
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6193
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6194
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6195
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6196
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6197
instruct bytes_reverse_unsigned_short(iRegINoSp dst, iRegIorL2I src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6198
  match(Set dst (ReverseBytesUS src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6199
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6200
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6201
  format %{ "rev16w  $dst, $src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6202
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6203
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6204
    __ rev16w(as_Register($dst$$reg), as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6205
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6206
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6207
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6208
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6209
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6210
instruct bytes_reverse_short(iRegINoSp dst, iRegIorL2I src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6211
  match(Set dst (ReverseBytesS src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6212
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6213
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6214
  format %{ "rev16w  $dst, $src\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6215
            "sbfmw $dst, $dst, #0, #15" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6216
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6217
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6218
    __ rev16w(as_Register($dst$$reg), as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6219
    __ sbfmw(as_Register($dst$$reg), as_Register($dst$$reg), 0U, 15U);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6220
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6221
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6222
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6223
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6224
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6225
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6226
// Zero Count Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6227
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  6228
instruct countLeadingZerosI(iRegINoSp dst, iRegI src) %{
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6229
  match(Set dst (CountLeadingZerosI src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6230
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6231
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6232
  format %{ "clzw  $dst, $src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6233
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6234
    __ clzw(as_Register($dst$$reg), as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6235
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6236
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6237
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6238
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6239
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  6240
instruct countLeadingZerosL(iRegINoSp dst, iRegL src) %{
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6241
  match(Set dst (CountLeadingZerosL src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6242
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6243
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6244
  format %{ "clz   $dst, $src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6245
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6246
    __ clz(as_Register($dst$$reg), as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6247
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6248
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6249
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6250
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6251
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  6252
instruct countTrailingZerosI(iRegINoSp dst, iRegI src) %{
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6253
  match(Set dst (CountTrailingZerosI src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6254
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6255
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6256
  format %{ "rbitw  $dst, $src\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6257
            "clzw   $dst, $dst" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6258
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6259
    __ rbitw(as_Register($dst$$reg), as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6260
    __ clzw(as_Register($dst$$reg), as_Register($dst$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6261
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6262
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6263
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6264
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6265
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  6266
instruct countTrailingZerosL(iRegINoSp dst, iRegL src) %{
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6267
  match(Set dst (CountTrailingZerosL src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6268
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6269
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6270
  format %{ "rbit   $dst, $src\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6271
            "clz    $dst, $dst" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6272
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6273
    __ rbit(as_Register($dst$$reg), as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6274
    __ clz(as_Register($dst$$reg), as_Register($dst$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6275
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6276
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6277
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6278
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6279
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6280
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6281
// MemBar Instruction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6282
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6283
instruct load_fence() %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6284
  match(LoadFence);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6285
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6286
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6287
  format %{ "load_fence" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6288
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6289
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6290
    __ membar(Assembler::LoadLoad|Assembler::LoadStore);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6291
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6292
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6293
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6294
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6295
instruct unnecessary_membar_acquire() %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6296
  predicate(! UseBarriersForVolatile && preceded_by_ordered_load(n));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6297
  match(MemBarAcquire);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6298
  ins_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6299
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6300
  format %{ "membar_acquire (elided)" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6301
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6302
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6303
    __ block_comment("membar_acquire (elided)");
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6304
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6305
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6306
  ins_pipe(pipe_class_empty);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6307
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6308
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6309
instruct membar_acquire() %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6310
  match(MemBarAcquire);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6311
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6312
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6313
  format %{ "membar_acquire" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6314
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6315
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6316
    __ membar(Assembler::LoadLoad|Assembler::LoadStore);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6317
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6318
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6319
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6320
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6321
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6322
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6323
instruct membar_acquire_lock() %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6324
  match(MemBarAcquireLock);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6325
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6326
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6327
  format %{ "membar_acquire_lock" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6328
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6329
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6330
    __ membar(Assembler::LoadLoad|Assembler::LoadStore);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6331
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6332
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6333
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6334
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6335
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6336
instruct store_fence() %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6337
  match(StoreFence);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6338
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6339
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6340
  format %{ "store_fence" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6341
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6342
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6343
    __ membar(Assembler::LoadStore|Assembler::StoreStore);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6344
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6345
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6346
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6347
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6348
instruct membar_release() %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6349
  match(MemBarRelease);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6350
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6351
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6352
  format %{ "membar_release" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6353
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6354
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6355
    __ membar(Assembler::LoadStore|Assembler::StoreStore);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6356
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6357
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6358
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6359
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6360
instruct membar_storestore() %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6361
  match(MemBarStoreStore);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6362
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6363
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6364
  format %{ "MEMBAR-store-store" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6365
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6366
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6367
    __ membar(Assembler::StoreStore);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6368
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6369
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6370
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6371
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6372
instruct membar_release_lock() %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6373
  match(MemBarReleaseLock);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6374
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6375
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6376
  format %{ "membar_release_lock" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6377
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6378
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6379
    __ membar(Assembler::LoadStore|Assembler::StoreStore);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6380
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6381
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6382
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6383
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6384
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6385
instruct membar_volatile() %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6386
  match(MemBarVolatile);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6387
  ins_cost(VOLATILE_REF_COST*100);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6388
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6389
  format %{ "membar_volatile" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6390
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6391
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6392
    __ membar(Assembler::StoreLoad);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6393
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6394
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6395
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6396
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6397
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6398
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6399
// Cast/Convert Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6400
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6401
instruct castX2P(iRegPNoSp dst, iRegL src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6402
  match(Set dst (CastX2P src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6403
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6404
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6405
  format %{ "mov $dst, $src\t# long -> ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6406
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6407
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6408
    if ($dst$$reg != $src$$reg) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6409
      __ mov(as_Register($dst$$reg), as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6410
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6411
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6412
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6413
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6414
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6415
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6416
instruct castP2X(iRegLNoSp dst, iRegP src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6417
  match(Set dst (CastP2X src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6418
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6419
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6420
  format %{ "mov $dst, $src\t# ptr -> long" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6421
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6422
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6423
    if ($dst$$reg != $src$$reg) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6424
      __ mov(as_Register($dst$$reg), as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6425
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6426
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6427
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6428
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6429
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6430
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6431
// Convert oop into int for vectors alignment masking
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6432
instruct convP2I(iRegINoSp dst, iRegP src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6433
  match(Set dst (ConvL2I (CastP2X src)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6434
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6435
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6436
  format %{ "movw $dst, $src\t# ptr -> int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6437
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6438
    __ movw($dst$$Register, $src$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6439
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6440
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6441
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6442
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6443
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6444
// Convert compressed oop into int for vectors alignment masking
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6445
// in case of 32bit oops (heap < 4Gb).
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6446
instruct convN2I(iRegINoSp dst, iRegN src)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6447
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6448
  predicate(Universe::narrow_oop_shift() == 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6449
  match(Set dst (ConvL2I (CastP2X (DecodeN src))));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6450
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6451
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6452
  format %{ "mov dst, $src\t# compressed ptr -> int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6453
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6454
    __ movw($dst$$Register, $src$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6455
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6456
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6457
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6458
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6459
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6460
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6461
// Convert oop pointer into compressed form
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6462
instruct encodeHeapOop(iRegNNoSp dst, iRegP src, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6463
  predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6464
  match(Set dst (EncodeP src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6465
  effect(KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6466
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6467
  format %{ "encode_heap_oop $dst, $src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6468
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6469
    Register s = $src$$Register;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6470
    Register d = $dst$$Register;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6471
    __ encode_heap_oop(d, s);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6472
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6473
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6474
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6475
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6476
instruct encodeHeapOop_not_null(iRegNNoSp dst, iRegP src, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6477
  predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6478
  match(Set dst (EncodeP src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6479
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6480
  format %{ "encode_heap_oop_not_null $dst, $src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6481
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6482
    __ encode_heap_oop_not_null($dst$$Register, $src$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6483
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6484
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6485
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6486
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6487
instruct decodeHeapOop(iRegPNoSp dst, iRegN src, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6488
  predicate(n->bottom_type()->is_ptr()->ptr() != TypePtr::NotNull &&
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6489
            n->bottom_type()->is_ptr()->ptr() != TypePtr::Constant);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6490
  match(Set dst (DecodeN src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6491
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6492
  format %{ "decode_heap_oop $dst, $src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6493
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6494
    Register s = $src$$Register;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6495
    Register d = $dst$$Register;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6496
    __ decode_heap_oop(d, s);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6497
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6498
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6499
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6500
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6501
instruct decodeHeapOop_not_null(iRegPNoSp dst, iRegN src, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6502
  predicate(n->bottom_type()->is_ptr()->ptr() == TypePtr::NotNull ||
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6503
            n->bottom_type()->is_ptr()->ptr() == TypePtr::Constant);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6504
  match(Set dst (DecodeN src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6505
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6506
  format %{ "decode_heap_oop_not_null $dst, $src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6507
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6508
    Register s = $src$$Register;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6509
    Register d = $dst$$Register;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6510
    __ decode_heap_oop_not_null(d, s);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6511
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6512
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6513
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6514
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6515
// n.b. AArch64 implementations of encode_klass_not_null and
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6516
// decode_klass_not_null do not modify the flags register so, unlike
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6517
// Intel, we don't kill CR as a side effect here
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6518
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6519
instruct encodeKlass_not_null(iRegNNoSp dst, iRegP src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6520
  match(Set dst (EncodePKlass src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6521
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6522
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6523
  format %{ "encode_klass_not_null $dst,$src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6524
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6525
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6526
    Register src_reg = as_Register($src$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6527
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6528
    __ encode_klass_not_null(dst_reg, src_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6529
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6530
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6531
   ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6532
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6533
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6534
instruct decodeKlass_not_null(iRegPNoSp dst, iRegN src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6535
  match(Set dst (DecodeNKlass src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6536
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6537
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6538
  format %{ "decode_klass_not_null $dst,$src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6539
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6540
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6541
    Register src_reg = as_Register($src$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6542
    Register dst_reg = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6543
    if (dst_reg != src_reg) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6544
      __ decode_klass_not_null(dst_reg, src_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6545
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6546
      __ decode_klass_not_null(dst_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6547
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6548
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6549
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6550
   ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6551
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6552
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6553
instruct checkCastPP(iRegPNoSp dst)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6554
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6555
  match(Set dst (CheckCastPP dst));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6556
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6557
  size(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6558
  format %{ "# checkcastPP of $dst" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6559
  ins_encode(/* empty encoding */);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6560
  ins_pipe(pipe_class_empty);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6561
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6562
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6563
instruct castPP(iRegPNoSp dst)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6564
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6565
  match(Set dst (CastPP dst));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6566
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6567
  size(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6568
  format %{ "# castPP of $dst" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6569
  ins_encode(/* empty encoding */);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6570
  ins_pipe(pipe_class_empty);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6571
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6572
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6573
instruct castII(iRegI dst)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6574
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6575
  match(Set dst (CastII dst));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6576
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6577
  size(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6578
  format %{ "# castII of $dst" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6579
  ins_encode(/* empty encoding */);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6580
  ins_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6581
  ins_pipe(pipe_class_empty);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6582
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6583
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6584
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6585
// Atomic operation instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6586
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6587
// Intel and SPARC both implement Ideal Node LoadPLocked and
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6588
// Store{PIL}Conditional instructions using a normal load for the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6589
// LoadPLocked and a CAS for the Store{PIL}Conditional.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6590
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6591
// The ideal code appears only to use LoadPLocked/StorePLocked as a
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6592
// pair to lock object allocations from Eden space when not using
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6593
// TLABs.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6594
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6595
// There does not appear to be a Load{IL}Locked Ideal Node and the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6596
// Ideal code appears to use Store{IL}Conditional as an alias for CAS
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6597
// and to use StoreIConditional only for 32-bit and StoreLConditional
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6598
// only for 64-bit.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6599
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6600
// We implement LoadPLocked and StorePLocked instructions using,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6601
// respectively the AArch64 hw load-exclusive and store-conditional
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6602
// instructions. Whereas we must implement each of
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6603
// Store{IL}Conditional using a CAS which employs a pair of
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6604
// instructions comprising a load-exclusive followed by a
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6605
// store-conditional.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6606
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6607
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6608
// Locked-load (linked load) of the current heap-top
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6609
// used when updating the eden heap top
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6610
// implemented using ldaxr on AArch64
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6611
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6612
instruct loadPLocked(iRegPNoSp dst, indirect mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6613
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6614
  match(Set dst (LoadPLocked mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6615
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6616
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6617
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6618
  format %{ "ldaxr $dst, $mem\t# ptr linked acquire" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6619
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6620
  ins_encode(aarch64_enc_ldaxr(dst, mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6621
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6622
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6623
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6624
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6625
// Conditional-store of the updated heap-top.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6626
// Used during allocation of the shared heap.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6627
// Sets flag (EQ) on success.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6628
// implemented using stlxr on AArch64.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6629
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6630
instruct storePConditional(memory heap_top_ptr, iRegP oldval, iRegP newval, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6631
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6632
  match(Set cr (StorePConditional heap_top_ptr (Binary oldval newval)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6633
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6634
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6635
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6636
 // TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6637
 // do we need to do a store-conditional release or can we just use a
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6638
 // plain store-conditional?
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6639
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6640
  format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6641
    "stlxr rscratch1, $newval, $heap_top_ptr\t# ptr cond release"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6642
    "cmpw rscratch1, zr\t# EQ on successful write"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6643
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6644
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6645
  ins_encode(aarch64_enc_stlxr(newval, heap_top_ptr));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6646
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6647
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6648
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6649
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6650
// this has to be implemented as a CAS
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6651
instruct storeLConditional(indirect mem, iRegLNoSp oldval, iRegLNoSp newval, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6652
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6653
  match(Set cr (StoreLConditional mem (Binary oldval newval)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6654
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6655
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6656
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6657
  format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6658
    "cmpxchg rscratch1, $mem, $oldval, $newval, $mem\t# if $mem == $oldval then $mem <-- $newval"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6659
    "cmpw rscratch1, zr\t# EQ on successful write"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6660
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6661
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6662
  ins_encode(aarch64_enc_cmpxchg(mem, oldval, newval));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6663
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6664
  ins_pipe(pipe_slow);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6665
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6666
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6667
// this has to be implemented as a CAS
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6668
instruct storeIConditional(indirect mem, iRegINoSp oldval, iRegINoSp newval, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6669
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6670
  match(Set cr (StoreIConditional mem (Binary oldval newval)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6671
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6672
  ins_cost(VOLATILE_REF_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6673
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6674
  format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6675
    "cmpxchgw rscratch1, $mem, $oldval, $newval, $mem\t# if $mem == $oldval then $mem <-- $newval"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6676
    "cmpw rscratch1, zr\t# EQ on successful write"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6677
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6678
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6679
  ins_encode(aarch64_enc_cmpxchgw(mem, oldval, newval));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6680
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6681
  ins_pipe(pipe_slow);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6682
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6683
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6684
// XXX No flag versions for CompareAndSwap{I,L,P,N} because matcher
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6685
// can't match them
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6686
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6687
instruct compareAndSwapI(iRegINoSp res, indirect mem, iRegINoSp oldval, iRegINoSp newval, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6688
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6689
  match(Set res (CompareAndSwapI mem (Binary oldval newval)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6690
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6691
  effect(KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6692
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6693
 format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6694
    "cmpxchgw $mem, $oldval, $newval\t# (int) if $mem == $oldval then $mem <-- $newval"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6695
    "cset $res, EQ\t# $res <-- (EQ ? 1 : 0)"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6696
 %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6697
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6698
 ins_encode(aarch64_enc_cmpxchgw(mem, oldval, newval),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6699
            aarch64_enc_cset_eq(res));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6700
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6701
  ins_pipe(pipe_slow);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6702
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6703
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6704
instruct compareAndSwapL(iRegINoSp res, indirect mem, iRegLNoSp oldval, iRegLNoSp newval, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6705
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6706
  match(Set res (CompareAndSwapL mem (Binary oldval newval)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6707
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6708
  effect(KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6709
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6710
 format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6711
    "cmpxchg $mem, $oldval, $newval\t# (long) if $mem == $oldval then $mem <-- $newval"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6712
    "cset $res, EQ\t# $res <-- (EQ ? 1 : 0)"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6713
 %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6714
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6715
 ins_encode(aarch64_enc_cmpxchg(mem, oldval, newval),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6716
            aarch64_enc_cset_eq(res));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6717
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6718
  ins_pipe(pipe_slow);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6719
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6720
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6721
instruct compareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6722
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6723
  match(Set res (CompareAndSwapP mem (Binary oldval newval)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6724
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6725
  effect(KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6726
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6727
 format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6728
    "cmpxchg $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6729
    "cset $res, EQ\t# $res <-- (EQ ? 1 : 0)"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6730
 %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6731
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6732
 ins_encode(aarch64_enc_cmpxchg(mem, oldval, newval),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6733
            aarch64_enc_cset_eq(res));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6734
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6735
  ins_pipe(pipe_slow);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6736
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6737
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6738
instruct compareAndSwapN(iRegINoSp res, indirect mem, iRegNNoSp oldval, iRegNNoSp newval, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6739
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6740
  match(Set res (CompareAndSwapN mem (Binary oldval newval)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6741
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6742
  effect(KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6743
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6744
 format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6745
    "cmpxchgw $mem, $oldval, $newval\t# (narrow oop) if $mem == $oldval then $mem <-- $newval"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6746
    "cset $res, EQ\t# $res <-- (EQ ? 1 : 0)"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6747
 %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6748
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6749
 ins_encode(aarch64_enc_cmpxchgw(mem, oldval, newval),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6750
            aarch64_enc_cset_eq(res));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6751
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6752
  ins_pipe(pipe_slow);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6753
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6754
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6755
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6756
instruct get_and_setI(indirect mem, iRegINoSp newv, iRegI prev) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6757
  match(Set prev (GetAndSetI mem newv));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6758
  format %{ "atomic_xchgw  $prev, $newv, [$mem]" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6759
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6760
    __ atomic_xchgw($prev$$Register, $newv$$Register, as_Register($mem$$base));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6761
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6762
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6763
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6764
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6765
instruct get_and_setL(indirect mem, iRegLNoSp newv, iRegL prev) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6766
  match(Set prev (GetAndSetL mem newv));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6767
  format %{ "atomic_xchg  $prev, $newv, [$mem]" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6768
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6769
    __ atomic_xchg($prev$$Register, $newv$$Register, as_Register($mem$$base));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6770
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6771
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6772
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6773
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6774
instruct get_and_setN(indirect mem, iRegNNoSp newv, iRegI prev) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6775
  match(Set prev (GetAndSetN mem newv));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6776
  format %{ "atomic_xchgw $prev, $newv, [$mem]" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6777
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6778
    __ atomic_xchgw($prev$$Register, $newv$$Register, as_Register($mem$$base));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6779
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6780
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6781
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6782
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6783
instruct get_and_setP(indirect mem, iRegPNoSp newv, iRegP prev) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6784
  match(Set prev (GetAndSetP mem newv));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6785
  format %{ "atomic_xchg  $prev, $newv, [$mem]" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6786
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6787
    __ atomic_xchg($prev$$Register, $newv$$Register, as_Register($mem$$base));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6788
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6789
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6790
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6791
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6792
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6793
instruct get_and_addL(indirect mem, iRegLNoSp newval, iRegL incr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6794
  match(Set newval (GetAndAddL mem incr));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6795
  ins_cost(INSN_COST * 10);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6796
  format %{ "get_and_addL $newval, [$mem], $incr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6797
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6798
    __ atomic_add($newval$$Register, $incr$$Register, as_Register($mem$$base));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6799
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6800
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6801
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6802
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6803
instruct get_and_addL_no_res(indirect mem, Universe dummy, iRegL incr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6804
  predicate(n->as_LoadStore()->result_not_used());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6805
  match(Set dummy (GetAndAddL mem incr));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6806
  ins_cost(INSN_COST * 9);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6807
  format %{ "get_and_addL [$mem], $incr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6808
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6809
    __ atomic_add(noreg, $incr$$Register, as_Register($mem$$base));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6810
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6811
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6812
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6813
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6814
instruct get_and_addLi(indirect mem, iRegLNoSp newval, immLAddSub incr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6815
  match(Set newval (GetAndAddL mem incr));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6816
  ins_cost(INSN_COST * 10);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6817
  format %{ "get_and_addL $newval, [$mem], $incr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6818
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6819
    __ atomic_add($newval$$Register, $incr$$constant, as_Register($mem$$base));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6820
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6821
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6822
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6823
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6824
instruct get_and_addLi_no_res(indirect mem, Universe dummy, immLAddSub incr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6825
  predicate(n->as_LoadStore()->result_not_used());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6826
  match(Set dummy (GetAndAddL mem incr));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6827
  ins_cost(INSN_COST * 9);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6828
  format %{ "get_and_addL [$mem], $incr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6829
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6830
    __ atomic_add(noreg, $incr$$constant, as_Register($mem$$base));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6831
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6832
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6833
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6834
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6835
instruct get_and_addI(indirect mem, iRegINoSp newval, iRegIorL2I incr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6836
  match(Set newval (GetAndAddI mem incr));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6837
  ins_cost(INSN_COST * 10);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6838
  format %{ "get_and_addI $newval, [$mem], $incr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6839
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6840
    __ atomic_addw($newval$$Register, $incr$$Register, as_Register($mem$$base));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6841
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6842
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6843
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6844
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6845
instruct get_and_addI_no_res(indirect mem, Universe dummy, iRegIorL2I incr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6846
  predicate(n->as_LoadStore()->result_not_used());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6847
  match(Set dummy (GetAndAddI mem incr));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6848
  ins_cost(INSN_COST * 9);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6849
  format %{ "get_and_addI [$mem], $incr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6850
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6851
    __ atomic_addw(noreg, $incr$$Register, as_Register($mem$$base));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6852
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6853
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6854
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6855
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6856
instruct get_and_addIi(indirect mem, iRegINoSp newval, immIAddSub incr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6857
  match(Set newval (GetAndAddI mem incr));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6858
  ins_cost(INSN_COST * 10);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6859
  format %{ "get_and_addI $newval, [$mem], $incr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6860
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6861
    __ atomic_addw($newval$$Register, $incr$$constant, as_Register($mem$$base));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6862
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6863
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6864
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6865
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6866
instruct get_and_addIi_no_res(indirect mem, Universe dummy, immIAddSub incr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6867
  predicate(n->as_LoadStore()->result_not_used());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6868
  match(Set dummy (GetAndAddI mem incr));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6869
  ins_cost(INSN_COST * 9);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6870
  format %{ "get_and_addI [$mem], $incr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6871
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6872
    __ atomic_addw(noreg, $incr$$constant, as_Register($mem$$base));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6873
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6874
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6875
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6876
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6877
// Manifest a CmpL result in an integer register.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6878
// (src1 < src2) ? -1 : ((src1 > src2) ? 1 : 0)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6879
instruct cmpL3_reg_reg(iRegINoSp dst, iRegL src1, iRegL src2, rFlagsReg flags)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6880
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6881
  match(Set dst (CmpL3 src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6882
  effect(KILL flags);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6883
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6884
  ins_cost(INSN_COST * 6);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6885
  format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6886
      "cmp $src1, $src2"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6887
      "csetw $dst, ne"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6888
      "cnegw $dst, lt"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6889
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6890
  // format %{ "CmpL3 $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6891
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6892
    __ cmp($src1$$Register, $src2$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6893
    __ csetw($dst$$Register, Assembler::NE);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6894
    __ cnegw($dst$$Register, $dst$$Register, Assembler::LT);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6895
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6896
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6897
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6898
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6899
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6900
instruct cmpL3_reg_imm(iRegINoSp dst, iRegL src1, immLAddSub src2, rFlagsReg flags)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6901
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6902
  match(Set dst (CmpL3 src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6903
  effect(KILL flags);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6904
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6905
  ins_cost(INSN_COST * 6);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6906
  format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6907
      "cmp $src1, $src2"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6908
      "csetw $dst, ne"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6909
      "cnegw $dst, lt"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6910
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6911
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6912
    int32_t con = (int32_t)$src2$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6913
     if (con < 0) {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6914
      __ adds(zr, $src1$$Register, -con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6915
    } else {
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6916
      __ subs(zr, $src1$$Register, con);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6917
    }
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6918
    __ csetw($dst$$Register, Assembler::NE);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6919
    __ cnegw($dst$$Register, $dst$$Register, Assembler::LT);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6920
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6921
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6922
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6923
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6924
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6925
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6926
// Conditional Move Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6927
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6928
// n.b. we have identical rules for both a signed compare op (cmpOp)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6929
// and an unsigned compare op (cmpOpU). it would be nice if we could
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6930
// define an op class which merged both inputs and use it to type the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6931
// argument to a single rule. unfortunatelyt his fails because the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6932
// opclass does not live up to the COND_INTER interface of its
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6933
// component operands. When the generic code tries to negate the
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6934
// operand it ends up running the generci Machoper::negate method
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6935
// which throws a ShouldNotHappen. So, we have to provide two flavours
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6936
// of each rule, one for a cmpOp and a second for a cmpOpU (sigh).
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6937
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6938
instruct cmovI_reg_reg(cmpOp cmp, rFlagsReg cr, iRegINoSp dst, iRegI src1, iRegI src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6939
  match(Set dst (CMoveI (Binary cmp cr) (Binary src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6940
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6941
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6942
  format %{ "cselw $dst, $src2, $src1 $cmp\t# signed, int"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6943
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6944
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6945
    __ cselw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6946
             as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6947
             as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6948
             (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6949
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6950
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6951
  ins_pipe(icond_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6952
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6953
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6954
instruct cmovUI_reg_reg(cmpOpU cmp, rFlagsRegU cr, iRegINoSp dst, iRegI src1, iRegI src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6955
  match(Set dst (CMoveI (Binary cmp cr) (Binary src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6956
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6957
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6958
  format %{ "cselw $dst, $src2, $src1 $cmp\t# unsigned, int"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6959
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6960
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6961
    __ cselw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6962
             as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6963
             as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6964
             (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6965
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6966
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6967
  ins_pipe(icond_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6968
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6969
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6970
// special cases where one arg is zero
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6971
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6972
// n.b. this is selected in preference to the rule above because it
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6973
// avoids loading constant 0 into a source register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6974
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6975
// TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6976
// we ought only to be able to cull one of these variants as the ideal
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6977
// transforms ought always to order the zero consistently (to left/right?)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6978
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6979
instruct cmovI_zero_reg(cmpOp cmp, rFlagsReg cr, iRegINoSp dst, immI0 zero, iRegI src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6980
  match(Set dst (CMoveI (Binary cmp cr) (Binary zero src)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6981
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6982
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6983
  format %{ "cselw $dst, $src, zr $cmp\t# signed, int"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6984
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6985
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6986
    __ cselw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6987
             as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6988
             zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6989
             (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6990
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6991
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6992
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6993
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6994
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6995
instruct cmovUI_zero_reg(cmpOpU cmp, rFlagsRegU cr, iRegINoSp dst, immI0 zero, iRegI src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6996
  match(Set dst (CMoveI (Binary cmp cr) (Binary zero src)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6997
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6998
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  6999
  format %{ "cselw $dst, $src, zr $cmp\t# unsigned, int"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7000
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7001
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7002
    __ cselw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7003
             as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7004
             zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7005
             (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7006
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7007
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7008
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7009
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7010
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7011
instruct cmovI_reg_zero(cmpOp cmp, rFlagsReg cr, iRegINoSp dst, iRegI src, immI0 zero) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7012
  match(Set dst (CMoveI (Binary cmp cr) (Binary src zero)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7013
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7014
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7015
  format %{ "cselw $dst, zr, $src $cmp\t# signed, int"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7016
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7017
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7018
    __ cselw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7019
             zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7020
             as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7021
             (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7022
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7023
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7024
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7025
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7026
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7027
instruct cmovUI_reg_zero(cmpOpU cmp, rFlagsRegU cr, iRegINoSp dst, iRegI src, immI0 zero) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7028
  match(Set dst (CMoveI (Binary cmp cr) (Binary src zero)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7029
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7030
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7031
  format %{ "cselw $dst, zr, $src $cmp\t# unsigned, int"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7032
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7033
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7034
    __ cselw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7035
             zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7036
             as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7037
             (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7038
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7039
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7040
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7041
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7042
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7043
// special case for creating a boolean 0 or 1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7044
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7045
// n.b. this is selected in preference to the rule above because it
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7046
// avoids loading constants 0 and 1 into a source register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7047
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7048
instruct cmovI_reg_zero_one(cmpOp cmp, rFlagsReg cr, iRegINoSp dst, immI0 zero, immI_1 one) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7049
  match(Set dst (CMoveI (Binary cmp cr) (Binary one zero)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7050
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7051
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7052
  format %{ "csincw $dst, zr, zr $cmp\t# signed, int"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7053
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7054
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7055
    // equivalently
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7056
    // cset(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7057
    //      negate_condition((Assembler::Condition)$cmp$$cmpcode));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7058
    __ csincw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7059
             zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7060
             zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7061
             (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7062
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7063
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7064
  ins_pipe(icond_none);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7065
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7066
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7067
instruct cmovUI_reg_zero_one(cmpOpU cmp, rFlagsRegU cr, iRegINoSp dst, immI0 zero, immI_1 one) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7068
  match(Set dst (CMoveI (Binary cmp cr) (Binary one zero)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7069
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7070
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7071
  format %{ "csincw $dst, zr, zr $cmp\t# unsigned, int"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7072
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7073
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7074
    // equivalently
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7075
    // cset(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7076
    //      negate_condition((Assembler::Condition)$cmp$$cmpcode));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7077
    __ csincw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7078
             zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7079
             zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7080
             (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7081
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7082
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7083
  ins_pipe(icond_none);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7084
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7085
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7086
instruct cmovL_reg_reg(cmpOp cmp, rFlagsReg cr, iRegLNoSp dst, iRegL src1, iRegL src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7087
  match(Set dst (CMoveL (Binary cmp cr) (Binary src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7088
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7089
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7090
  format %{ "csel $dst, $src2, $src1 $cmp\t# signed, long"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7091
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7092
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7093
    __ csel(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7094
            as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7095
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7096
            (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7097
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7098
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7099
  ins_pipe(icond_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7100
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7101
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7102
instruct cmovUL_reg_reg(cmpOpU cmp, rFlagsRegU cr, iRegLNoSp dst, iRegL src1, iRegL src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7103
  match(Set dst (CMoveL (Binary cmp cr) (Binary src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7104
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7105
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7106
  format %{ "csel $dst, $src2, $src1 $cmp\t# unsigned, long"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7107
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7108
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7109
    __ csel(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7110
            as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7111
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7112
            (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7113
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7114
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7115
  ins_pipe(icond_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7116
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7117
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7118
// special cases where one arg is zero
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7119
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7120
instruct cmovL_reg_zero(cmpOp cmp, rFlagsReg cr, iRegLNoSp dst, iRegL src, immL0 zero) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7121
  match(Set dst (CMoveL (Binary cmp cr) (Binary src zero)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7122
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7123
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7124
  format %{ "csel $dst, zr, $src $cmp\t# signed, long"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7125
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7126
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7127
    __ csel(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7128
            zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7129
            as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7130
            (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7131
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7132
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7133
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7134
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7135
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7136
instruct cmovUL_reg_zero(cmpOpU cmp, rFlagsRegU cr, iRegLNoSp dst, iRegL src, immL0 zero) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7137
  match(Set dst (CMoveL (Binary cmp cr) (Binary src zero)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7138
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7139
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7140
  format %{ "csel $dst, zr, $src $cmp\t# unsigned, long"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7141
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7142
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7143
    __ csel(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7144
            zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7145
            as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7146
            (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7147
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7148
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7149
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7150
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7151
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7152
instruct cmovL_zero_reg(cmpOp cmp, rFlagsReg cr, iRegLNoSp dst, immL0 zero, iRegL src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7153
  match(Set dst (CMoveL (Binary cmp cr) (Binary zero src)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7154
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7155
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7156
  format %{ "csel $dst, $src, zr $cmp\t# signed, long"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7157
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7158
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7159
    __ csel(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7160
            as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7161
            zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7162
            (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7163
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7164
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7165
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7166
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7167
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7168
instruct cmovUL_zero_reg(cmpOpU cmp, rFlagsRegU cr, iRegLNoSp dst, immL0 zero, iRegL src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7169
  match(Set dst (CMoveL (Binary cmp cr) (Binary zero src)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7170
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7171
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7172
  format %{ "csel $dst, $src, zr $cmp\t# unsigned, long"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7173
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7174
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7175
    __ csel(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7176
            as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7177
            zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7178
            (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7179
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7180
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7181
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7182
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7183
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7184
instruct cmovP_reg_reg(cmpOp cmp, rFlagsReg cr, iRegPNoSp dst, iRegP src1, iRegP src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7185
  match(Set dst (CMoveP (Binary cmp cr) (Binary src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7186
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7187
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7188
  format %{ "csel $dst, $src2, $src1 $cmp\t# signed, ptr"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7189
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7190
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7191
    __ csel(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7192
            as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7193
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7194
            (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7195
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7196
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7197
  ins_pipe(icond_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7198
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7199
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7200
instruct cmovUP_reg_reg(cmpOpU cmp, rFlagsRegU cr, iRegPNoSp dst, iRegP src1, iRegP src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7201
  match(Set dst (CMoveP (Binary cmp cr) (Binary src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7202
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7203
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7204
  format %{ "csel $dst, $src2, $src1 $cmp\t# unsigned, ptr"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7205
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7206
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7207
    __ csel(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7208
            as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7209
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7210
            (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7211
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7212
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7213
  ins_pipe(icond_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7214
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7215
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7216
// special cases where one arg is zero
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7217
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7218
instruct cmovP_reg_zero(cmpOp cmp, rFlagsReg cr, iRegPNoSp dst, iRegP src, immP0 zero) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7219
  match(Set dst (CMoveP (Binary cmp cr) (Binary src zero)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7220
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7221
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7222
  format %{ "csel $dst, zr, $src $cmp\t# signed, ptr"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7223
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7224
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7225
    __ csel(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7226
            zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7227
            as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7228
            (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7229
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7230
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7231
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7232
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7233
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7234
instruct cmovUP_reg_zero(cmpOpU cmp, rFlagsRegU cr, iRegPNoSp dst, iRegP src, immP0 zero) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7235
  match(Set dst (CMoveP (Binary cmp cr) (Binary src zero)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7236
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7237
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7238
  format %{ "csel $dst, zr, $src $cmp\t# unsigned, ptr"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7239
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7240
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7241
    __ csel(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7242
            zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7243
            as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7244
            (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7245
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7246
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7247
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7248
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7249
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7250
instruct cmovP_zero_reg(cmpOp cmp, rFlagsReg cr, iRegPNoSp dst, immP0 zero, iRegP src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7251
  match(Set dst (CMoveP (Binary cmp cr) (Binary zero src)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7252
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7253
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7254
  format %{ "csel $dst, $src, zr $cmp\t# signed, ptr"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7255
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7256
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7257
    __ csel(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7258
            as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7259
            zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7260
            (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7261
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7262
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7263
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7264
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7265
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7266
instruct cmovUP_zero_reg(cmpOpU cmp, rFlagsRegU cr, iRegPNoSp dst, immP0 zero, iRegP src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7267
  match(Set dst (CMoveP (Binary cmp cr) (Binary zero src)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7268
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7269
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7270
  format %{ "csel $dst, $src, zr $cmp\t# unsigned, ptr"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7271
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7272
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7273
    __ csel(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7274
            as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7275
            zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7276
            (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7277
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7278
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7279
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7280
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7281
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7282
instruct cmovN_reg_reg(cmpOp cmp, rFlagsReg cr, iRegNNoSp dst, iRegN src1, iRegN src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7283
  match(Set dst (CMoveN (Binary cmp cr) (Binary src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7284
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7285
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7286
  format %{ "cselw $dst, $src2, $src1 $cmp\t# signed, compressed ptr"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7287
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7288
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7289
    __ cselw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7290
             as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7291
             as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7292
             (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7293
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7294
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7295
  ins_pipe(icond_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7296
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7297
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7298
instruct cmovUN_reg_reg(cmpOpU cmp, rFlagsRegU cr, iRegNNoSp dst, iRegN src1, iRegN src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7299
  match(Set dst (CMoveN (Binary cmp cr) (Binary src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7300
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7301
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7302
  format %{ "cselw $dst, $src2, $src1 $cmp\t# signed, compressed ptr"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7303
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7304
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7305
    __ cselw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7306
             as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7307
             as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7308
             (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7309
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7310
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7311
  ins_pipe(icond_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7312
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7313
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7314
// special cases where one arg is zero
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7315
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7316
instruct cmovN_reg_zero(cmpOp cmp, rFlagsReg cr, iRegNNoSp dst, iRegN src, immN0 zero) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7317
  match(Set dst (CMoveN (Binary cmp cr) (Binary src zero)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7318
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7319
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7320
  format %{ "cselw $dst, zr, $src $cmp\t# signed, compressed ptr"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7321
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7322
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7323
    __ cselw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7324
             zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7325
             as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7326
             (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7327
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7328
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7329
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7330
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7331
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7332
instruct cmovUN_reg_zero(cmpOpU cmp, rFlagsRegU cr, iRegNNoSp dst, iRegN src, immN0 zero) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7333
  match(Set dst (CMoveN (Binary cmp cr) (Binary src zero)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7334
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7335
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7336
  format %{ "cselw $dst, zr, $src $cmp\t# unsigned, compressed ptr"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7337
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7338
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7339
    __ cselw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7340
             zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7341
             as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7342
             (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7343
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7344
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7345
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7346
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7347
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7348
instruct cmovN_zero_reg(cmpOp cmp, rFlagsReg cr, iRegNNoSp dst, immN0 zero, iRegN src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7349
  match(Set dst (CMoveN (Binary cmp cr) (Binary zero src)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7350
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7351
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7352
  format %{ "cselw $dst, $src, zr $cmp\t# signed, compressed ptr"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7353
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7354
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7355
    __ cselw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7356
             as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7357
             zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7358
             (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7359
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7360
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7361
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7362
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7363
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7364
instruct cmovUN_zero_reg(cmpOpU cmp, rFlagsRegU cr, iRegNNoSp dst, immN0 zero, iRegN src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7365
  match(Set dst (CMoveN (Binary cmp cr) (Binary zero src)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7366
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7367
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7368
  format %{ "cselw $dst, $src, zr $cmp\t# unsigned, compressed ptr"  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7369
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7370
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7371
    __ cselw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7372
             as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7373
             zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7374
             (Assembler::Condition)$cmp$$cmpcode);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7375
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7376
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7377
  ins_pipe(icond_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7378
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7379
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7380
instruct cmovF_reg(cmpOp cmp, rFlagsReg cr, vRegF dst, vRegF src1,  vRegF src2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7381
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7382
  match(Set dst (CMoveF (Binary cmp cr) (Binary src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7383
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7384
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7385
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7386
  format %{ "fcsels $dst, $src1, $src2, $cmp\t# signed cmove float\n\t" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7387
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7388
    Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7389
    __ fcsels(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7390
              as_FloatRegister($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7391
              as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7392
              cond);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7393
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7394
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7395
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7396
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7397
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7398
instruct cmovUF_reg(cmpOpU cmp, rFlagsRegU cr, vRegF dst, vRegF src1,  vRegF src2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7399
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7400
  match(Set dst (CMoveF (Binary cmp cr) (Binary src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7401
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7402
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7403
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7404
  format %{ "fcsels $dst, $src1, $src2, $cmp\t# unsigned cmove float\n\t" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7405
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7406
    Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7407
    __ fcsels(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7408
              as_FloatRegister($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7409
              as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7410
              cond);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7411
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7412
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7413
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7414
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7415
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7416
instruct cmovD_reg(cmpOp cmp, rFlagsReg cr, vRegD dst, vRegD src1,  vRegD src2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7417
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7418
  match(Set dst (CMoveD (Binary cmp cr) (Binary src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7419
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7420
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7421
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7422
  format %{ "fcseld $dst, $src1, $src2, $cmp\t# signed cmove float\n\t" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7423
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7424
    Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7425
    __ fcseld(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7426
              as_FloatRegister($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7427
              as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7428
              cond);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7429
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7430
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7431
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7432
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7433
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7434
instruct cmovUD_reg(cmpOpU cmp, rFlagsRegU cr, vRegD dst, vRegD src1,  vRegD src2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7435
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7436
  match(Set dst (CMoveD (Binary cmp cr) (Binary src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7437
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7438
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7439
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7440
  format %{ "fcseld $dst, $src1, $src2, $cmp\t# unsigned cmove float\n\t" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7441
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7442
    Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7443
    __ fcseld(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7444
              as_FloatRegister($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7445
              as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7446
              cond);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7447
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7448
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7449
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7450
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7451
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7452
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7453
// Arithmetic Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7454
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7455
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7456
// Integer Addition
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7457
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7458
// TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7459
// these currently employ operations which do not set CR and hence are
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7460
// not flagged as killing CR but we would like to isolate the cases
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7461
// where we want to set flags from those where we don't. need to work
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7462
// out how to do that.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7463
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7464
instruct addI_reg_reg(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7465
  match(Set dst (AddI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7466
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7467
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7468
  format %{ "addw  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7469
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7470
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7471
    __ addw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7472
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7473
            as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7474
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7475
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7476
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7477
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7478
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7479
instruct addI_reg_imm(iRegINoSp dst, iRegI src1, immIAddSub src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7480
  match(Set dst (AddI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7481
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7482
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7483
  format %{ "addw $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7484
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7485
  // use opcode to indicate that this is an add not a sub
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7486
  opcode(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7487
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7488
  ins_encode(aarch64_enc_addsubw_imm(dst, src1, src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7489
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7490
  ins_pipe(ialu_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7491
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7492
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7493
instruct addI_reg_imm_i2l(iRegINoSp dst, iRegL src1, immIAddSub src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7494
  match(Set dst (AddI (ConvL2I src1) src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7495
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7496
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7497
  format %{ "addw $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7498
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7499
  // use opcode to indicate that this is an add not a sub
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7500
  opcode(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7501
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7502
  ins_encode(aarch64_enc_addsubw_imm(dst, src1, src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7503
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7504
  ins_pipe(ialu_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7505
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7506
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7507
// Pointer Addition
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7508
instruct addP_reg_reg(iRegPNoSp dst, iRegP src1, iRegL src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7509
  match(Set dst (AddP src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7510
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7511
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7512
  format %{ "add $dst, $src1, $src2\t# ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7513
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7514
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7515
    __ add(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7516
           as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7517
           as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7518
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7519
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7520
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7521
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7522
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7523
instruct addP_reg_reg_ext(iRegPNoSp dst, iRegP src1, iRegIorL2I src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7524
  match(Set dst (AddP src1 (ConvI2L src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7525
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7526
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7527
  format %{ "add $dst, $src1, $src2, sxtw\t# ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7528
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7529
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7530
    __ add(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7531
           as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7532
           as_Register($src2$$reg), ext::sxtw);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7533
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7534
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7535
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7536
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7537
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7538
instruct addP_reg_reg_lsl(iRegPNoSp dst, iRegP src1, iRegL src2, immIScale scale) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7539
  match(Set dst (AddP src1 (LShiftL src2 scale)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7540
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7541
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7542
  format %{ "add $dst, $src1, $src2, LShiftL $scale\t# ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7543
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7544
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7545
    __ lea(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7546
           Address(as_Register($src1$$reg), as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7547
                   Address::lsl($scale$$constant)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7548
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7549
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7550
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7551
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7552
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7553
instruct addP_reg_reg_ext_shift(iRegPNoSp dst, iRegP src1, iRegIorL2I src2, immIScale scale) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7554
  match(Set dst (AddP src1 (LShiftL (ConvI2L src2) scale)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7555
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7556
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7557
  format %{ "add $dst, $src1, $src2, I2L $scale\t# ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7558
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7559
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7560
    __ lea(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7561
           Address(as_Register($src1$$reg), as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7562
                   Address::sxtw($scale$$constant)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7563
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7564
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7565
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7566
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7567
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7568
instruct lshift_ext(iRegLNoSp dst, iRegIorL2I src, immI scale, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7569
  match(Set dst (LShiftL (ConvI2L src) scale));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7570
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7571
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7572
  format %{ "sbfiz $dst, $src, $scale & 63, -$scale & 63\t" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7573
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7574
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7575
    __ sbfiz(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7576
          as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7577
          $scale$$constant & 63, MIN(32, (-$scale$$constant) & 63));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7578
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7579
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7580
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7581
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7582
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7583
// Pointer Immediate Addition
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7584
// n.b. this needs to be more expensive than using an indirect memory
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7585
// operand
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7586
instruct addP_reg_imm(iRegPNoSp dst, iRegP src1, immLAddSub src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7587
  match(Set dst (AddP src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7588
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7589
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7590
  format %{ "add $dst, $src1, $src2\t# ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7591
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7592
  // use opcode to indicate that this is an add not a sub
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7593
  opcode(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7594
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7595
  ins_encode( aarch64_enc_addsub_imm(dst, src1, src2) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7596
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7597
  ins_pipe(ialu_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7598
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7599
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7600
// Long Addition
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7601
instruct addL_reg_reg(iRegLNoSp dst, iRegL src1, iRegL src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7602
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7603
  match(Set dst (AddL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7604
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7605
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7606
  format %{ "add  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7607
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7608
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7609
    __ add(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7610
           as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7611
           as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7612
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7613
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7614
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7615
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7616
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7617
// No constant pool entries requiredLong Immediate Addition.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7618
instruct addL_reg_imm(iRegLNoSp dst, iRegL src1, immLAddSub src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7619
  match(Set dst (AddL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7620
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7621
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7622
  format %{ "add $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7623
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7624
  // use opcode to indicate that this is an add not a sub
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7625
  opcode(0x0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7626
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7627
  ins_encode( aarch64_enc_addsub_imm(dst, src1, src2) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7628
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7629
  ins_pipe(ialu_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7630
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7631
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7632
// Integer Subtraction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7633
instruct subI_reg_reg(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7634
  match(Set dst (SubI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7635
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7636
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7637
  format %{ "subw  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7638
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7639
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7640
    __ subw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7641
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7642
            as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7643
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7644
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7645
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7646
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7647
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7648
// Immediate Subtraction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7649
instruct subI_reg_imm(iRegINoSp dst, iRegIorL2I src1, immIAddSub src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7650
  match(Set dst (SubI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7651
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7652
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7653
  format %{ "subw $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7654
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7655
  // use opcode to indicate that this is a sub not an add
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7656
  opcode(0x1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7657
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7658
  ins_encode(aarch64_enc_addsubw_imm(dst, src1, src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7659
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7660
  ins_pipe(ialu_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7661
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7662
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7663
// Long Subtraction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7664
instruct subL_reg_reg(iRegLNoSp dst, iRegL src1, iRegL src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7665
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7666
  match(Set dst (SubL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7667
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7668
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7669
  format %{ "sub  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7670
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7671
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7672
    __ sub(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7673
           as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7674
           as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7675
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7676
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7677
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7678
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7679
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7680
// No constant pool entries requiredLong Immediate Subtraction.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7681
instruct subL_reg_imm(iRegLNoSp dst, iRegL src1, immLAddSub src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7682
  match(Set dst (SubL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7683
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7684
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7685
  format %{ "sub$dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7686
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7687
  // use opcode to indicate that this is a sub not an add
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7688
  opcode(0x1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7689
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7690
  ins_encode( aarch64_enc_addsub_imm(dst, src1, src2) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7691
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7692
  ins_pipe(ialu_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7693
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7694
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7695
// Integer Negation (special case for sub)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7696
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7697
instruct negI_reg(iRegINoSp dst, iRegIorL2I src, immI0 zero, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7698
  match(Set dst (SubI zero src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7699
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7700
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7701
  format %{ "negw $dst, $src\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7702
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7703
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7704
    __ negw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7705
            as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7706
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7707
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7708
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7709
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7710
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7711
// Long Negation
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7712
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7713
instruct negL_reg(iRegLNoSp dst, iRegIorL2I src, immL0 zero, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7714
  match(Set dst (SubL zero src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7715
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7716
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7717
  format %{ "neg $dst, $src\t# long" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7718
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7719
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7720
    __ neg(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7721
           as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7722
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7723
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7724
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7725
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7726
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7727
// Integer Multiply
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7728
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7729
instruct mulI(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7730
  match(Set dst (MulI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7731
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7732
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7733
  format %{ "mulw  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7734
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7735
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7736
    __ mulw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7737
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7738
            as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7739
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7740
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7741
  ins_pipe(imul_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7742
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7743
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7744
instruct smulI(iRegLNoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7745
  match(Set dst (MulL (ConvI2L src1) (ConvI2L src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7746
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7747
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7748
  format %{ "smull  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7749
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7750
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7751
    __ smull(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7752
             as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7753
             as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7754
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7755
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7756
  ins_pipe(imul_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7757
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7758
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7759
// Long Multiply
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7760
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7761
instruct mulL(iRegLNoSp dst, iRegL src1, iRegL src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7762
  match(Set dst (MulL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7763
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7764
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7765
  format %{ "mul  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7766
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7767
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7768
    __ mul(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7769
           as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7770
           as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7771
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7772
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7773
  ins_pipe(lmul_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7774
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7775
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7776
instruct mulHiL_rReg(iRegLNoSp dst, iRegL src1, iRegL src2, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7777
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7778
  match(Set dst (MulHiL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7779
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7780
  ins_cost(INSN_COST * 7);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7781
  format %{ "smulh   $dst, $src1, $src2, \t# mulhi" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7782
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7783
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7784
    __ smulh(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7785
             as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7786
             as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7787
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7788
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7789
  ins_pipe(lmul_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7790
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7791
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7792
// Combined Integer Multiply & Add/Sub
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7793
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7794
instruct maddI(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2, iRegIorL2I src3) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7795
  match(Set dst (AddI src3 (MulI src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7796
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7797
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7798
  format %{ "madd  $dst, $src1, $src2, $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7799
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7800
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7801
    __ maddw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7802
             as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7803
             as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7804
             as_Register($src3$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7805
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7806
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7807
  ins_pipe(imac_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7808
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7809
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7810
instruct msubI(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2, iRegIorL2I src3) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7811
  match(Set dst (SubI src3 (MulI src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7812
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7813
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7814
  format %{ "msub  $dst, $src1, $src2, $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7815
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7816
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7817
    __ msubw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7818
             as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7819
             as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7820
             as_Register($src3$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7821
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7822
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7823
  ins_pipe(imac_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7824
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7825
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7826
// Combined Long Multiply & Add/Sub
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7827
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7828
instruct maddL(iRegLNoSp dst, iRegL src1, iRegL src2, iRegL src3) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7829
  match(Set dst (AddL src3 (MulL src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7830
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7831
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7832
  format %{ "madd  $dst, $src1, $src2, $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7833
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7834
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7835
    __ madd(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7836
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7837
            as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7838
            as_Register($src3$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7839
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7840
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7841
  ins_pipe(lmac_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7842
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7843
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7844
instruct msubL(iRegLNoSp dst, iRegL src1, iRegL src2, iRegL src3) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7845
  match(Set dst (SubL src3 (MulL src1 src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7846
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7847
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7848
  format %{ "msub  $dst, $src1, $src2, $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7849
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7850
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7851
    __ msub(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7852
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7853
            as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7854
            as_Register($src3$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7855
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7856
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7857
  ins_pipe(lmac_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7858
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7859
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7860
// Integer Divide
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7861
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7862
instruct divI(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7863
  match(Set dst (DivI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7864
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7865
  ins_cost(INSN_COST * 19);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7866
  format %{ "sdivw  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7867
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7868
  ins_encode(aarch64_enc_divw(dst, src1, src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7869
  ins_pipe(idiv_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7870
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7871
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7872
instruct signExtract(iRegINoSp dst, iRegI src1, immI_31 div1, immI_31 div2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7873
  match(Set dst (URShiftI (RShiftI src1 div1) div2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7874
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7875
  format %{ "lsrw $dst, $src1, $div1" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7876
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7877
    __ lsrw(as_Register($dst$$reg), as_Register($src1$$reg), 31);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7878
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7879
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7880
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7881
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7882
instruct div2Round(iRegINoSp dst, iRegI src, immI_31 div1, immI_31 div2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7883
  match(Set dst (AddI src (URShiftI (RShiftI src div1) div2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7884
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7885
  format %{ "addw $dst, $src, LSR $div1" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7886
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7887
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7888
    __ addw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7889
              as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7890
              as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7891
              Assembler::LSR, 31);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7892
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7893
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7894
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7895
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7896
// Long Divide
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7897
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7898
instruct divL(iRegLNoSp dst, iRegL src1, iRegL src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7899
  match(Set dst (DivL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7900
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7901
  ins_cost(INSN_COST * 35);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7902
  format %{ "sdiv   $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7903
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7904
  ins_encode(aarch64_enc_div(dst, src1, src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7905
  ins_pipe(ldiv_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7906
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7907
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7908
instruct signExtractL(iRegLNoSp dst, iRegL src1, immL_63 div1, immL_63 div2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7909
  match(Set dst (URShiftL (RShiftL src1 div1) div2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7910
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7911
  format %{ "lsr $dst, $src1, $div1" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7912
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7913
    __ lsr(as_Register($dst$$reg), as_Register($src1$$reg), 63);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7914
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7915
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7916
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7917
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7918
instruct div2RoundL(iRegLNoSp dst, iRegL src, immL_63 div1, immL_63 div2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7919
  match(Set dst (AddL src (URShiftL (RShiftL src div1) div2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7920
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7921
  format %{ "add $dst, $src, $div1" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7922
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7923
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7924
    __ add(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7925
              as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7926
              as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7927
              Assembler::LSR, 63);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7928
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7929
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7930
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7931
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7932
// Integer Remainder
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7933
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7934
instruct modI(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7935
  match(Set dst (ModI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7936
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7937
  ins_cost(INSN_COST * 22);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7938
  format %{ "sdivw  rscratch1, $src1, $src2\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7939
            "msubw($dst, rscratch1, $src2, $src1" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7940
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7941
  ins_encode(aarch64_enc_modw(dst, src1, src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7942
  ins_pipe(idiv_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7943
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7944
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7945
// Long Remainder
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7946
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7947
instruct modL(iRegLNoSp dst, iRegL src1, iRegL src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7948
  match(Set dst (ModL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7949
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7950
  ins_cost(INSN_COST * 38);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7951
  format %{ "sdiv   rscratch1, $src1, $src2\n"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7952
            "msub($dst, rscratch1, $src2, $src1" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7953
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7954
  ins_encode(aarch64_enc_mod(dst, src1, src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7955
  ins_pipe(ldiv_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7956
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7957
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7958
// Integer Shifts
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7959
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7960
// Shift Left Register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7961
instruct lShiftI_reg_reg(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7962
  match(Set dst (LShiftI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7963
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7964
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7965
  format %{ "lslvw  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7966
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7967
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7968
    __ lslvw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7969
             as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7970
             as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7971
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7972
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7973
  ins_pipe(ialu_reg_reg_vshift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7974
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7975
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7976
// Shift Left Immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7977
instruct lShiftI_reg_imm(iRegINoSp dst, iRegIorL2I src1, immI src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7978
  match(Set dst (LShiftI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7979
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7980
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7981
  format %{ "lslw $dst, $src1, ($src2 & 0x1f)" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7982
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7983
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7984
    __ lslw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7985
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7986
            $src2$$constant & 0x1f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7987
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7988
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7989
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7990
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7991
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7992
// Shift Right Logical Register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7993
instruct urShiftI_reg_reg(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7994
  match(Set dst (URShiftI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7995
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7996
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7997
  format %{ "lsrvw  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7998
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  7999
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8000
    __ lsrvw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8001
             as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8002
             as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8003
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8004
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8005
  ins_pipe(ialu_reg_reg_vshift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8006
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8007
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8008
// Shift Right Logical Immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8009
instruct urShiftI_reg_imm(iRegINoSp dst, iRegIorL2I src1, immI src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8010
  match(Set dst (URShiftI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8011
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8012
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8013
  format %{ "lsrw $dst, $src1, ($src2 & 0x1f)" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8014
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8015
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8016
    __ lsrw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8017
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8018
            $src2$$constant & 0x1f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8019
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8020
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8021
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8022
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8023
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8024
// Shift Right Arithmetic Register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8025
instruct rShiftI_reg_reg(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8026
  match(Set dst (RShiftI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8027
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8028
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8029
  format %{ "asrvw  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8030
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8031
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8032
    __ asrvw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8033
             as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8034
             as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8035
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8036
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8037
  ins_pipe(ialu_reg_reg_vshift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8038
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8039
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8040
// Shift Right Arithmetic Immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8041
instruct rShiftI_reg_imm(iRegINoSp dst, iRegIorL2I src1, immI src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8042
  match(Set dst (RShiftI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8043
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8044
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8045
  format %{ "asrw $dst, $src1, ($src2 & 0x1f)" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8046
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8047
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8048
    __ asrw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8049
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8050
            $src2$$constant & 0x1f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8051
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8052
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8053
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8054
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8055
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8056
// Combined Int Mask and Right Shift (using UBFM)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8057
// TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8058
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8059
// Long Shifts
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8060
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8061
// Shift Left Register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8062
instruct lShiftL_reg_reg(iRegLNoSp dst, iRegL src1, iRegIorL2I src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8063
  match(Set dst (LShiftL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8064
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8065
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8066
  format %{ "lslv  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8067
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8068
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8069
    __ lslv(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8070
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8071
            as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8072
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8073
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8074
  ins_pipe(ialu_reg_reg_vshift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8075
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8076
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8077
// Shift Left Immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8078
instruct lShiftL_reg_imm(iRegLNoSp dst, iRegL src1, immI src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8079
  match(Set dst (LShiftL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8080
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8081
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8082
  format %{ "lsl $dst, $src1, ($src2 & 0x3f)" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8083
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8084
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8085
    __ lsl(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8086
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8087
            $src2$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8088
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8089
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8090
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8091
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8092
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8093
// Shift Right Logical Register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8094
instruct urShiftL_reg_reg(iRegLNoSp dst, iRegL src1, iRegIorL2I src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8095
  match(Set dst (URShiftL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8096
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8097
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8098
  format %{ "lsrv  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8099
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8100
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8101
    __ lsrv(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8102
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8103
            as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8104
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8105
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8106
  ins_pipe(ialu_reg_reg_vshift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8107
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8108
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8109
// Shift Right Logical Immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8110
instruct urShiftL_reg_imm(iRegLNoSp dst, iRegL src1, immI src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8111
  match(Set dst (URShiftL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8112
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8113
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8114
  format %{ "lsr $dst, $src1, ($src2 & 0x3f)" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8115
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8116
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8117
    __ lsr(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8118
           as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8119
           $src2$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8120
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8121
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8122
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8123
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8124
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8125
// A special-case pattern for card table stores.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8126
instruct urShiftP_reg_imm(iRegLNoSp dst, iRegP src1, immI src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8127
  match(Set dst (URShiftL (CastP2X src1) src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8128
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8129
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8130
  format %{ "lsr $dst, p2x($src1), ($src2 & 0x3f)" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8131
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8132
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8133
    __ lsr(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8134
           as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8135
           $src2$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8136
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8137
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8138
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8139
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8140
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8141
// Shift Right Arithmetic Register
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8142
instruct rShiftL_reg_reg(iRegLNoSp dst, iRegL src1, iRegIorL2I src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8143
  match(Set dst (RShiftL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8144
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8145
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8146
  format %{ "asrv  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8147
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8148
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8149
    __ asrv(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8150
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8151
            as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8152
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8153
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8154
  ins_pipe(ialu_reg_reg_vshift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8155
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8156
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8157
// Shift Right Arithmetic Immediate
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8158
instruct rShiftL_reg_imm(iRegLNoSp dst, iRegL src1, immI src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8159
  match(Set dst (RShiftL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8160
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8161
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8162
  format %{ "asr $dst, $src1, ($src2 & 0x3f)" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8163
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8164
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8165
    __ asr(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8166
           as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8167
           $src2$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8168
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8169
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8170
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8171
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8172
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8173
// BEGIN This section of the file is automatically generated. Do not edit --------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8174
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8175
instruct regL_not_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8176
                         iRegL src1, immL_M1 m1,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8177
                         rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8178
  match(Set dst (XorL src1 m1));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8179
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8180
  format %{ "eon  $dst, $src1, zr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8181
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8182
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8183
    __ eon(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8184
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8185
              zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8186
              Assembler::LSL, 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8187
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8188
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8189
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8190
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8191
instruct regI_not_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8192
                         iRegI src1, immI_M1 m1,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8193
                         rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8194
  match(Set dst (XorI src1 m1));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8195
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8196
  format %{ "eonw  $dst, $src1, zr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8197
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8198
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8199
    __ eonw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8200
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8201
              zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8202
              Assembler::LSL, 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8203
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8204
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8205
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8206
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8207
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8208
instruct AndI_reg_not_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8209
                         iRegI src1, iRegI src2, immI_M1 m1,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8210
                         rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8211
  match(Set dst (AndI src1 (XorI src2 m1)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8212
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8213
  format %{ "bic  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8214
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8215
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8216
    __ bic(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8217
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8218
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8219
              Assembler::LSL, 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8220
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8221
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8222
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8223
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8224
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8225
instruct AndL_reg_not_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8226
                         iRegL src1, iRegL src2, immL_M1 m1,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8227
                         rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8228
  match(Set dst (AndL src1 (XorL src2 m1)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8229
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8230
  format %{ "bic  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8231
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8232
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8233
    __ bic(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8234
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8235
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8236
              Assembler::LSL, 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8237
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8238
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8239
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8240
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8241
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8242
instruct OrI_reg_not_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8243
                         iRegI src1, iRegI src2, immI_M1 m1,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8244
                         rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8245
  match(Set dst (OrI src1 (XorI src2 m1)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8246
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8247
  format %{ "orn  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8248
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8249
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8250
    __ orn(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8251
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8252
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8253
              Assembler::LSL, 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8254
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8255
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8256
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8257
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8258
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8259
instruct OrL_reg_not_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8260
                         iRegL src1, iRegL src2, immL_M1 m1,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8261
                         rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8262
  match(Set dst (OrL src1 (XorL src2 m1)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8263
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8264
  format %{ "orn  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8265
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8266
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8267
    __ orn(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8268
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8269
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8270
              Assembler::LSL, 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8271
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8272
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8273
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8274
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8275
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8276
instruct XorI_reg_not_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8277
                         iRegI src1, iRegI src2, immI_M1 m1,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8278
                         rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8279
  match(Set dst (XorI m1 (XorI src2 src1)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8280
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8281
  format %{ "eon  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8282
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8283
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8284
    __ eon(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8285
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8286
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8287
              Assembler::LSL, 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8288
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8289
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8290
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8291
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8292
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8293
instruct XorL_reg_not_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8294
                         iRegL src1, iRegL src2, immL_M1 m1,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8295
                         rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8296
  match(Set dst (XorL m1 (XorL src2 src1)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8297
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8298
  format %{ "eon  $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8299
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8300
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8301
    __ eon(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8302
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8303
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8304
              Assembler::LSL, 0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8305
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8306
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8307
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8308
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8309
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8310
instruct AndI_reg_URShift_not_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8311
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8312
                         immI src3, immI_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8313
  match(Set dst (AndI src1 (XorI(URShiftI src2 src3) src4)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8314
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8315
  format %{ "bicw  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8316
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8317
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8318
    __ bicw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8319
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8320
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8321
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8322
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8323
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8324
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8325
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8326
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8327
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8328
instruct AndL_reg_URShift_not_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8329
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8330
                         immI src3, immL_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8331
  match(Set dst (AndL src1 (XorL(URShiftL src2 src3) src4)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8332
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8333
  format %{ "bic  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8334
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8335
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8336
    __ bic(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8337
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8338
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8339
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8340
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8341
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8342
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8343
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8344
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8345
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8346
instruct AndI_reg_RShift_not_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8347
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8348
                         immI src3, immI_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8349
  match(Set dst (AndI src1 (XorI(RShiftI src2 src3) src4)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8350
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8351
  format %{ "bicw  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8352
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8353
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8354
    __ bicw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8355
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8356
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8357
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8358
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8359
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8360
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8361
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8362
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8363
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8364
instruct AndL_reg_RShift_not_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8365
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8366
                         immI src3, immL_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8367
  match(Set dst (AndL src1 (XorL(RShiftL src2 src3) src4)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8368
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8369
  format %{ "bic  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8370
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8371
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8372
    __ bic(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8373
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8374
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8375
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8376
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8377
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8378
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8379
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8380
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8381
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8382
instruct AndI_reg_LShift_not_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8383
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8384
                         immI src3, immI_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8385
  match(Set dst (AndI src1 (XorI(LShiftI src2 src3) src4)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8386
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8387
  format %{ "bicw  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8388
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8389
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8390
    __ bicw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8391
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8392
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8393
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8394
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8395
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8396
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8397
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8398
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8399
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8400
instruct AndL_reg_LShift_not_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8401
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8402
                         immI src3, immL_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8403
  match(Set dst (AndL src1 (XorL(LShiftL src2 src3) src4)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8404
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8405
  format %{ "bic  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8406
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8407
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8408
    __ bic(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8409
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8410
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8411
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8412
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8413
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8414
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8415
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8416
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8417
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8418
instruct XorI_reg_URShift_not_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8419
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8420
                         immI src3, immI_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8421
  match(Set dst (XorI src4 (XorI(URShiftI src2 src3) src1)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8422
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8423
  format %{ "eonw  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8424
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8425
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8426
    __ eonw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8427
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8428
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8429
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8430
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8431
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8432
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8433
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8434
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8435
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8436
instruct XorL_reg_URShift_not_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8437
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8438
                         immI src3, immL_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8439
  match(Set dst (XorL src4 (XorL(URShiftL src2 src3) src1)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8440
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8441
  format %{ "eon  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8442
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8443
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8444
    __ eon(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8445
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8446
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8447
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8448
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8449
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8450
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8451
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8452
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8453
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8454
instruct XorI_reg_RShift_not_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8455
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8456
                         immI src3, immI_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8457
  match(Set dst (XorI src4 (XorI(RShiftI src2 src3) src1)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8458
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8459
  format %{ "eonw  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8460
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8461
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8462
    __ eonw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8463
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8464
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8465
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8466
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8467
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8468
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8469
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8470
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8471
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8472
instruct XorL_reg_RShift_not_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8473
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8474
                         immI src3, immL_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8475
  match(Set dst (XorL src4 (XorL(RShiftL src2 src3) src1)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8476
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8477
  format %{ "eon  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8478
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8479
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8480
    __ eon(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8481
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8482
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8483
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8484
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8485
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8486
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8487
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8488
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8489
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8490
instruct XorI_reg_LShift_not_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8491
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8492
                         immI src3, immI_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8493
  match(Set dst (XorI src4 (XorI(LShiftI src2 src3) src1)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8494
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8495
  format %{ "eonw  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8496
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8497
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8498
    __ eonw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8499
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8500
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8501
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8502
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8503
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8504
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8505
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8506
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8507
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8508
instruct XorL_reg_LShift_not_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8509
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8510
                         immI src3, immL_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8511
  match(Set dst (XorL src4 (XorL(LShiftL src2 src3) src1)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8512
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8513
  format %{ "eon  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8514
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8515
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8516
    __ eon(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8517
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8518
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8519
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8520
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8521
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8522
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8523
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8524
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8525
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8526
instruct OrI_reg_URShift_not_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8527
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8528
                         immI src3, immI_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8529
  match(Set dst (OrI src1 (XorI(URShiftI src2 src3) src4)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8530
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8531
  format %{ "ornw  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8532
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8533
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8534
    __ ornw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8535
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8536
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8537
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8538
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8539
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8540
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8541
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8542
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8543
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8544
instruct OrL_reg_URShift_not_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8545
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8546
                         immI src3, immL_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8547
  match(Set dst (OrL src1 (XorL(URShiftL src2 src3) src4)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8548
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8549
  format %{ "orn  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8550
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8551
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8552
    __ orn(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8553
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8554
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8555
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8556
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8557
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8558
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8559
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8560
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8561
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8562
instruct OrI_reg_RShift_not_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8563
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8564
                         immI src3, immI_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8565
  match(Set dst (OrI src1 (XorI(RShiftI src2 src3) src4)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8566
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8567
  format %{ "ornw  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8568
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8569
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8570
    __ ornw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8571
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8572
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8573
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8574
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8575
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8576
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8577
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8578
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8579
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8580
instruct OrL_reg_RShift_not_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8581
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8582
                         immI src3, immL_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8583
  match(Set dst (OrL src1 (XorL(RShiftL src2 src3) src4)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8584
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8585
  format %{ "orn  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8586
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8587
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8588
    __ orn(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8589
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8590
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8591
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8592
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8593
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8594
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8595
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8596
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8597
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8598
instruct OrI_reg_LShift_not_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8599
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8600
                         immI src3, immI_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8601
  match(Set dst (OrI src1 (XorI(LShiftI src2 src3) src4)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8602
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8603
  format %{ "ornw  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8604
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8605
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8606
    __ ornw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8607
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8608
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8609
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8610
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8611
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8612
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8613
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8614
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8615
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8616
instruct OrL_reg_LShift_not_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8617
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8618
                         immI src3, immL_M1 src4, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8619
  match(Set dst (OrL src1 (XorL(LShiftL src2 src3) src4)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8620
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8621
  format %{ "orn  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8622
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8623
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8624
    __ orn(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8625
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8626
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8627
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8628
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8629
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8630
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8631
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8632
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8633
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8634
instruct AndI_reg_URShift_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8635
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8636
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8637
  match(Set dst (AndI src1 (URShiftI src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8638
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8639
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8640
  format %{ "andw  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8641
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8642
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8643
    __ andw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8644
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8645
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8646
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8647
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8648
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8649
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8650
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8651
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8652
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8653
instruct AndL_reg_URShift_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8654
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8655
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8656
  match(Set dst (AndL src1 (URShiftL src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8657
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8658
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8659
  format %{ "andr  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8660
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8661
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8662
    __ andr(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8663
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8664
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8665
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8666
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8667
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8668
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8669
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8670
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8671
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8672
instruct AndI_reg_RShift_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8673
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8674
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8675
  match(Set dst (AndI src1 (RShiftI src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8676
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8677
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8678
  format %{ "andw  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8679
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8680
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8681
    __ andw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8682
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8683
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8684
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8685
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8686
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8687
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8688
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8689
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8690
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8691
instruct AndL_reg_RShift_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8692
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8693
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8694
  match(Set dst (AndL src1 (RShiftL src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8695
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8696
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8697
  format %{ "andr  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8698
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8699
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8700
    __ andr(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8701
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8702
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8703
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8704
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8705
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8706
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8707
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8708
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8709
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8710
instruct AndI_reg_LShift_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8711
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8712
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8713
  match(Set dst (AndI src1 (LShiftI src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8714
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8715
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8716
  format %{ "andw  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8717
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8718
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8719
    __ andw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8720
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8721
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8722
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8723
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8724
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8725
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8726
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8727
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8728
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8729
instruct AndL_reg_LShift_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8730
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8731
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8732
  match(Set dst (AndL src1 (LShiftL src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8733
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8734
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8735
  format %{ "andr  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8736
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8737
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8738
    __ andr(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8739
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8740
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8741
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8742
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8743
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8744
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8745
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8746
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8747
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8748
instruct XorI_reg_URShift_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8749
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8750
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8751
  match(Set dst (XorI src1 (URShiftI src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8752
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8753
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8754
  format %{ "eorw  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8755
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8756
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8757
    __ eorw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8758
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8759
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8760
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8761
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8762
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8763
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8764
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8765
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8766
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8767
instruct XorL_reg_URShift_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8768
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8769
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8770
  match(Set dst (XorL src1 (URShiftL src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8771
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8772
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8773
  format %{ "eor  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8774
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8775
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8776
    __ eor(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8777
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8778
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8779
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8780
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8781
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8782
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8783
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8784
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8785
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8786
instruct XorI_reg_RShift_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8787
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8788
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8789
  match(Set dst (XorI src1 (RShiftI src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8790
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8791
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8792
  format %{ "eorw  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8793
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8794
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8795
    __ eorw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8796
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8797
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8798
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8799
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8800
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8801
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8802
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8803
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8804
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8805
instruct XorL_reg_RShift_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8806
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8807
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8808
  match(Set dst (XorL src1 (RShiftL src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8809
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8810
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8811
  format %{ "eor  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8812
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8813
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8814
    __ eor(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8815
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8816
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8817
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8818
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8819
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8820
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8821
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8822
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8823
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8824
instruct XorI_reg_LShift_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8825
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8826
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8827
  match(Set dst (XorI src1 (LShiftI src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8828
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8829
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8830
  format %{ "eorw  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8831
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8832
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8833
    __ eorw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8834
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8835
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8836
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8837
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8838
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8839
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8840
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8841
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8842
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8843
instruct XorL_reg_LShift_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8844
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8845
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8846
  match(Set dst (XorL src1 (LShiftL src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8847
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8848
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8849
  format %{ "eor  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8850
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8851
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8852
    __ eor(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8853
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8854
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8855
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8856
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8857
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8858
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8859
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8860
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8861
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8862
instruct OrI_reg_URShift_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8863
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8864
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8865
  match(Set dst (OrI src1 (URShiftI src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8866
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8867
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8868
  format %{ "orrw  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8869
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8870
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8871
    __ orrw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8872
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8873
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8874
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8875
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8876
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8877
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8878
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8879
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8880
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8881
instruct OrL_reg_URShift_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8882
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8883
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8884
  match(Set dst (OrL src1 (URShiftL src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8885
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8886
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8887
  format %{ "orr  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8888
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8889
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8890
    __ orr(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8891
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8892
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8893
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8894
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8895
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8896
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8897
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8898
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8899
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8900
instruct OrI_reg_RShift_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8901
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8902
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8903
  match(Set dst (OrI src1 (RShiftI src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8904
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8905
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8906
  format %{ "orrw  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8907
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8908
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8909
    __ orrw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8910
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8911
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8912
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8913
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8914
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8915
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8916
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8917
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8918
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8919
instruct OrL_reg_RShift_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8920
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8921
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8922
  match(Set dst (OrL src1 (RShiftL src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8923
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8924
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8925
  format %{ "orr  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8926
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8927
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8928
    __ orr(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8929
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8930
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8931
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8932
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8933
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8934
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8935
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8936
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8937
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8938
instruct OrI_reg_LShift_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8939
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8940
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8941
  match(Set dst (OrI src1 (LShiftI src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8942
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8943
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8944
  format %{ "orrw  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8945
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8946
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8947
    __ orrw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8948
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8949
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8950
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8951
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8952
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8953
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8954
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8955
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8956
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8957
instruct OrL_reg_LShift_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8958
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8959
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8960
  match(Set dst (OrL src1 (LShiftL src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8961
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8962
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8963
  format %{ "orr  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8964
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8965
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8966
    __ orr(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8967
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8968
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8969
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8970
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8971
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8972
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8973
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8974
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8975
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8976
instruct AddI_reg_URShift_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8977
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8978
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8979
  match(Set dst (AddI src1 (URShiftI src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8980
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8981
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8982
  format %{ "addw  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8983
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8984
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8985
    __ addw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8986
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8987
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8988
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8989
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8990
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8991
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8992
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8993
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8994
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8995
instruct AddL_reg_URShift_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8996
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8997
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8998
  match(Set dst (AddL src1 (URShiftL src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  8999
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9000
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9001
  format %{ "add  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9002
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9003
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9004
    __ add(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9005
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9006
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9007
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9008
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9009
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9010
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9011
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9012
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9013
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9014
instruct AddI_reg_RShift_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9015
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9016
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9017
  match(Set dst (AddI src1 (RShiftI src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9018
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9019
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9020
  format %{ "addw  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9021
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9022
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9023
    __ addw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9024
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9025
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9026
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9027
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9028
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9029
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9030
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9031
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9032
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9033
instruct AddL_reg_RShift_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9034
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9035
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9036
  match(Set dst (AddL src1 (RShiftL src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9037
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9038
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9039
  format %{ "add  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9040
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9041
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9042
    __ add(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9043
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9044
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9045
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9046
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9047
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9048
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9049
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9050
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9051
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9052
instruct AddI_reg_LShift_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9053
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9054
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9055
  match(Set dst (AddI src1 (LShiftI src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9056
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9057
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9058
  format %{ "addw  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9059
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9060
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9061
    __ addw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9062
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9063
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9064
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9065
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9066
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9067
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9068
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9069
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9070
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9071
instruct AddL_reg_LShift_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9072
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9073
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9074
  match(Set dst (AddL src1 (LShiftL src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9075
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9076
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9077
  format %{ "add  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9078
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9079
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9080
    __ add(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9081
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9082
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9083
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9084
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9085
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9086
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9087
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9088
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9089
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9090
instruct SubI_reg_URShift_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9091
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9092
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9093
  match(Set dst (SubI src1 (URShiftI src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9094
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9095
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9096
  format %{ "subw  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9097
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9098
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9099
    __ subw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9100
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9101
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9102
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9103
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9104
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9105
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9106
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9107
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9108
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9109
instruct SubL_reg_URShift_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9110
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9111
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9112
  match(Set dst (SubL src1 (URShiftL src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9113
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9114
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9115
  format %{ "sub  $dst, $src1, $src2, LSR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9116
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9117
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9118
    __ sub(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9119
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9120
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9121
              Assembler::LSR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9122
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9123
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9124
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9125
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9126
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9127
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9128
instruct SubI_reg_RShift_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9129
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9130
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9131
  match(Set dst (SubI src1 (RShiftI src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9132
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9133
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9134
  format %{ "subw  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9135
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9136
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9137
    __ subw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9138
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9139
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9140
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9141
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9142
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9143
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9144
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9145
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9146
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9147
instruct SubL_reg_RShift_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9148
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9149
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9150
  match(Set dst (SubL src1 (RShiftL src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9151
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9152
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9153
  format %{ "sub  $dst, $src1, $src2, ASR $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9154
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9155
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9156
    __ sub(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9157
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9158
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9159
              Assembler::ASR,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9160
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9161
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9162
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9163
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9164
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9165
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9166
instruct SubI_reg_LShift_reg(iRegINoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9167
                         iRegI src1, iRegI src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9168
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9169
  match(Set dst (SubI src1 (LShiftI src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9170
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9171
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9172
  format %{ "subw  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9173
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9174
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9175
    __ subw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9176
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9177
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9178
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9179
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9180
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9181
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9182
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9183
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9185
instruct SubL_reg_LShift_reg(iRegLNoSp dst,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9186
                         iRegL src1, iRegL src2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9187
                         immI src3, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9188
  match(Set dst (SubL src1 (LShiftL src2 src3)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9189
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9190
  ins_cost(1.9 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9191
  format %{ "sub  $dst, $src1, $src2, LSL $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9192
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9193
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9194
    __ sub(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9195
              as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9196
              as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9197
              Assembler::LSL,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9198
              $src3$$constant & 0x3f);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9199
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9200
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9201
  ins_pipe(ialu_reg_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9202
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9203
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9204
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9205
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9206
// Shift Left followed by Shift Right.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9207
// This idiom is used by the compiler for the i2b bytecode etc.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9208
instruct sbfmL(iRegLNoSp dst, iRegL src, immI lshift_count, immI rshift_count)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9209
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9210
  match(Set dst (RShiftL (LShiftL src lshift_count) rshift_count));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9211
  // Make sure we are not going to exceed what sbfm can do.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9212
  predicate((unsigned int)n->in(2)->get_int() <= 63
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9213
            && (unsigned int)n->in(1)->in(2)->get_int() <= 63);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9214
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9215
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9216
  format %{ "sbfm  $dst, $src, $rshift_count - $lshift_count, #63 - $lshift_count" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9217
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9218
    int lshift = $lshift_count$$constant, rshift = $rshift_count$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9219
    int s = 63 - lshift;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9220
    int r = (rshift - lshift) & 63;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9221
    __ sbfm(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9222
            as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9223
            r, s);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9224
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9225
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9226
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9227
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9228
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9229
// Shift Left followed by Shift Right.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9230
// This idiom is used by the compiler for the i2b bytecode etc.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9231
instruct sbfmwI(iRegINoSp dst, iRegI src, immI lshift_count, immI rshift_count)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9232
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9233
  match(Set dst (RShiftI (LShiftI src lshift_count) rshift_count));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9234
  // Make sure we are not going to exceed what sbfmw can do.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9235
  predicate((unsigned int)n->in(2)->get_int() <= 31
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9236
            && (unsigned int)n->in(1)->in(2)->get_int() <= 31);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9237
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9238
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9239
  format %{ "sbfmw  $dst, $src, $rshift_count - $lshift_count, #31 - $lshift_count" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9240
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9241
    int lshift = $lshift_count$$constant, rshift = $rshift_count$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9242
    int s = 31 - lshift;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9243
    int r = (rshift - lshift) & 31;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9244
    __ sbfmw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9245
            as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9246
            r, s);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9247
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9248
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9249
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9250
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9251
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9252
// Shift Left followed by Shift Right.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9253
// This idiom is used by the compiler for the i2b bytecode etc.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9254
instruct ubfmL(iRegLNoSp dst, iRegL src, immI lshift_count, immI rshift_count)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9255
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9256
  match(Set dst (URShiftL (LShiftL src lshift_count) rshift_count));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9257
  // Make sure we are not going to exceed what ubfm can do.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9258
  predicate((unsigned int)n->in(2)->get_int() <= 63
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9259
            && (unsigned int)n->in(1)->in(2)->get_int() <= 63);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9260
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9261
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9262
  format %{ "ubfm  $dst, $src, $rshift_count - $lshift_count, #63 - $lshift_count" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9263
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9264
    int lshift = $lshift_count$$constant, rshift = $rshift_count$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9265
    int s = 63 - lshift;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9266
    int r = (rshift - lshift) & 63;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9267
    __ ubfm(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9268
            as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9269
            r, s);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9270
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9271
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9272
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9273
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9274
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9275
// Shift Left followed by Shift Right.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9276
// This idiom is used by the compiler for the i2b bytecode etc.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9277
instruct ubfmwI(iRegINoSp dst, iRegI src, immI lshift_count, immI rshift_count)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9278
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9279
  match(Set dst (URShiftI (LShiftI src lshift_count) rshift_count));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9280
  // Make sure we are not going to exceed what ubfmw can do.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9281
  predicate((unsigned int)n->in(2)->get_int() <= 31
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9282
            && (unsigned int)n->in(1)->in(2)->get_int() <= 31);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9283
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9284
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9285
  format %{ "ubfmw  $dst, $src, $rshift_count - $lshift_count, #31 - $lshift_count" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9286
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9287
    int lshift = $lshift_count$$constant, rshift = $rshift_count$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9288
    int s = 31 - lshift;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9289
    int r = (rshift - lshift) & 31;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9290
    __ ubfmw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9291
            as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9292
            r, s);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9293
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9294
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9295
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9296
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9297
// Bitfield extract with shift & mask
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9298
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9299
instruct ubfxwI(iRegINoSp dst, iRegI src, immI rshift, immI_bitmask mask)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9300
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9301
  match(Set dst (AndI (URShiftI src rshift) mask));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9302
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9303
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9304
  format %{ "ubfxw $dst, $src, $mask" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9305
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9306
    int rshift = $rshift$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9307
    long mask = $mask$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9308
    int width = exact_log2(mask+1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9309
    __ ubfxw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9310
            as_Register($src$$reg), rshift, width);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9311
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9312
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9313
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9314
instruct ubfxL(iRegLNoSp dst, iRegL src, immI rshift, immL_bitmask mask)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9315
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9316
  match(Set dst (AndL (URShiftL src rshift) mask));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9317
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9318
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9319
  format %{ "ubfx $dst, $src, $mask" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9320
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9321
    int rshift = $rshift$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9322
    long mask = $mask$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9323
    int width = exact_log2(mask+1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9324
    __ ubfx(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9325
            as_Register($src$$reg), rshift, width);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9326
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9327
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9328
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9329
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9330
// We can use ubfx when extending an And with a mask when we know mask
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9331
// is positive.  We know that because immI_bitmask guarantees it.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9332
instruct ubfxIConvI2L(iRegLNoSp dst, iRegIorL2I src, immI rshift, immI_bitmask mask)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9333
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9334
  match(Set dst (ConvI2L (AndI (URShiftI src rshift) mask)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9335
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9336
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9337
  format %{ "ubfx $dst, $src, $mask" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9338
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9339
    int rshift = $rshift$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9340
    long mask = $mask$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9341
    int width = exact_log2(mask+1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9342
    __ ubfx(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9343
            as_Register($src$$reg), rshift, width);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9344
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9345
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9346
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9347
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9348
// Rotations
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9349
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9350
instruct extrOrL(iRegLNoSp dst, iRegL src1, iRegL src2, immI lshift, immI rshift, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9351
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9352
  match(Set dst (OrL (LShiftL src1 lshift) (URShiftL src2 rshift)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9353
  predicate(0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 63));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9354
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9355
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9356
  format %{ "extr $dst, $src1, $src2, #$rshift" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9357
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9358
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9359
    __ extr(as_Register($dst$$reg), as_Register($src1$$reg), as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9360
            $rshift$$constant & 63);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9361
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9362
  ins_pipe(ialu_reg_reg_extr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9363
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9364
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9365
instruct extrOrI(iRegINoSp dst, iRegI src1, iRegI src2, immI lshift, immI rshift, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9366
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9367
  match(Set dst (OrI (LShiftI src1 lshift) (URShiftI src2 rshift)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9368
  predicate(0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 31));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9369
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9370
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9371
  format %{ "extr $dst, $src1, $src2, #$rshift" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9372
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9373
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9374
    __ extrw(as_Register($dst$$reg), as_Register($src1$$reg), as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9375
            $rshift$$constant & 31);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9376
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9377
  ins_pipe(ialu_reg_reg_extr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9378
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9379
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9380
instruct extrAddL(iRegLNoSp dst, iRegL src1, iRegL src2, immI lshift, immI rshift, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9381
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9382
  match(Set dst (AddL (LShiftL src1 lshift) (URShiftL src2 rshift)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9383
  predicate(0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 63));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9384
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9385
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9386
  format %{ "extr $dst, $src1, $src2, #$rshift" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9387
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9388
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9389
    __ extr(as_Register($dst$$reg), as_Register($src1$$reg), as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9390
            $rshift$$constant & 63);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9391
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9392
  ins_pipe(ialu_reg_reg_extr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9393
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9394
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9395
instruct extrAddI(iRegINoSp dst, iRegI src1, iRegI src2, immI lshift, immI rshift, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9396
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9397
  match(Set dst (AddI (LShiftI src1 lshift) (URShiftI src2 rshift)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9398
  predicate(0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 31));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9399
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9400
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9401
  format %{ "extr $dst, $src1, $src2, #$rshift" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9402
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9403
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9404
    __ extrw(as_Register($dst$$reg), as_Register($src1$$reg), as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9405
            $rshift$$constant & 31);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9406
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9407
  ins_pipe(ialu_reg_reg_extr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9408
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9409
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9410
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9411
// rol expander
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9412
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  9413
instruct rolL_rReg(iRegLNoSp dst, iRegL src, iRegI shift, rFlagsReg cr)
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9414
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9415
  effect(DEF dst, USE src, USE shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9416
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9417
  format %{ "rol    $dst, $src, $shift" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9418
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9419
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9420
    __ subw(rscratch1, zr, as_Register($shift$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9421
    __ rorv(as_Register($dst$$reg), as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9422
            rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9423
    %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9424
  ins_pipe(ialu_reg_reg_vshift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9425
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9426
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9427
// rol expander
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9428
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  9429
instruct rolI_rReg(iRegINoSp dst, iRegI src, iRegI shift, rFlagsReg cr)
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9430
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9431
  effect(DEF dst, USE src, USE shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9432
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9433
  format %{ "rol    $dst, $src, $shift" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9434
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9435
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9436
    __ subw(rscratch1, zr, as_Register($shift$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9437
    __ rorvw(as_Register($dst$$reg), as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9438
            rscratch1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9439
    %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9440
  ins_pipe(ialu_reg_reg_vshift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9441
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9442
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  9443
instruct rolL_rReg_Var_C_64(iRegLNoSp dst, iRegL src, iRegI shift, immI_64 c_64, rFlagsReg cr)
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9444
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9445
  match(Set dst (OrL (LShiftL src shift) (URShiftL src (SubI c_64 shift))));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9446
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9447
  expand %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9448
    rolL_rReg(dst, src, shift, cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9449
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9450
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9451
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  9452
instruct rolL_rReg_Var_C0(iRegLNoSp dst, iRegL src, iRegI shift, immI0 c0, rFlagsReg cr)
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9453
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9454
  match(Set dst (OrL (LShiftL src shift) (URShiftL src (SubI c0 shift))));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9455
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9456
  expand %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9457
    rolL_rReg(dst, src, shift, cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9458
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9459
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9460
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  9461
instruct rolI_rReg_Var_C_32(iRegLNoSp dst, iRegL src, iRegI shift, immI_32 c_32, rFlagsReg cr)
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9462
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9463
  match(Set dst (OrI (LShiftI src shift) (URShiftI src (SubI c_32 shift))));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9464
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9465
  expand %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9466
    rolL_rReg(dst, src, shift, cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9467
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9468
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9469
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  9470
instruct rolI_rReg_Var_C0(iRegLNoSp dst, iRegL src, iRegI shift, immI0 c0, rFlagsReg cr)
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9471
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9472
  match(Set dst (OrI (LShiftI src shift) (URShiftI src (SubI c0 shift))));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9473
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9474
  expand %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9475
    rolL_rReg(dst, src, shift, cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9476
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9477
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9478
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9479
// ror expander
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9480
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  9481
instruct rorL_rReg(iRegLNoSp dst, iRegL src, iRegI shift, rFlagsReg cr)
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9482
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9483
  effect(DEF dst, USE src, USE shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9484
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9485
  format %{ "ror    $dst, $src, $shift" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9486
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9487
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9488
    __ rorv(as_Register($dst$$reg), as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9489
            as_Register($shift$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9490
    %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9491
  ins_pipe(ialu_reg_reg_vshift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9492
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9493
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9494
// ror expander
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9495
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  9496
instruct rorI_rReg(iRegINoSp dst, iRegI src, iRegI shift, rFlagsReg cr)
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9497
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9498
  effect(DEF dst, USE src, USE shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9499
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9500
  format %{ "ror    $dst, $src, $shift" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9501
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9502
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9503
    __ rorvw(as_Register($dst$$reg), as_Register($src$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9504
            as_Register($shift$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9505
    %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9506
  ins_pipe(ialu_reg_reg_vshift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9507
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9508
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  9509
instruct rorL_rReg_Var_C_64(iRegLNoSp dst, iRegL src, iRegI shift, immI_64 c_64, rFlagsReg cr)
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9510
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9511
  match(Set dst (OrL (URShiftL src shift) (LShiftL src (SubI c_64 shift))));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9512
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9513
  expand %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9514
    rorL_rReg(dst, src, shift, cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9515
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9516
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9517
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  9518
instruct rorL_rReg_Var_C0(iRegLNoSp dst, iRegL src, iRegI shift, immI0 c0, rFlagsReg cr)
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9519
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9520
  match(Set dst (OrL (URShiftL src shift) (LShiftL src (SubI c0 shift))));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9521
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9522
  expand %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9523
    rorL_rReg(dst, src, shift, cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9524
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9525
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9526
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  9527
instruct rorI_rReg_Var_C_32(iRegLNoSp dst, iRegL src, iRegI shift, immI_32 c_32, rFlagsReg cr)
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9528
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9529
  match(Set dst (OrI (URShiftI src shift) (LShiftI src (SubI c_32 shift))));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9530
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9531
  expand %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9532
    rorL_rReg(dst, src, shift, cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9533
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9534
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9535
29190
9917b8aed927 8072483: AARCH64: aarch64.ad uses the wrong operand class for some operations
aph
parents: 29184
diff changeset
  9536
instruct rorI_rReg_Var_C0(iRegLNoSp dst, iRegL src, iRegI shift, immI0 c0, rFlagsReg cr)
29184
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9537
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9538
  match(Set dst (OrI (URShiftI src shift) (LShiftI src (SubI c0 shift))));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9539
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9540
  expand %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9541
    rorL_rReg(dst, src, shift, cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9542
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9543
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9544
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9545
// Add/subtract (extended)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9546
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9547
instruct AddExtI(iRegLNoSp dst, iRegL src1, iRegIorL2I src2, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9548
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9549
  match(Set dst (AddL src1 (ConvI2L src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9550
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9551
  format %{ "add  $dst, $src1, sxtw $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9552
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9553
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9554
     __ add(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9555
            as_Register($src2$$reg), ext::sxtw);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9556
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9557
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9558
%};
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9559
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9560
instruct SubExtI(iRegLNoSp dst, iRegL src1, iRegIorL2I src2, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9561
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9562
  match(Set dst (SubL src1 (ConvI2L src2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9563
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9564
  format %{ "sub  $dst, $src1, sxtw $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9565
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9566
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9567
     __ sub(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9568
            as_Register($src2$$reg), ext::sxtw);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9569
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9570
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9571
%};
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9572
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9573
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9574
instruct AddExtI_sxth(iRegINoSp dst, iRegI src1, iRegI src2, immI_16 lshift, immI_16 rshift, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9575
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9576
  match(Set dst (AddI src1 (RShiftI (LShiftI src2 lshift) rshift)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9577
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9578
  format %{ "add  $dst, $src1, sxth $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9579
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9580
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9581
     __ add(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9582
            as_Register($src2$$reg), ext::sxth);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9583
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9584
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9585
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9586
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9587
instruct AddExtI_sxtb(iRegINoSp dst, iRegI src1, iRegI src2, immI_24 lshift, immI_24 rshift, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9588
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9589
  match(Set dst (AddI src1 (RShiftI (LShiftI src2 lshift) rshift)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9590
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9591
  format %{ "add  $dst, $src1, sxtb $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9592
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9593
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9594
     __ add(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9595
            as_Register($src2$$reg), ext::sxtb);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9596
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9597
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9598
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9599
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9600
instruct AddExtI_uxtb(iRegINoSp dst, iRegI src1, iRegI src2, immI_24 lshift, immI_24 rshift, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9601
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9602
  match(Set dst (AddI src1 (URShiftI (LShiftI src2 lshift) rshift)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9603
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9604
  format %{ "add  $dst, $src1, uxtb $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9605
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9606
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9607
     __ add(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9608
            as_Register($src2$$reg), ext::uxtb);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9609
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9610
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9611
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9612
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9613
instruct AddExtL_sxth(iRegLNoSp dst, iRegL src1, iRegL src2, immI_48 lshift, immI_48 rshift, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9614
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9615
  match(Set dst (AddL src1 (RShiftL (LShiftL src2 lshift) rshift)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9616
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9617
  format %{ "add  $dst, $src1, sxth $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9618
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9619
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9620
     __ add(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9621
            as_Register($src2$$reg), ext::sxth);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9622
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9623
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9624
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9625
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9626
instruct AddExtL_sxtw(iRegLNoSp dst, iRegL src1, iRegL src2, immI_32 lshift, immI_32 rshift, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9627
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9628
  match(Set dst (AddL src1 (RShiftL (LShiftL src2 lshift) rshift)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9629
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9630
  format %{ "add  $dst, $src1, sxtw $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9631
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9632
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9633
     __ add(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9634
            as_Register($src2$$reg), ext::sxtw);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9635
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9636
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9637
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9638
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9639
instruct AddExtL_sxtb(iRegLNoSp dst, iRegL src1, iRegL src2, immI_56 lshift, immI_56 rshift, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9640
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9641
  match(Set dst (AddL src1 (RShiftL (LShiftL src2 lshift) rshift)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9642
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9643
  format %{ "add  $dst, $src1, sxtb $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9644
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9645
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9646
     __ add(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9647
            as_Register($src2$$reg), ext::sxtb);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9648
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9649
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9650
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9651
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9652
instruct AddExtL_uxtb(iRegLNoSp dst, iRegL src1, iRegL src2, immI_56 lshift, immI_56 rshift, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9653
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9654
  match(Set dst (AddL src1 (URShiftL (LShiftL src2 lshift) rshift)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9655
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9656
  format %{ "add  $dst, $src1, uxtb $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9657
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9658
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9659
     __ add(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9660
            as_Register($src2$$reg), ext::uxtb);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9661
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9662
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9663
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9664
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9665
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9666
instruct AddExtI_uxtb_and(iRegINoSp dst, iRegI src1, iRegI src2, immI_255 mask, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9667
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9668
  match(Set dst (AddI src1 (AndI src2 mask)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9669
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9670
  format %{ "addw  $dst, $src1, $src2, uxtb" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9671
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9672
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9673
     __ addw(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9674
            as_Register($src2$$reg), ext::uxtb);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9675
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9676
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9677
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9678
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9679
instruct AddExtI_uxth_and(iRegINoSp dst, iRegI src1, iRegI src2, immI_65535 mask, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9680
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9681
  match(Set dst (AddI src1 (AndI src2 mask)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9682
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9683
  format %{ "addw  $dst, $src1, $src2, uxth" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9684
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9685
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9686
     __ addw(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9687
            as_Register($src2$$reg), ext::uxth);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9688
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9689
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9690
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9691
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9692
instruct AddExtL_uxtb_and(iRegLNoSp dst, iRegL src1, iRegL src2, immL_255 mask, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9693
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9694
  match(Set dst (AddL src1 (AndL src2 mask)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9695
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9696
  format %{ "add  $dst, $src1, $src2, uxtb" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9697
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9698
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9699
     __ add(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9700
            as_Register($src2$$reg), ext::uxtb);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9701
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9702
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9703
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9704
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9705
instruct AddExtL_uxth_and(iRegLNoSp dst, iRegL src1, iRegL src2, immL_65535 mask, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9706
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9707
  match(Set dst (AddL src1 (AndL src2 mask)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9708
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9709
  format %{ "add  $dst, $src1, $src2, uxth" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9710
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9711
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9712
     __ add(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9713
            as_Register($src2$$reg), ext::uxth);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9714
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9715
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9716
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9717
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9718
instruct AddExtL_uxtw_and(iRegLNoSp dst, iRegL src1, iRegL src2, immL_4294967295 mask, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9719
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9720
  match(Set dst (AddL src1 (AndL src2 mask)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9721
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9722
  format %{ "add  $dst, $src1, $src2, uxtw" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9723
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9724
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9725
     __ add(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9726
            as_Register($src2$$reg), ext::uxtw);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9727
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9728
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9729
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9730
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9731
instruct SubExtI_uxtb_and(iRegINoSp dst, iRegI src1, iRegI src2, immI_255 mask, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9732
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9733
  match(Set dst (SubI src1 (AndI src2 mask)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9734
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9735
  format %{ "subw  $dst, $src1, $src2, uxtb" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9736
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9737
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9738
     __ subw(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9739
            as_Register($src2$$reg), ext::uxtb);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9740
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9741
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9742
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9743
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9744
instruct SubExtI_uxth_and(iRegINoSp dst, iRegI src1, iRegI src2, immI_65535 mask, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9745
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9746
  match(Set dst (SubI src1 (AndI src2 mask)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9747
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9748
  format %{ "subw  $dst, $src1, $src2, uxth" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9749
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9750
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9751
     __ subw(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9752
            as_Register($src2$$reg), ext::uxth);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9753
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9754
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9755
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9756
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9757
instruct SubExtL_uxtb_and(iRegLNoSp dst, iRegL src1, iRegL src2, immL_255 mask, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9758
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9759
  match(Set dst (SubL src1 (AndL src2 mask)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9760
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9761
  format %{ "sub  $dst, $src1, $src2, uxtb" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9762
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9763
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9764
     __ sub(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9765
            as_Register($src2$$reg), ext::uxtb);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9766
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9767
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9768
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9769
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9770
instruct SubExtL_uxth_and(iRegLNoSp dst, iRegL src1, iRegL src2, immL_65535 mask, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9771
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9772
  match(Set dst (SubL src1 (AndL src2 mask)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9773
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9774
  format %{ "sub  $dst, $src1, $src2, uxth" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9775
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9776
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9777
     __ sub(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9778
            as_Register($src2$$reg), ext::uxth);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9779
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9780
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9781
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9782
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9783
instruct SubExtL_uxtw_and(iRegLNoSp dst, iRegL src1, iRegL src2, immL_4294967295 mask, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9784
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9785
  match(Set dst (SubL src1 (AndL src2 mask)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9786
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9787
  format %{ "sub  $dst, $src1, $src2, uxtw" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9788
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9789
   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9790
     __ sub(as_Register($dst$$reg), as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9791
            as_Register($src2$$reg), ext::uxtw);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9792
   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9793
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9794
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9795
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9796
// END This section of the file is automatically generated. Do not edit --------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9797
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9798
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9799
// Floating Point Arithmetic Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9800
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9801
instruct addF_reg_reg(vRegF dst, vRegF src1, vRegF src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9802
  match(Set dst (AddF src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9803
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9804
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9805
  format %{ "fadds   $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9806
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9807
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9808
    __ fadds(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9809
             as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9810
             as_FloatRegister($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9811
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9812
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9813
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9814
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9815
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9816
instruct addD_reg_reg(vRegD dst, vRegD src1, vRegD src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9817
  match(Set dst (AddD src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9818
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9819
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9820
  format %{ "faddd   $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9821
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9822
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9823
    __ faddd(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9824
             as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9825
             as_FloatRegister($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9826
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9827
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9828
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9829
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9830
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9831
instruct subF_reg_reg(vRegF dst, vRegF src1, vRegF src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9832
  match(Set dst (SubF src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9833
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9834
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9835
  format %{ "fsubs   $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9836
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9837
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9838
    __ fsubs(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9839
             as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9840
             as_FloatRegister($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9841
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9842
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9843
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9844
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9845
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9846
instruct subD_reg_reg(vRegD dst, vRegD src1, vRegD src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9847
  match(Set dst (SubD src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9848
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9849
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9850
  format %{ "fsubd   $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9851
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9852
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9853
    __ fsubd(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9854
             as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9855
             as_FloatRegister($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9856
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9857
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9858
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9859
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9860
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9861
instruct mulF_reg_reg(vRegF dst, vRegF src1, vRegF src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9862
  match(Set dst (MulF src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9863
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9864
  ins_cost(INSN_COST * 6);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9865
  format %{ "fmuls   $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9866
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9867
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9868
    __ fmuls(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9869
             as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9870
             as_FloatRegister($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9871
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9872
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9873
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9874
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9875
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9876
instruct mulD_reg_reg(vRegD dst, vRegD src1, vRegD src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9877
  match(Set dst (MulD src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9878
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9879
  ins_cost(INSN_COST * 6);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9880
  format %{ "fmuld   $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9881
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9882
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9883
    __ fmuld(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9884
             as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9885
             as_FloatRegister($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9886
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9887
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9888
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9889
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9890
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9891
// We cannot use these fused mul w add/sub ops because they don't
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9892
// produce the same result as the equivalent separated ops
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9893
// (essentially they don't round the intermediate result). that's a
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9894
// shame. leaving them here in case we can idenitfy cases where it is
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9895
// legitimate to use them
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9896
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9897
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9898
// instruct maddF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9899
//   match(Set dst (AddF (MulF src1 src2) src3));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9900
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9901
//   format %{ "fmadds   $dst, $src1, $src2, $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9902
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9903
//   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9904
//     __ fmadds(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9905
//              as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9906
//              as_FloatRegister($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9907
//              as_FloatRegister($src3$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9908
//   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9909
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9910
//   ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9911
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9912
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9913
// instruct maddD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9914
//   match(Set dst (AddD (MulD src1 src2) src3));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9915
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9916
//   format %{ "fmaddd   $dst, $src1, $src2, $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9917
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9918
//   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9919
//     __ fmaddd(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9920
//              as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9921
//              as_FloatRegister($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9922
//              as_FloatRegister($src3$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9923
//   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9924
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9925
//   ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9926
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9927
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9928
// instruct msubF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9929
//   match(Set dst (AddF (MulF (NegF src1) src2) src3));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9930
//   match(Set dst (AddF (NegF (MulF src1 src2)) src3));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9931
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9932
//   format %{ "fmsubs   $dst, $src1, $src2, $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9933
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9934
//   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9935
//     __ fmsubs(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9936
//               as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9937
//               as_FloatRegister($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9938
//              as_FloatRegister($src3$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9939
//   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9940
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9941
//   ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9942
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9943
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9944
// instruct msubD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9945
//   match(Set dst (AddD (MulD (NegD src1) src2) src3));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9946
//   match(Set dst (AddD (NegD (MulD src1 src2)) src3));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9947
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9948
//   format %{ "fmsubd   $dst, $src1, $src2, $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9949
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9950
//   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9951
//     __ fmsubd(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9952
//               as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9953
//               as_FloatRegister($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9954
//               as_FloatRegister($src3$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9955
//   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9956
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9957
//   ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9958
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9959
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9960
// instruct mnaddF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9961
//   match(Set dst (SubF (MulF (NegF src1) src2) src3));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9962
//   match(Set dst (SubF (NegF (MulF src1 src2)) src3));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9963
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9964
//   format %{ "fnmadds  $dst, $src1, $src2, $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9965
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9966
//   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9967
//     __ fnmadds(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9968
//                as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9969
//                as_FloatRegister($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9970
//                as_FloatRegister($src3$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9971
//   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9972
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9973
//   ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9974
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9975
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9976
// instruct mnaddD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9977
//   match(Set dst (SubD (MulD (NegD src1) src2) src3));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9978
//   match(Set dst (SubD (NegD (MulD src1 src2)) src3));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9979
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9980
//   format %{ "fnmaddd   $dst, $src1, $src2, $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9981
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9982
//   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9983
//     __ fnmaddd(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9984
//                as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9985
//                as_FloatRegister($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9986
//                as_FloatRegister($src3$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9987
//   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9988
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9989
//   ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9990
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9991
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9992
// instruct mnsubF_reg_reg(vRegF dst, vRegF src1, vRegF src2, vRegF src3, immF0 zero) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9993
//   match(Set dst (SubF (MulF src1 src2) src3));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9994
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9995
//   format %{ "fnmsubs  $dst, $src1, $src2, $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9996
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9997
//   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9998
//     __ fnmsubs(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
  9999
//                as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10000
//                as_FloatRegister($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10001
//                as_FloatRegister($src3$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10002
//   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10003
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10004
//   ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10005
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10006
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10007
// instruct mnsubD_reg_reg(vRegD dst, vRegD src1, vRegD src2, vRegD src3, immD0 zero) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10008
//   match(Set dst (SubD (MulD src1 src2) src3));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10009
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10010
//   format %{ "fnmsubd   $dst, $src1, $src2, $src3" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10011
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10012
//   ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10013
//   // n.b. insn name should be fnmsubd
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10014
//     __ fnmsub(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10015
//                as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10016
//                as_FloatRegister($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10017
//                as_FloatRegister($src3$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10018
//   %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10019
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10020
//   ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10021
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10022
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10023
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10024
instruct divF_reg_reg(vRegF dst, vRegF src1, vRegF src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10025
  match(Set dst (DivF src1  src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10026
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10027
  ins_cost(INSN_COST * 18);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10028
  format %{ "fdivs   $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10029
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10030
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10031
    __ fdivs(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10032
             as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10033
             as_FloatRegister($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10034
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10035
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10036
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10037
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10038
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10039
instruct divD_reg_reg(vRegD dst, vRegD src1, vRegD src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10040
  match(Set dst (DivD src1  src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10041
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10042
  ins_cost(INSN_COST * 32);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10043
  format %{ "fdivd   $dst, $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10044
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10045
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10046
    __ fdivd(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10047
             as_FloatRegister($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10048
             as_FloatRegister($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10049
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10050
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10051
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10052
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10053
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10054
instruct negF_reg_reg(vRegF dst, vRegF src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10055
  match(Set dst (NegF src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10056
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10057
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10058
  format %{ "fneg   $dst, $src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10059
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10060
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10061
    __ fnegs(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10062
             as_FloatRegister($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10063
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10064
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10065
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10066
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10067
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10068
instruct negD_reg_reg(vRegD dst, vRegD src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10069
  match(Set dst (NegD src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10070
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10071
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10072
  format %{ "fnegd   $dst, $src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10073
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10074
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10075
    __ fnegd(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10076
             as_FloatRegister($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10077
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10078
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10079
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10080
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10081
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10082
instruct absF_reg(vRegF dst, vRegF src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10083
  match(Set dst (AbsF src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10084
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10085
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10086
  format %{ "fabss   $dst, $src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10087
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10088
    __ fabss(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10089
             as_FloatRegister($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10090
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10091
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10092
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10093
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10094
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10095
instruct absD_reg(vRegD dst, vRegD src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10096
  match(Set dst (AbsD src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10097
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10098
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10099
  format %{ "fabsd   $dst, $src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10100
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10101
    __ fabsd(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10102
             as_FloatRegister($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10103
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10104
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10105
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10106
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10107
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10108
instruct sqrtD_reg(vRegD dst, vRegD src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10109
  match(Set dst (SqrtD src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10110
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10111
  ins_cost(INSN_COST * 50);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10112
  format %{ "fsqrtd  $dst, $src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10113
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10114
    __ fsqrtd(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10115
             as_FloatRegister($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10116
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10117
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10118
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10119
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10120
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10121
instruct sqrtF_reg(vRegF dst, vRegF src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10122
  match(Set dst (ConvD2F (SqrtD (ConvF2D src))));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10123
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10124
  ins_cost(INSN_COST * 50);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10125
  format %{ "fsqrts  $dst, $src" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10126
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10127
    __ fsqrts(as_FloatRegister($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10128
             as_FloatRegister($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10129
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10130
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10131
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10132
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10133
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10134
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10135
// Logical Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10136
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10137
// Integer Logical Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10138
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10139
// And Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10140
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10141
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10142
instruct andI_reg_reg(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10143
  match(Set dst (AndI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10144
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10145
  format %{ "andw  $dst, $src1, $src2\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10146
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10147
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10148
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10149
    __ andw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10150
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10151
            as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10152
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10153
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10154
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10155
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10156
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10157
instruct andI_reg_imm(iRegINoSp dst, iRegIorL2I src1, immILog src2, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10158
  match(Set dst (AndI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10159
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10160
  format %{ "andsw  $dst, $src1, $src2\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10161
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10162
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10163
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10164
    __ andw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10165
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10166
            (unsigned long)($src2$$constant));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10167
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10168
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10169
  ins_pipe(ialu_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10170
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10171
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10172
// Or Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10173
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10174
instruct orI_reg_reg(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10175
  match(Set dst (OrI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10176
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10177
  format %{ "orrw  $dst, $src1, $src2\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10178
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10179
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10180
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10181
    __ orrw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10182
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10183
            as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10184
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10185
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10186
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10187
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10188
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10189
instruct orI_reg_imm(iRegINoSp dst, iRegIorL2I src1, immILog src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10190
  match(Set dst (OrI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10191
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10192
  format %{ "orrw  $dst, $src1, $src2\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10193
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10194
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10195
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10196
    __ orrw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10197
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10198
            (unsigned long)($src2$$constant));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10199
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10200
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10201
  ins_pipe(ialu_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10202
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10203
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10204
// Xor Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10205
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10206
instruct xorI_reg_reg(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10207
  match(Set dst (XorI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10208
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10209
  format %{ "eorw  $dst, $src1, $src2\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10210
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10211
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10212
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10213
    __ eorw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10214
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10215
            as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10216
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10217
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10218
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10219
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10220
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10221
instruct xorI_reg_imm(iRegINoSp dst, iRegIorL2I src1, immILog src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10222
  match(Set dst (XorI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10223
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10224
  format %{ "eorw  $dst, $src1, $src2\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10225
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10226
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10227
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10228
    __ eorw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10229
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10230
            (unsigned long)($src2$$constant));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10231
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10232
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10233
  ins_pipe(ialu_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10234
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10235
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10236
// Long Logical Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10237
// TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10238
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10239
instruct andL_reg_reg(iRegLNoSp dst, iRegL src1, iRegL src2, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10240
  match(Set dst (AndL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10241
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10242
  format %{ "and  $dst, $src1, $src2\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10243
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10244
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10245
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10246
    __ andr(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10247
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10248
            as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10249
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10250
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10251
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10252
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10253
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10254
instruct andL_reg_imm(iRegLNoSp dst, iRegL src1, immLLog src2, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10255
  match(Set dst (AndL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10256
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10257
  format %{ "and  $dst, $src1, $src2\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10258
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10259
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10260
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10261
    __ andr(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10262
            as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10263
            (unsigned long)($src2$$constant));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10264
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10265
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10266
  ins_pipe(ialu_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10267
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10268
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10269
// Or Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10270
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10271
instruct orL_reg_reg(iRegLNoSp dst, iRegL src1, iRegL src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10272
  match(Set dst (OrL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10273
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10274
  format %{ "orr  $dst, $src1, $src2\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10275
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10276
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10277
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10278
    __ orr(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10279
           as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10280
           as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10281
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10282
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10283
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10284
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10285
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10286
instruct orL_reg_imm(iRegLNoSp dst, iRegL src1, immLLog src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10287
  match(Set dst (OrL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10288
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10289
  format %{ "orr  $dst, $src1, $src2\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10290
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10291
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10292
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10293
    __ orr(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10294
           as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10295
           (unsigned long)($src2$$constant));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10296
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10297
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10298
  ins_pipe(ialu_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10299
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10300
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10301
// Xor Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10302
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10303
instruct xorL_reg_reg(iRegLNoSp dst, iRegL src1, iRegL src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10304
  match(Set dst (XorL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10305
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10306
  format %{ "eor  $dst, $src1, $src2\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10307
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10308
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10309
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10310
    __ eor(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10311
           as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10312
           as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10313
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10314
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10315
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10316
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10317
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10318
instruct xorL_reg_imm(iRegLNoSp dst, iRegL src1, immLLog src2) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10319
  match(Set dst (XorL src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10320
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10321
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10322
  format %{ "eor  $dst, $src1, $src2\t# int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10323
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10324
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10325
    __ eor(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10326
           as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10327
           (unsigned long)($src2$$constant));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10328
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10329
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10330
  ins_pipe(ialu_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10331
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10332
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10333
instruct convI2L_reg_reg(iRegLNoSp dst, iRegIorL2I src)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10334
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10335
  match(Set dst (ConvI2L src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10336
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10337
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10338
  format %{ "sxtw  $dst, $src\t# i2l" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10339
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10340
    __ sbfm($dst$$Register, $src$$Register, 0, 31);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10341
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10342
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10343
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10344
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10345
// this pattern occurs in bigmath arithmetic
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10346
instruct convUI2L_reg_reg(iRegLNoSp dst, iRegI src, immL_32bits mask)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10347
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10348
  match(Set dst (AndL (ConvI2L src) mask));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10349
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10350
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10351
  format %{ "ubfm  $dst, $src, 0, 31\t# ui2l" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10352
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10353
    __ ubfm($dst$$Register, $src$$Register, 0, 31);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10354
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10355
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10356
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10357
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10358
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10359
instruct convL2I_reg(iRegINoSp dst, iRegL src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10360
  match(Set dst (ConvL2I src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10361
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10362
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10363
  format %{ "movw  $dst, $src \t// l2i" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10364
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10365
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10366
    __ movw(as_Register($dst$$reg), as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10367
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10368
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10369
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10370
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10371
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10372
instruct convI2B(iRegINoSp dst, iRegI src, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10373
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10374
  match(Set dst (Conv2B src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10375
  effect(KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10376
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10377
  format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10378
    "cmpw $src, zr\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10379
    "cset $dst, ne"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10380
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10381
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10382
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10383
    __ cmpw(as_Register($src$$reg), zr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10384
    __ cset(as_Register($dst$$reg), Assembler::NE);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10385
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10386
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10387
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10388
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10389
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10390
instruct convP2B(iRegINoSp dst, iRegP src, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10391
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10392
  match(Set dst (Conv2B src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10393
  effect(KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10394
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10395
  format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10396
    "cmp  $src, zr\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10397
    "cset $dst, ne"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10398
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10399
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10400
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10401
    __ cmp(as_Register($src$$reg), zr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10402
    __ cset(as_Register($dst$$reg), Assembler::NE);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10403
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10404
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10405
  ins_pipe(ialu_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10406
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10407
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10408
instruct convD2F_reg(vRegF dst, vRegD src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10409
  match(Set dst (ConvD2F src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10410
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10411
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10412
  format %{ "fcvtd  $dst, $src \t// d2f" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10413
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10414
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10415
    __ fcvtd(as_FloatRegister($dst$$reg), as_FloatRegister($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10416
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10417
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10418
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10419
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10420
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10421
instruct convF2D_reg(vRegD dst, vRegF src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10422
  match(Set dst (ConvF2D src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10423
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10424
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10425
  format %{ "fcvts  $dst, $src \t// f2d" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10426
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10427
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10428
    __ fcvts(as_FloatRegister($dst$$reg), as_FloatRegister($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10429
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10430
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10431
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10432
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10433
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10434
instruct convF2I_reg_reg(iRegINoSp dst, vRegF src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10435
  match(Set dst (ConvF2I src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10436
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10437
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10438
  format %{ "fcvtzsw  $dst, $src \t// f2i" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10439
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10440
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10441
    __ fcvtzsw(as_Register($dst$$reg), as_FloatRegister($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10442
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10443
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10444
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10445
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10446
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10447
instruct convF2L_reg_reg(iRegLNoSp dst, vRegF src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10448
  match(Set dst (ConvF2L src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10449
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10450
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10451
  format %{ "fcvtzs  $dst, $src \t// f2l" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10452
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10453
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10454
    __ fcvtzs(as_Register($dst$$reg), as_FloatRegister($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10455
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10456
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10457
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10458
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10459
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10460
instruct convI2F_reg_reg(vRegF dst, iRegI src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10461
  match(Set dst (ConvI2F src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10462
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10463
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10464
  format %{ "scvtfws  $dst, $src \t// i2f" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10465
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10466
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10467
    __ scvtfws(as_FloatRegister($dst$$reg), as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10468
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10469
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10470
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10471
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10472
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10473
instruct convL2F_reg_reg(vRegF dst, iRegL src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10474
  match(Set dst (ConvL2F src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10475
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10476
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10477
  format %{ "scvtfs  $dst, $src \t// l2f" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10478
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10479
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10480
    __ scvtfs(as_FloatRegister($dst$$reg), as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10481
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10482
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10483
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10484
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10485
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10486
instruct convD2I_reg_reg(iRegINoSp dst, vRegD src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10487
  match(Set dst (ConvD2I src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10488
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10489
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10490
  format %{ "fcvtzdw  $dst, $src \t// d2i" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10491
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10492
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10493
    __ fcvtzdw(as_Register($dst$$reg), as_FloatRegister($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10494
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10495
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10496
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10497
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10498
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10499
instruct convD2L_reg_reg(iRegLNoSp dst, vRegD src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10500
  match(Set dst (ConvD2L src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10501
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10502
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10503
  format %{ "fcvtzd  $dst, $src \t// d2l" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10504
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10505
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10506
    __ fcvtzd(as_Register($dst$$reg), as_FloatRegister($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10507
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10508
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10509
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10510
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10511
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10512
instruct convI2D_reg_reg(vRegD dst, iRegI src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10513
  match(Set dst (ConvI2D src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10514
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10515
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10516
  format %{ "scvtfwd  $dst, $src \t// i2d" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10517
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10518
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10519
    __ scvtfwd(as_FloatRegister($dst$$reg), as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10520
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10521
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10522
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10523
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10524
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10525
instruct convL2D_reg_reg(vRegD dst, iRegL src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10526
  match(Set dst (ConvL2D src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10527
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10528
  ins_cost(INSN_COST * 5);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10529
  format %{ "scvtfd  $dst, $src \t// l2d" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10530
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10531
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10532
    __ scvtfd(as_FloatRegister($dst$$reg), as_Register($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10533
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10534
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10535
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10536
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10537
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10538
// stack <-> reg and reg <-> reg shuffles with no conversion
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10539
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10540
instruct MoveF2I_stack_reg(iRegINoSp dst, stackSlotF src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10541
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10542
  match(Set dst (MoveF2I src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10543
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10544
  effect(DEF dst, USE src);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10545
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10546
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10547
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10548
  format %{ "ldrw $dst, $src\t# MoveF2I_stack_reg" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10549
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10550
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10551
    __ ldrw($dst$$Register, Address(sp, $src$$disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10552
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10553
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10554
  ins_pipe(iload_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10555
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10556
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10557
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10558
instruct MoveI2F_stack_reg(vRegF dst, stackSlotI src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10559
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10560
  match(Set dst (MoveI2F src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10561
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10562
  effect(DEF dst, USE src);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10563
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10564
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10565
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10566
  format %{ "ldrs $dst, $src\t# MoveI2F_stack_reg" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10567
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10568
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10569
    __ ldrs(as_FloatRegister($dst$$reg), Address(sp, $src$$disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10570
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10571
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10572
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10573
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10574
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10575
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10576
instruct MoveD2L_stack_reg(iRegLNoSp dst, stackSlotD src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10577
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10578
  match(Set dst (MoveD2L src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10579
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10580
  effect(DEF dst, USE src);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10581
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10582
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10583
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10584
  format %{ "ldr $dst, $src\t# MoveD2L_stack_reg" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10585
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10586
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10587
    __ ldr($dst$$Register, Address(sp, $src$$disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10588
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10589
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10590
  ins_pipe(iload_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10591
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10592
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10593
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10594
instruct MoveL2D_stack_reg(vRegD dst, stackSlotL src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10595
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10596
  match(Set dst (MoveL2D src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10597
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10598
  effect(DEF dst, USE src);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10599
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10600
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10601
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10602
  format %{ "ldrd $dst, $src\t# MoveL2D_stack_reg" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10603
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10604
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10605
    __ ldrd(as_FloatRegister($dst$$reg), Address(sp, $src$$disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10606
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10607
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10608
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10609
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10610
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10611
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10612
instruct MoveF2I_reg_stack(stackSlotI dst, vRegF src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10613
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10614
  match(Set dst (MoveF2I src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10615
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10616
  effect(DEF dst, USE src);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10617
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10618
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10619
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10620
  format %{ "strs $src, $dst\t# MoveF2I_reg_stack" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10621
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10622
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10623
    __ strs(as_FloatRegister($src$$reg), Address(sp, $dst$$disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10624
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10625
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10626
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10627
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10628
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10629
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10630
instruct MoveI2F_reg_stack(stackSlotF dst, iRegI src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10631
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10632
  match(Set dst (MoveI2F src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10633
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10634
  effect(DEF dst, USE src);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10635
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10636
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10637
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10638
  format %{ "strw $src, $dst\t# MoveI2F_reg_stack" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10639
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10640
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10641
    __ strw($src$$Register, Address(sp, $dst$$disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10642
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10643
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10644
  ins_pipe(istore_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10645
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10646
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10647
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10648
instruct MoveD2L_reg_stack(stackSlotL dst, vRegD src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10649
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10650
  match(Set dst (MoveD2L src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10651
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10652
  effect(DEF dst, USE src);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10653
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10654
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10655
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10656
  format %{ "strd $dst, $src\t# MoveD2L_reg_stack" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10657
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10658
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10659
    __ strd(as_FloatRegister($src$$reg), Address(sp, $dst$$disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10660
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10661
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10662
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10663
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10664
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10665
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10666
instruct MoveL2D_reg_stack(stackSlotD dst, iRegL src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10667
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10668
  match(Set dst (MoveL2D src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10669
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10670
  effect(DEF dst, USE src);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10671
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10672
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10673
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10674
  format %{ "str $src, $dst\t# MoveL2D_reg_stack" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10675
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10676
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10677
    __ str($src$$Register, Address(sp, $dst$$disp));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10678
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10679
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10680
  ins_pipe(istore_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10681
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10682
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10683
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10684
instruct MoveF2I_reg_reg(iRegINoSp dst, vRegF src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10685
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10686
  match(Set dst (MoveF2I src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10687
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10688
  effect(DEF dst, USE src);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10689
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10690
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10691
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10692
  format %{ "fmovs $dst, $src\t# MoveF2I_reg_reg" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10693
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10694
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10695
    __ fmovs($dst$$Register, as_FloatRegister($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10696
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10697
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10698
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10699
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10700
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10701
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10702
instruct MoveI2F_reg_reg(vRegF dst, iRegI src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10703
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10704
  match(Set dst (MoveI2F src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10705
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10706
  effect(DEF dst, USE src);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10707
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10708
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10709
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10710
  format %{ "fmovs $dst, $src\t# MoveI2F_reg_reg" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10711
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10712
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10713
    __ fmovs(as_FloatRegister($dst$$reg), $src$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10714
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10715
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10716
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10717
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10718
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10719
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10720
instruct MoveD2L_reg_reg(iRegLNoSp dst, vRegD src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10721
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10722
  match(Set dst (MoveD2L src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10723
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10724
  effect(DEF dst, USE src);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10725
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10726
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10727
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10728
  format %{ "fmovd $dst, $src\t# MoveD2L_reg_reg" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10729
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10730
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10731
    __ fmovd($dst$$Register, as_FloatRegister($src$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10732
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10733
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10734
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10735
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10736
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10737
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10738
instruct MoveL2D_reg_reg(vRegD dst, iRegL src) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10739
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10740
  match(Set dst (MoveL2D src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10741
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10742
  effect(DEF dst, USE src);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10743
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10744
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10745
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10746
  format %{ "fmovd $dst, $src\t# MoveL2D_reg_reg" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10747
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10748
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10749
    __ fmovd(as_FloatRegister($dst$$reg), $src$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10750
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10751
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10752
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10753
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10754
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10755
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10756
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10757
// clearing of an array
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10758
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10759
instruct clearArray_reg_reg(iRegL_R11 cnt, iRegP_R10 base, Universe dummy, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10760
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10761
  match(Set dummy (ClearArray cnt base));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10762
  effect(USE_KILL cnt, USE_KILL base);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10763
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10764
  ins_cost(4 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10765
  format %{ "ClearArray $cnt, $base" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10766
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10767
  ins_encode(aarch64_enc_clear_array_reg_reg(cnt, base));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10768
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10769
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10770
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10771
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10772
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10773
// Overflow Math Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10774
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10775
instruct overflowAddI_reg_reg(rFlagsReg cr, iRegI op1, iRegI op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10776
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10777
  match(Set cr (OverflowAddI op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10778
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10779
  format %{ "cmnw  $op1, $op2\t# overflow check int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10780
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10781
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10782
    __ cmnw($op1$$Register, $op2$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10783
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10784
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10785
  ins_pipe(icmp_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10786
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10787
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10788
instruct overflowAddI_reg_imm(rFlagsReg cr, iRegI op1, immIAddSub op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10789
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10790
  match(Set cr (OverflowAddI op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10791
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10792
  format %{ "cmnw  $op1, $op2\t# overflow check int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10793
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10794
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10795
    __ cmnw($op1$$Register, $op2$$constant);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10796
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10797
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10798
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10799
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10800
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10801
instruct overflowAddL_reg_reg(rFlagsReg cr, iRegL op1, iRegL op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10802
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10803
  match(Set cr (OverflowAddL op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10804
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10805
  format %{ "cmn   $op1, $op2\t# overflow check long" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10806
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10807
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10808
    __ cmn($op1$$Register, $op2$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10809
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10810
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10811
  ins_pipe(icmp_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10812
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10813
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10814
instruct overflowAddL_reg_imm(rFlagsReg cr, iRegL op1, immLAddSub op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10815
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10816
  match(Set cr (OverflowAddL op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10817
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10818
  format %{ "cmn   $op1, $op2\t# overflow check long" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10819
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10820
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10821
    __ cmn($op1$$Register, $op2$$constant);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10822
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10823
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10824
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10825
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10826
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10827
instruct overflowSubI_reg_reg(rFlagsReg cr, iRegI op1, iRegI op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10828
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10829
  match(Set cr (OverflowSubI op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10830
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10831
  format %{ "cmpw  $op1, $op2\t# overflow check int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10832
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10833
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10834
    __ cmpw($op1$$Register, $op2$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10835
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10836
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10837
  ins_pipe(icmp_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10838
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10839
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10840
instruct overflowSubI_reg_imm(rFlagsReg cr, iRegI op1, immIAddSub op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10841
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10842
  match(Set cr (OverflowSubI op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10843
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10844
  format %{ "cmpw  $op1, $op2\t# overflow check int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10845
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10846
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10847
    __ cmpw($op1$$Register, $op2$$constant);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10848
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10849
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10850
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10851
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10852
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10853
instruct overflowSubL_reg_reg(rFlagsReg cr, iRegL op1, iRegL op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10854
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10855
  match(Set cr (OverflowSubL op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10856
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10857
  format %{ "cmp   $op1, $op2\t# overflow check long" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10858
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10859
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10860
    __ cmp($op1$$Register, $op2$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10861
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10862
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10863
  ins_pipe(icmp_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10864
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10865
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10866
instruct overflowSubL_reg_imm(rFlagsReg cr, iRegL op1, immLAddSub op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10867
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10868
  match(Set cr (OverflowSubL op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10869
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10870
  format %{ "cmp   $op1, $op2\t# overflow check long" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10871
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10872
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10873
    __ cmp($op1$$Register, $op2$$constant);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10874
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10875
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10876
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10877
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10878
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10879
instruct overflowNegI_reg(rFlagsReg cr, immI0 zero, iRegI op1)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10880
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10881
  match(Set cr (OverflowSubI zero op1));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10882
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10883
  format %{ "cmpw  zr, $op1\t# overflow check int" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10884
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10885
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10886
    __ cmpw(zr, $op1$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10887
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10888
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10889
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10890
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10891
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10892
instruct overflowNegL_reg(rFlagsReg cr, immI0 zero, iRegL op1)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10893
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10894
  match(Set cr (OverflowSubL zero op1));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10895
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10896
  format %{ "cmp   zr, $op1\t# overflow check long" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10897
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10898
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10899
    __ cmp(zr, $op1$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10900
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10901
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10902
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10903
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10904
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10905
instruct overflowMulI_reg(rFlagsReg cr, iRegI op1, iRegI op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10906
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10907
  match(Set cr (OverflowMulI op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10908
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10909
  format %{ "smull rscratch1, $op1, $op2\t# overflow check int\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10910
            "cmp   rscratch1, rscratch1, sxtw\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10911
            "movw  rscratch1, #0x80000000\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10912
            "cselw rscratch1, rscratch1, zr, NE\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10913
            "cmpw  rscratch1, #1" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10914
  ins_cost(5 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10915
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10916
    __ smull(rscratch1, $op1$$Register, $op2$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10917
    __ subs(zr, rscratch1, rscratch1, ext::sxtw);      // NE => overflow
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10918
    __ movw(rscratch1, 0x80000000);                    // Develop 0 (EQ),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10919
    __ cselw(rscratch1, rscratch1, zr, Assembler::NE); // or 0x80000000 (NE)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10920
    __ cmpw(rscratch1, 1);                             // 0x80000000 - 1 => VS
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10921
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10922
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10923
  ins_pipe(pipe_slow);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10924
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10925
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10926
instruct overflowMulI_reg_branch(cmpOp cmp, iRegI op1, iRegI op2, label labl, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10927
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10928
  match(If cmp (OverflowMulI op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10929
  predicate(n->in(1)->as_Bool()->_test._test == BoolTest::overflow
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10930
            || n->in(1)->as_Bool()->_test._test == BoolTest::no_overflow);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10931
  effect(USE labl, KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10932
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10933
  format %{ "smull rscratch1, $op1, $op2\t# overflow check int\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10934
            "cmp   rscratch1, rscratch1, sxtw\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10935
            "b$cmp   $labl" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10936
  ins_cost(3 * INSN_COST); // Branch is rare so treat as INSN_COST
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10937
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10938
    Label* L = $labl$$label;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10939
    Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10940
    __ smull(rscratch1, $op1$$Register, $op2$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10941
    __ subs(zr, rscratch1, rscratch1, ext::sxtw);      // NE => overflow
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10942
    __ br(cond == Assembler::VS ? Assembler::NE : Assembler::EQ, *L);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10943
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10944
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10945
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10946
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10947
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10948
instruct overflowMulL_reg(rFlagsReg cr, iRegL op1, iRegL op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10949
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10950
  match(Set cr (OverflowMulL op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10951
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10952
  format %{ "mul   rscratch1, $op1, $op2\t#overflow check long\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10953
            "smulh rscratch2, $op1, $op2\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10954
            "cmp   rscratch2, rscratch1, ASR #31\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10955
            "movw  rscratch1, #0x80000000\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10956
            "cselw rscratch1, rscratch1, zr, NE\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10957
            "cmpw  rscratch1, #1" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10958
  ins_cost(6 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10959
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10960
    __ mul(rscratch1, $op1$$Register, $op2$$Register);   // Result bits 0..63
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10961
    __ smulh(rscratch2, $op1$$Register, $op2$$Register); // Result bits 64..127
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10962
    __ cmp(rscratch2, rscratch1, Assembler::ASR, 31);    // Top is pure sign ext
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10963
    __ movw(rscratch1, 0x80000000);                    // Develop 0 (EQ),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10964
    __ cselw(rscratch1, rscratch1, zr, Assembler::NE); // or 0x80000000 (NE)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10965
    __ cmpw(rscratch1, 1);                             // 0x80000000 - 1 => VS
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10966
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10967
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10968
  ins_pipe(pipe_slow);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10969
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10970
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10971
instruct overflowMulL_reg_branch(cmpOp cmp, iRegL op1, iRegL op2, label labl, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10972
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10973
  match(If cmp (OverflowMulL op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10974
  predicate(n->in(1)->as_Bool()->_test._test == BoolTest::overflow
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10975
            || n->in(1)->as_Bool()->_test._test == BoolTest::no_overflow);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10976
  effect(USE labl, KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10977
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10978
  format %{ "mul   rscratch1, $op1, $op2\t#overflow check long\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10979
            "smulh rscratch2, $op1, $op2\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10980
            "cmp   rscratch2, rscratch1, ASR #31\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10981
            "b$cmp $labl" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10982
  ins_cost(4 * INSN_COST); // Branch is rare so treat as INSN_COST
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10983
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10984
    Label* L = $labl$$label;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10985
    Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10986
    __ mul(rscratch1, $op1$$Register, $op2$$Register);   // Result bits 0..63
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10987
    __ smulh(rscratch2, $op1$$Register, $op2$$Register); // Result bits 64..127
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10988
    __ cmp(rscratch2, rscratch1, Assembler::ASR, 31);    // Top is pure sign ext
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10989
    __ br(cond == Assembler::VS ? Assembler::NE : Assembler::EQ, *L);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10990
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10991
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10992
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10993
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10994
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10995
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10996
// Compare Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10997
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10998
instruct compI_reg_reg(rFlagsReg cr, iRegI op1, iRegI op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 10999
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11000
  match(Set cr (CmpI op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11001
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11002
  effect(DEF cr, USE op1, USE op2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11003
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11004
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11005
  format %{ "cmpw  $op1, $op2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11006
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11007
  ins_encode(aarch64_enc_cmpw(op1, op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11008
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11009
  ins_pipe(icmp_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11010
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11011
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11012
instruct compI_reg_immI0(rFlagsReg cr, iRegI op1, immI0 zero)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11013
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11014
  match(Set cr (CmpI op1 zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11015
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11016
  effect(DEF cr, USE op1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11017
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11018
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11019
  format %{ "cmpw $op1, 0" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11020
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11021
  ins_encode(aarch64_enc_cmpw_imm_addsub(op1, zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11022
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11023
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11024
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11025
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11026
instruct compI_reg_immIAddSub(rFlagsReg cr, iRegI op1, immIAddSub op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11027
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11028
  match(Set cr (CmpI op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11029
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11030
  effect(DEF cr, USE op1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11031
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11032
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11033
  format %{ "cmpw  $op1, $op2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11034
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11035
  ins_encode(aarch64_enc_cmpw_imm_addsub(op1, op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11036
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11037
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11038
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11039
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11040
instruct compI_reg_immI(rFlagsReg cr, iRegI op1, immI op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11041
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11042
  match(Set cr (CmpI op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11043
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11044
  effect(DEF cr, USE op1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11045
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11046
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11047
  format %{ "cmpw  $op1, $op2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11048
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11049
  ins_encode(aarch64_enc_cmpw_imm(op1, op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11050
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11051
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11052
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11053
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11054
// Unsigned compare Instructions; really, same as signed compare
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11055
// except it should only be used to feed an If or a CMovI which takes a
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11056
// cmpOpU.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11057
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11058
instruct compU_reg_reg(rFlagsRegU cr, iRegI op1, iRegI op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11059
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11060
  match(Set cr (CmpU op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11061
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11062
  effect(DEF cr, USE op1, USE op2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11063
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11064
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11065
  format %{ "cmpw  $op1, $op2\t# unsigned" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11066
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11067
  ins_encode(aarch64_enc_cmpw(op1, op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11068
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11069
  ins_pipe(icmp_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11070
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11071
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11072
instruct compU_reg_immI0(rFlagsRegU cr, iRegI op1, immI0 zero)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11073
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11074
  match(Set cr (CmpU op1 zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11075
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11076
  effect(DEF cr, USE op1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11077
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11078
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11079
  format %{ "cmpw $op1, #0\t# unsigned" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11080
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11081
  ins_encode(aarch64_enc_cmpw_imm_addsub(op1, zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11082
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11083
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11084
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11085
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11086
instruct compU_reg_immIAddSub(rFlagsRegU cr, iRegI op1, immIAddSub op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11087
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11088
  match(Set cr (CmpU op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11089
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11090
  effect(DEF cr, USE op1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11091
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11092
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11093
  format %{ "cmpw  $op1, $op2\t# unsigned" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11094
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11095
  ins_encode(aarch64_enc_cmpw_imm_addsub(op1, op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11096
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11097
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11098
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11099
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11100
instruct compU_reg_immI(rFlagsRegU cr, iRegI op1, immI op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11101
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11102
  match(Set cr (CmpU op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11103
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11104
  effect(DEF cr, USE op1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11105
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11106
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11107
  format %{ "cmpw  $op1, $op2\t# unsigned" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11108
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11109
  ins_encode(aarch64_enc_cmpw_imm(op1, op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11110
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11111
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11112
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11113
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11114
instruct compL_reg_reg(rFlagsReg cr, iRegL op1, iRegL op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11115
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11116
  match(Set cr (CmpL op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11117
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11118
  effect(DEF cr, USE op1, USE op2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11119
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11120
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11121
  format %{ "cmp  $op1, $op2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11122
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11123
  ins_encode(aarch64_enc_cmp(op1, op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11124
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11125
  ins_pipe(icmp_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11126
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11127
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11128
instruct compL_reg_immI0(rFlagsReg cr, iRegL op1, immI0 zero)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11129
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11130
  match(Set cr (CmpL op1 zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11131
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11132
  effect(DEF cr, USE op1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11133
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11134
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11135
  format %{ "tst  $op1" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11136
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11137
  ins_encode(aarch64_enc_cmp_imm_addsub(op1, zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11138
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11139
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11140
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11141
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11142
instruct compL_reg_immLAddSub(rFlagsReg cr, iRegL op1, immLAddSub op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11143
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11144
  match(Set cr (CmpL op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11145
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11146
  effect(DEF cr, USE op1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11147
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11148
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11149
  format %{ "cmp  $op1, $op2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11150
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11151
  ins_encode(aarch64_enc_cmp_imm_addsub(op1, op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11152
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11153
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11154
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11155
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11156
instruct compL_reg_immL(rFlagsReg cr, iRegL op1, immL op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11157
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11158
  match(Set cr (CmpL op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11159
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11160
  effect(DEF cr, USE op1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11161
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11162
  ins_cost(INSN_COST * 2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11163
  format %{ "cmp  $op1, $op2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11164
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11165
  ins_encode(aarch64_enc_cmp_imm(op1, op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11166
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11167
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11168
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11169
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11170
instruct compP_reg_reg(rFlagsRegU cr, iRegP op1, iRegP op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11171
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11172
  match(Set cr (CmpP op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11173
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11174
  effect(DEF cr, USE op1, USE op2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11175
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11176
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11177
  format %{ "cmp  $op1, $op2\t // ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11178
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11179
  ins_encode(aarch64_enc_cmpp(op1, op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11180
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11181
  ins_pipe(icmp_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11182
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11183
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11184
instruct compN_reg_reg(rFlagsRegU cr, iRegN op1, iRegN op2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11185
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11186
  match(Set cr (CmpN op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11187
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11188
  effect(DEF cr, USE op1, USE op2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11189
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11190
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11191
  format %{ "cmp  $op1, $op2\t // compressed ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11192
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11193
  ins_encode(aarch64_enc_cmpn(op1, op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11194
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11195
  ins_pipe(icmp_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11196
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11197
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11198
instruct testP_reg(rFlagsRegU cr, iRegP op1, immP0 zero)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11199
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11200
  match(Set cr (CmpP op1 zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11201
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11202
  effect(DEF cr, USE op1, USE zero);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11203
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11204
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11205
  format %{ "cmp  $op1, 0\t // ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11206
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11207
  ins_encode(aarch64_enc_testp(op1));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11208
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11209
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11210
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11211
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11212
instruct testN_reg(rFlagsRegU cr, iRegN op1, immN0 zero)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11213
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11214
  match(Set cr (CmpN op1 zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11215
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11216
  effect(DEF cr, USE op1, USE zero);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11217
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11218
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11219
  format %{ "cmp  $op1, 0\t // compressed ptr" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11220
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11221
  ins_encode(aarch64_enc_testn(op1));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11222
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11223
  ins_pipe(icmp_reg_imm);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11224
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11225
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11226
// FP comparisons
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11227
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11228
// n.b. CmpF/CmpD set a normal flags reg which then gets compared
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11229
// using normal cmpOp. See declaration of rFlagsReg for details.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11230
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11231
instruct compF_reg_reg(rFlagsReg cr, vRegF src1, vRegF src2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11232
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11233
  match(Set cr (CmpF src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11234
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11235
  ins_cost(3 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11236
  format %{ "fcmps $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11237
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11238
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11239
    __ fcmps(as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11240
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11241
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11242
  ins_pipe(pipe_class_compare);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11243
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11244
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11245
instruct compF_reg_zero(rFlagsReg cr, vRegF src1, immF0 src2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11246
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11247
  match(Set cr (CmpF src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11248
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11249
  ins_cost(3 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11250
  format %{ "fcmps $src1, 0.0" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11251
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11252
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11253
    __ fcmps(as_FloatRegister($src1$$reg), 0.0D);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11254
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11255
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11256
  ins_pipe(pipe_class_compare);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11257
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11258
// FROM HERE
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11259
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11260
instruct compD_reg_reg(rFlagsReg cr, vRegD src1, vRegD src2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11261
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11262
  match(Set cr (CmpD src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11263
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11264
  ins_cost(3 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11265
  format %{ "fcmpd $src1, $src2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11266
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11267
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11268
    __ fcmpd(as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11269
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11270
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11271
  ins_pipe(pipe_class_compare);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11272
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11273
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11274
instruct compD_reg_zero(rFlagsReg cr, vRegD src1, immD0 src2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11275
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11276
  match(Set cr (CmpD src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11277
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11278
  ins_cost(3 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11279
  format %{ "fcmpd $src1, 0.0" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11280
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11281
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11282
    __ fcmpd(as_FloatRegister($src1$$reg), 0.0D);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11283
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11284
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11285
  ins_pipe(pipe_class_compare);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11286
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11287
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11288
instruct compF3_reg_reg(iRegINoSp dst, vRegF src1, vRegF src2, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11289
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11290
  match(Set dst (CmpF3 src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11291
  effect(KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11292
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11293
  ins_cost(5 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11294
  format %{ "fcmps $src1, $src2\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11295
            "csinvw($dst, zr, zr, eq\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11296
            "csnegw($dst, $dst, $dst, lt)"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11297
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11298
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11299
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11300
    Label done;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11301
    FloatRegister s1 = as_FloatRegister($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11302
    FloatRegister s2 = as_FloatRegister($src2$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11303
    Register d = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11304
    __ fcmps(s1, s2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11305
    // installs 0 if EQ else -1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11306
    __ csinvw(d, zr, zr, Assembler::EQ);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11307
    // keeps -1 if less or unordered else installs 1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11308
    __ csnegw(d, d, d, Assembler::LT);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11309
    __ bind(done);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11310
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11311
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11312
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11313
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11314
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11315
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11316
instruct compD3_reg_reg(iRegINoSp dst, vRegD src1, vRegD src2, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11317
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11318
  match(Set dst (CmpD3 src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11319
  effect(KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11320
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11321
  ins_cost(5 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11322
  format %{ "fcmpd $src1, $src2\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11323
            "csinvw($dst, zr, zr, eq\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11324
            "csnegw($dst, $dst, $dst, lt)"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11325
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11326
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11327
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11328
    Label done;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11329
    FloatRegister s1 = as_FloatRegister($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11330
    FloatRegister s2 = as_FloatRegister($src2$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11331
    Register d = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11332
    __ fcmpd(s1, s2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11333
    // installs 0 if EQ else -1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11334
    __ csinvw(d, zr, zr, Assembler::EQ);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11335
    // keeps -1 if less or unordered else installs 1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11336
    __ csnegw(d, d, d, Assembler::LT);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11337
    __ bind(done);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11338
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11339
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11340
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11341
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11342
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11343
instruct compF3_reg_immF0(iRegINoSp dst, vRegF src1, immF0 zero, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11344
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11345
  match(Set dst (CmpF3 src1 zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11346
  effect(KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11347
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11348
  ins_cost(5 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11349
  format %{ "fcmps $src1, 0.0\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11350
            "csinvw($dst, zr, zr, eq\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11351
            "csnegw($dst, $dst, $dst, lt)"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11352
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11353
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11354
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11355
    Label done;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11356
    FloatRegister s1 = as_FloatRegister($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11357
    Register d = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11358
    __ fcmps(s1, 0.0D);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11359
    // installs 0 if EQ else -1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11360
    __ csinvw(d, zr, zr, Assembler::EQ);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11361
    // keeps -1 if less or unordered else installs 1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11362
    __ csnegw(d, d, d, Assembler::LT);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11363
    __ bind(done);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11364
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11365
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11366
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11367
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11368
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11369
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11370
instruct compD3_reg_immD0(iRegINoSp dst, vRegD src1, immD0 zero, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11371
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11372
  match(Set dst (CmpD3 src1 zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11373
  effect(KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11374
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11375
  ins_cost(5 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11376
  format %{ "fcmpd $src1, 0.0\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11377
            "csinvw($dst, zr, zr, eq\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11378
            "csnegw($dst, $dst, $dst, lt)"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11379
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11380
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11381
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11382
    Label done;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11383
    FloatRegister s1 = as_FloatRegister($src1$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11384
    Register d = as_Register($dst$$reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11385
    __ fcmpd(s1, 0.0D);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11386
    // installs 0 if EQ else -1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11387
    __ csinvw(d, zr, zr, Assembler::EQ);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11388
    // keeps -1 if less or unordered else installs 1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11389
    __ csnegw(d, d, d, Assembler::LT);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11390
    __ bind(done);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11391
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11392
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11393
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11394
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11395
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11396
instruct cmpLTMask_reg_reg(iRegINoSp dst, iRegI p, iRegI q, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11397
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11398
  match(Set dst (CmpLTMask p q));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11399
  effect(KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11400
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11401
  ins_cost(3 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11402
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11403
  format %{ "cmpw $p, $q\t# cmpLTMask\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11404
            "csetw $dst, lt\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11405
            "subw $dst, zr, $dst"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11406
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11407
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11408
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11409
    __ cmpw(as_Register($p$$reg), as_Register($q$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11410
    __ csetw(as_Register($dst$$reg), Assembler::LT);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11411
    __ subw(as_Register($dst$$reg), zr, as_Register($dst$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11412
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11413
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11414
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11415
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11416
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11417
instruct cmpLTMask_reg_zero(iRegINoSp dst, iRegI src, immI0 zero, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11418
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11419
  match(Set dst (CmpLTMask src zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11420
  effect(KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11421
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11422
  ins_cost(INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11423
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11424
  format %{ "asrw $dst, $src, #31\t# cmpLTMask0" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11425
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11426
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11427
    __ asrw(as_Register($dst$$reg), as_Register($src$$reg), 31);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11428
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11429
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11430
  ins_pipe(ialu_reg_shift);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11431
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11432
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11433
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11434
// Max and Min
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11435
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11436
instruct minI_rReg(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11437
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11438
  match(Set dst (MinI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11439
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11440
  effect(DEF dst, USE src1, USE src2, KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11441
  size(8);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11442
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11443
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11444
  format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11445
    "cmpw $src1 $src2\t signed int\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11446
    "cselw $dst, $src1, $src2 lt\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11447
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11448
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11449
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11450
    __ cmpw(as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11451
            as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11452
    __ cselw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11453
             as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11454
             as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11455
             Assembler::LT);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11456
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11457
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11458
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11459
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11460
// FROM HERE
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11461
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11462
instruct maxI_rReg(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11463
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11464
  match(Set dst (MaxI src1 src2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11465
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11466
  effect(DEF dst, USE src1, USE src2, KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11467
  size(8);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11468
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11469
  ins_cost(INSN_COST * 3);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11470
  format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11471
    "cmpw $src1 $src2\t signed int\n\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11472
    "cselw $dst, $src1, $src2 gt\t"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11473
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11474
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11475
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11476
    __ cmpw(as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11477
            as_Register($src2$$reg));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11478
    __ cselw(as_Register($dst$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11479
             as_Register($src1$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11480
             as_Register($src2$$reg),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11481
             Assembler::GT);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11482
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11483
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11484
  ins_pipe(ialu_reg_reg);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11485
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11486
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11487
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11488
// Branch Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11489
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11490
// Direct Branch.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11491
instruct branch(label lbl)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11492
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11493
  match(Goto);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11494
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11495
  effect(USE lbl);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11496
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11497
  ins_cost(BRANCH_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11498
  format %{ "b  $lbl" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11499
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11500
  ins_encode(aarch64_enc_b(lbl));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11501
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11502
  ins_pipe(pipe_branch);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11503
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11504
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11505
// Conditional Near Branch
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11506
instruct branchCon(cmpOp cmp, rFlagsReg cr, label lbl)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11507
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11508
  // Same match rule as `branchConFar'.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11509
  match(If cmp cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11510
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11511
  effect(USE lbl);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11512
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11513
  ins_cost(BRANCH_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11514
  // If set to 1 this indicates that the current instruction is a
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11515
  // short variant of a long branch. This avoids using this
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11516
  // instruction in first-pass matching. It will then only be used in
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11517
  // the `Shorten_branches' pass.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11518
  // ins_short_branch(1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11519
  format %{ "b$cmp  $lbl" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11520
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11521
  ins_encode(aarch64_enc_br_con(cmp, lbl));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11522
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11523
  ins_pipe(pipe_branch_cond);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11524
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11525
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11526
// Conditional Near Branch Unsigned
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11527
instruct branchConU(cmpOpU cmp, rFlagsRegU cr, label lbl)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11528
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11529
  // Same match rule as `branchConFar'.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11530
  match(If cmp cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11531
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11532
  effect(USE lbl);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11533
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11534
  ins_cost(BRANCH_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11535
  // If set to 1 this indicates that the current instruction is a
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11536
  // short variant of a long branch. This avoids using this
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11537
  // instruction in first-pass matching. It will then only be used in
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11538
  // the `Shorten_branches' pass.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11539
  // ins_short_branch(1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11540
  format %{ "b$cmp  $lbl\t# unsigned" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11541
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11542
  ins_encode(aarch64_enc_br_conU(cmp, lbl));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11543
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11544
  ins_pipe(pipe_branch_cond);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11545
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11546
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11547
// Make use of CBZ and CBNZ.  These instructions, as well as being
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11548
// shorter than (cmp; branch), have the additional benefit of not
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11549
// killing the flags.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11550
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11551
instruct cmpI_imm0_branch(cmpOp cmp, iRegI op1, immI0 op2, label labl, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11552
  match(If cmp (CmpI op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11553
  predicate(n->in(1)->as_Bool()->_test._test == BoolTest::ne
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11554
            || n->in(1)->as_Bool()->_test._test == BoolTest::eq);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11555
  effect(USE labl);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11556
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11557
  ins_cost(BRANCH_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11558
  format %{ "cbw$cmp   $op1, $labl" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11559
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11560
    Label* L = $labl$$label;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11561
    Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11562
    if (cond == Assembler::EQ)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11563
      __ cbzw($op1$$Register, *L);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11564
    else
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11565
      __ cbnzw($op1$$Register, *L);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11566
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11567
  ins_pipe(pipe_cmp_branch);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11568
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11569
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11570
instruct cmpL_imm0_branch(cmpOp cmp, iRegL op1, immL0 op2, label labl, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11571
  match(If cmp (CmpL op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11572
  predicate(n->in(1)->as_Bool()->_test._test == BoolTest::ne
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11573
            || n->in(1)->as_Bool()->_test._test == BoolTest::eq);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11574
  effect(USE labl);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11575
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11576
  ins_cost(BRANCH_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11577
  format %{ "cb$cmp   $op1, $labl" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11578
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11579
    Label* L = $labl$$label;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11580
    Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11581
    if (cond == Assembler::EQ)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11582
      __ cbz($op1$$Register, *L);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11583
    else
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11584
      __ cbnz($op1$$Register, *L);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11585
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11586
  ins_pipe(pipe_cmp_branch);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11587
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11588
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11589
instruct cmpP_imm0_branch(cmpOp cmp, iRegP op1, immP0 op2, label labl, rFlagsReg cr) %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11590
  match(If cmp (CmpP op1 op2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11591
  predicate(n->in(1)->as_Bool()->_test._test == BoolTest::ne
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11592
            || n->in(1)->as_Bool()->_test._test == BoolTest::eq);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11593
  effect(USE labl);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11594
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11595
  ins_cost(BRANCH_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11596
  format %{ "cb$cmp   $op1, $labl" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11597
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11598
    Label* L = $labl$$label;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11599
    Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11600
    if (cond == Assembler::EQ)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11601
      __ cbz($op1$$Register, *L);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11602
    else
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11603
      __ cbnz($op1$$Register, *L);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11604
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11605
  ins_pipe(pipe_cmp_branch);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11606
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11607
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11608
// Conditional Far Branch
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11609
// Conditional Far Branch Unsigned
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11610
// TODO: fixme
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11611
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11612
// counted loop end branch near
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11613
instruct branchLoopEnd(cmpOp cmp, rFlagsReg cr, label lbl)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11614
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11615
  match(CountedLoopEnd cmp cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11616
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11617
  effect(USE lbl);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11618
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11619
  ins_cost(BRANCH_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11620
  // short variant.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11621
  // ins_short_branch(1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11622
  format %{ "b$cmp $lbl \t// counted loop end" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11623
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11624
  ins_encode(aarch64_enc_br_con(cmp, lbl));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11625
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11626
  ins_pipe(pipe_branch);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11627
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11628
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11629
// counted loop end branch near Unsigned
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11630
instruct branchLoopEndU(cmpOpU cmp, rFlagsRegU cr, label lbl)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11631
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11632
  match(CountedLoopEnd cmp cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11633
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11634
  effect(USE lbl);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11635
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11636
  ins_cost(BRANCH_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11637
  // short variant.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11638
  // ins_short_branch(1);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11639
  format %{ "b$cmp $lbl \t// counted loop end unsigned" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11640
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11641
  ins_encode(aarch64_enc_br_conU(cmp, lbl));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11642
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11643
  ins_pipe(pipe_branch);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11644
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11645
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11646
// counted loop end branch far
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11647
// counted loop end branch far unsigned
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11648
// TODO: fixme
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11649
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11650
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11651
// inlined locking and unlocking
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11652
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11653
instruct cmpFastLock(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp tmp, iRegPNoSp tmp2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11654
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11655
  match(Set cr (FastLock object box));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11656
  effect(TEMP tmp, TEMP tmp2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11657
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11658
  // TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11659
  // identify correct cost
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11660
  ins_cost(5 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11661
  format %{ "fastlock $object,$box\t! kills $tmp,$tmp2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11662
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11663
  ins_encode(aarch64_enc_fast_lock(object, box, tmp, tmp2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11664
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11665
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11666
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11667
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11668
instruct cmpFastUnlock(rFlagsReg cr, iRegP object, iRegP box, iRegPNoSp tmp, iRegPNoSp tmp2)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11669
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11670
  match(Set cr (FastUnlock object box));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11671
  effect(TEMP tmp, TEMP tmp2);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11672
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11673
  ins_cost(5 * INSN_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11674
  format %{ "fastunlock $object,$box\t! kills $tmp, $tmp2" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11675
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11676
  ins_encode(aarch64_enc_fast_unlock(object, box, tmp, tmp2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11677
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11678
  ins_pipe(pipe_serial);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11679
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11680
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11681
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11682
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11683
// Safepoint Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11684
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11685
// TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11686
// provide a near and far version of this code
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11687
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11688
instruct safePoint(iRegP poll)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11689
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11690
  match(SafePoint poll);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11691
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11692
  format %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11693
    "ldrw zr, [$poll]\t# Safepoint: poll for GC"
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11694
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11695
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11696
    __ read_polling_page(as_Register($poll$$reg), relocInfo::poll_type);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11697
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11698
  ins_pipe(pipe_serial); // ins_pipe(iload_reg_mem);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11699
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11700
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11701
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11702
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11703
// Procedure Call/Return Instructions
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11704
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11705
// Call Java Static Instruction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11706
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11707
instruct CallStaticJavaDirect(method meth)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11708
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11709
  match(CallStaticJava);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11710
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11711
  effect(USE meth);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11712
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11713
  predicate(!((CallStaticJavaNode*)n)->is_method_handle_invoke());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11714
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11715
  ins_cost(CALL_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11716
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11717
  format %{ "call,static $meth \t// ==> " %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11718
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11719
  ins_encode( aarch64_enc_java_static_call(meth),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11720
              aarch64_enc_call_epilog );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11721
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11722
  ins_pipe(pipe_class_call);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11723
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11724
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11725
// TO HERE
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11726
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11727
// Call Java Static Instruction (method handle version)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11728
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11729
instruct CallStaticJavaDirectHandle(method meth, iRegP_FP reg_mh_save)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11730
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11731
  match(CallStaticJava);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11732
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11733
  effect(USE meth);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11734
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11735
  predicate(((CallStaticJavaNode*)n)->is_method_handle_invoke());
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11736
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11737
  ins_cost(CALL_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11738
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11739
  format %{ "call,static $meth \t// (methodhandle) ==> " %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11740
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11741
  ins_encode( aarch64_enc_java_handle_call(meth),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11742
              aarch64_enc_call_epilog );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11743
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11744
  ins_pipe(pipe_class_call);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11745
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11746
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11747
// Call Java Dynamic Instruction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11748
instruct CallDynamicJavaDirect(method meth)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11749
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11750
  match(CallDynamicJava);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11751
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11752
  effect(USE meth);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11753
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11754
  ins_cost(CALL_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11755
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11756
  format %{ "CALL,dynamic $meth \t// ==> " %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11757
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11758
  ins_encode( aarch64_enc_java_dynamic_call(meth),
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11759
               aarch64_enc_call_epilog );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11760
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11761
  ins_pipe(pipe_class_call);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11762
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11763
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11764
// Call Runtime Instruction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11765
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11766
instruct CallRuntimeDirect(method meth)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11767
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11768
  match(CallRuntime);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11769
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11770
  effect(USE meth);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11771
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11772
  ins_cost(CALL_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11773
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11774
  format %{ "CALL, runtime $meth" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11775
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11776
  ins_encode( aarch64_enc_java_to_runtime(meth) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11777
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11778
  ins_pipe(pipe_class_call);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11779
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11780
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11781
// Call Runtime Instruction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11782
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11783
instruct CallLeafDirect(method meth)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11784
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11785
  match(CallLeaf);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11786
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11787
  effect(USE meth);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11788
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11789
  ins_cost(CALL_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11790
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11791
  format %{ "CALL, runtime leaf $meth" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11792
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11793
  ins_encode( aarch64_enc_java_to_runtime(meth) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11794
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11795
  ins_pipe(pipe_class_call);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11796
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11797
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11798
// Call Runtime Instruction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11799
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11800
instruct CallLeafNoFPDirect(method meth)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11801
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11802
  match(CallLeafNoFP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11803
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11804
  effect(USE meth);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11805
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11806
  ins_cost(CALL_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11807
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11808
  format %{ "CALL, runtime leaf nofp $meth" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11809
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11810
  ins_encode( aarch64_enc_java_to_runtime(meth) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11811
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11812
  ins_pipe(pipe_class_call);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11813
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11814
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11815
// Tail Call; Jump from runtime stub to Java code.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11816
// Also known as an 'interprocedural jump'.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11817
// Target of jump will eventually return to caller.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11818
// TailJump below removes the return address.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11819
instruct TailCalljmpInd(iRegPNoSp jump_target, inline_cache_RegP method_oop)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11820
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11821
  match(TailCall jump_target method_oop);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11822
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11823
  ins_cost(CALL_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11824
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11825
  format %{ "br $jump_target\t# $method_oop holds method oop" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11826
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11827
  ins_encode(aarch64_enc_tail_call(jump_target));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11828
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11829
  ins_pipe(pipe_class_call);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11830
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11831
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11832
instruct TailjmpInd(iRegPNoSp jump_target, iRegP_R0 ex_oop)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11833
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11834
  match(TailJump jump_target ex_oop);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11835
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11836
  ins_cost(CALL_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11837
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11838
  format %{ "br $jump_target\t# $ex_oop holds exception oop" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11839
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11840
  ins_encode(aarch64_enc_tail_jmp(jump_target));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11841
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11842
  ins_pipe(pipe_class_call);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11843
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11844
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11845
// Create exception oop: created by stack-crawling runtime code.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11846
// Created exception is now available to this handler, and is setup
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11847
// just prior to jumping to this handler. No code emitted.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11848
// TODO check
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11849
// should ex_oop be in r0? intel uses rax, ppc cannot use r0 so uses rarg1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11850
instruct CreateException(iRegP_R0 ex_oop)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11851
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11852
  match(Set ex_oop (CreateEx));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11853
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11854
  format %{ " -- \t// exception oop; no code emitted" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11855
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11856
  size(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11857
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11858
  ins_encode( /*empty*/ );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11859
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11860
  ins_pipe(pipe_class_empty);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11861
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11862
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11863
// Rethrow exception: The exception oop will come in the first
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11864
// argument position. Then JUMP (not call) to the rethrow stub code.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11865
instruct RethrowException() %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11866
  match(Rethrow);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11867
  ins_cost(CALL_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11868
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11869
  format %{ "b rethrow_stub" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11870
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11871
  ins_encode( aarch64_enc_rethrow() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11872
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11873
  ins_pipe(pipe_class_call);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11874
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11875
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11876
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11877
// Return Instruction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11878
// epilog node loads ret address into lr as part of frame pop
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11879
instruct Ret()
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11880
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11881
  match(Return);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11882
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11883
  format %{ "ret\t// return register" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11884
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11885
  ins_encode( aarch64_enc_ret() );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11886
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11887
  ins_pipe(pipe_branch);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11888
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11889
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11890
// Die now.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11891
instruct ShouldNotReachHere() %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11892
  match(Halt);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11893
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11894
  ins_cost(CALL_COST);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11895
  format %{ "ShouldNotReachHere" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11896
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11897
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11898
    // TODO
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11899
    // implement proper trap call here
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11900
    __ brk(999);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11901
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11902
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11903
  ins_pipe(pipe_class_default);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11904
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11905
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11906
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11907
// Partial Subtype Check
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11908
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11909
// superklass array for an instance of the superklass.  Set a hidden
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11910
// internal cache on a hit (cache is checked with exposed code in
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11911
// gen_subtype_check()).  Return NZ for a miss or zero for a hit.  The
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11912
// encoding ALSO sets flags.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11913
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11914
instruct partialSubtypeCheck(iRegP_R4 sub, iRegP_R0 super, iRegP_R2 temp, iRegP_R5 result, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11915
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11916
  match(Set result (PartialSubtypeCheck sub super));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11917
  effect(KILL cr, KILL temp);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11918
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11919
  ins_cost(1100);  // slightly larger than the next version
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11920
  format %{ "partialSubtypeCheck $result, $sub, $super" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11921
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11922
  ins_encode(aarch64_enc_partial_subtype_check(sub, super, temp, result));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11923
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11924
  opcode(0x1); // Force zero of result reg on hit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11925
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11926
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11927
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11928
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11929
instruct partialSubtypeCheckVsZero(iRegP_R4 sub, iRegP_R0 super, iRegP_R2 temp, iRegP_R5 result, immP0 zero, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11930
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11931
  match(Set cr (CmpP (PartialSubtypeCheck sub super) zero));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11932
  effect(KILL temp, KILL result);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11933
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11934
  ins_cost(1100);  // slightly larger than the next version
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11935
  format %{ "partialSubtypeCheck $result, $sub, $super == 0" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11936
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11937
  ins_encode(aarch64_enc_partial_subtype_check(sub, super, temp, result));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11938
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11939
  opcode(0x0); // Don't zero result reg on hit
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11940
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11941
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11942
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11943
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11944
instruct string_compare(iRegP_R1 str1, iRegI_R2 cnt1, iRegP_R3 str2, iRegI_R4 cnt2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11945
                        iRegI_R0 result, iRegP_R10 tmp1, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11946
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11947
  match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11948
  effect(KILL tmp1, USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2, KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11949
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11950
  format %{ "String Compare $str1,$cnt1,$str2,$cnt2 -> $result   # KILL $tmp1" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11951
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11952
    __ string_compare($str1$$Register, $str2$$Register,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11953
                      $cnt1$$Register, $cnt2$$Register, $result$$Register,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11954
                      $tmp1$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11955
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11956
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11957
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11958
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11959
instruct string_indexof(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11960
       iRegI_R0 result, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI tmp4, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11961
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11962
  match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11963
  effect(USE_KILL str1, USE_KILL str2, USE_KILL cnt1, USE_KILL cnt2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11964
         TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11965
  format %{ "String IndexOf $str1,$cnt1,$str2,$cnt2 -> $result" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11966
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11967
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11968
    __ string_indexof($str1$$Register, $str2$$Register,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11969
                      $cnt1$$Register, $cnt2$$Register,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11970
                      $tmp1$$Register, $tmp2$$Register,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11971
                      $tmp3$$Register, $tmp4$$Register,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11972
                      -1, $result$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11973
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11974
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11975
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11976
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11977
instruct string_indexof_con(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11978
                 immI_le_4 int_cnt2, iRegI_R0 result, iRegI tmp1, iRegI tmp2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11979
                 iRegI tmp3, iRegI tmp4, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11980
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11981
  match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11982
  effect(USE_KILL str1, USE_KILL str2, USE_KILL cnt1,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11983
         TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11984
  format %{ "String IndexOf $str1,$cnt1,$str2,$int_cnt2 -> $result" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11985
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11986
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11987
    int icnt2 = (int)$int_cnt2$$constant;
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11988
    __ string_indexof($str1$$Register, $str2$$Register,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11989
                      $cnt1$$Register, zr,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11990
                      $tmp1$$Register, $tmp2$$Register,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11991
                      $tmp3$$Register, $tmp4$$Register,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11992
                      icnt2, $result$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11993
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11994
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11995
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11996
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11997
instruct string_equals(iRegP_R1 str1, iRegP_R3 str2, iRegI_R4 cnt,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11998
                        iRegI_R0 result, iRegP_R10 tmp, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 11999
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12000
  match(Set result (StrEquals (Binary str1 str2) cnt));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12001
  effect(KILL tmp, USE_KILL str1, USE_KILL str2, USE_KILL cnt, KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12002
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12003
  format %{ "String Equals $str1,$str2,$cnt -> $result    // KILL $tmp" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12004
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12005
    __ string_equals($str1$$Register, $str2$$Register,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12006
                      $cnt$$Register, $result$$Register,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12007
                      $tmp$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12008
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12009
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12010
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12011
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12012
instruct array_equals(iRegP_R1 ary1, iRegP_R2 ary2, iRegI_R0 result,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12013
                      iRegP_R10 tmp, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12014
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12015
  match(Set result (AryEq ary1 ary2));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12016
  effect(KILL tmp, USE_KILL ary1, USE_KILL ary2, KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12017
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12018
  format %{ "Array Equals $ary1,ary2 -> $result    // KILL $tmp" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12019
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12020
    __ char_arrays_equals($ary1$$Register, $ary2$$Register,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12021
                          $result$$Register, $tmp$$Register);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12022
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12023
  ins_pipe(pipe_class_memory);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12024
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12025
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12026
// encode char[] to byte[] in ISO_8859_1
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12027
instruct encode_iso_array(iRegP_R2 src, iRegP_R1 dst, iRegI_R3 len,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12028
                          vRegD_V0 Vtmp1, vRegD_V1 Vtmp2,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12029
                          vRegD_V2 Vtmp3, vRegD_V3 Vtmp4,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12030
                          iRegI_R0 result, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12031
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12032
  match(Set result (EncodeISOArray src (Binary dst len)));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12033
  effect(USE_KILL src, USE_KILL dst, USE_KILL len,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12034
         KILL Vtmp1, KILL Vtmp2, KILL Vtmp3, KILL Vtmp4, KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12035
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12036
  format %{ "Encode array $src,$dst,$len -> $result" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12037
  ins_encode %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12038
    __ encode_iso_array($src$$Register, $dst$$Register, $len$$Register,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12039
         $result$$Register, $Vtmp1$$FloatRegister,  $Vtmp2$$FloatRegister,
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12040
         $Vtmp3$$FloatRegister,  $Vtmp4$$FloatRegister);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12041
  %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12042
  ins_pipe( pipe_class_memory );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12043
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12044
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12045
// ============================================================================
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12046
// This name is KNOWN by the ADLC and cannot be changed.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12047
// The ADLC forces a 'TypeRawPtr::BOTTOM' output type
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12048
// for this guy.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12049
instruct tlsLoadP(thread_RegP dst)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12050
%{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12051
  match(Set dst (ThreadLocal));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12052
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12053
  ins_cost(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12054
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12055
  format %{ " -- \t// $dst=Thread::current(), empty" %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12056
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12057
  size(0);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12058
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12059
  ins_encode( /*empty*/ );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12060
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12061
  ins_pipe(pipe_class_empty);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12062
%}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12063
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12064
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12065
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12066
//----------PEEPHOLE RULES-----------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12067
// These must follow all instruction definitions as they use the names
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12068
// defined in the instructions definitions.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12069
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12070
// peepmatch ( root_instr_name [preceding_instruction]* );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12071
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12072
// peepconstraint %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12073
// (instruction_number.operand_name relational_op instruction_number.operand_name
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12074
//  [, ...] );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12075
// // instruction numbers are zero-based using left to right order in peepmatch
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12076
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12077
// peepreplace ( instr_name  ( [instruction_number.operand_name]* ) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12078
// // provide an instruction_number.operand_name for each operand that appears
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12079
// // in the replacement instruction's match rule
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12080
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12081
// ---------VM FLAGS---------------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12082
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12083
// All peephole optimizations can be turned off using -XX:-OptoPeephole
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12084
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12085
// Each peephole rule is given an identifying number starting with zero and
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12086
// increasing by one in the order seen by the parser.  An individual peephole
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12087
// can be enabled, and all others disabled, by using -XX:OptoPeepholeAt=#
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12088
// on the command-line.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12089
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12090
// ---------CURRENT LIMITATIONS----------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12091
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12092
// Only match adjacent instructions in same basic block
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12093
// Only equality constraints
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12094
// Only constraints between operands, not (0.dest_reg == RAX_enc)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12095
// Only one replacement instruction
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12096
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12097
// ---------EXAMPLE----------------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12098
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12099
// // pertinent parts of existing instructions in architecture description
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12100
// instruct movI(iRegINoSp dst, iRegI src)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12101
// %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12102
//   match(Set dst (CopyI src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12103
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12104
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12105
// instruct incI_iReg(iRegINoSp dst, immI1 src, rFlagsReg cr)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12106
// %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12107
//   match(Set dst (AddI dst src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12108
//   effect(KILL cr);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12109
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12110
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12111
// // Change (inc mov) to lea
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12112
// peephole %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12113
//   // increment preceeded by register-register move
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12114
//   peepmatch ( incI_iReg movI );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12115
//   // require that the destination register of the increment
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12116
//   // match the destination register of the move
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12117
//   peepconstraint ( 0.dst == 1.dst );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12118
//   // construct a replacement instruction that sets
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12119
//   // the destination to ( move's source register + one )
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12120
//   peepreplace ( leaI_iReg_immI( 0.dst 1.src 0.src ) );
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12121
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12122
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12123
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12124
// Implementation no longer uses movX instructions since
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12125
// machine-independent system no longer uses CopyX nodes.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12126
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12127
// peephole
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12128
// %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12129
//   peepmatch (incI_iReg movI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12130
//   peepconstraint (0.dst == 1.dst);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12131
//   peepreplace (leaI_iReg_immI(0.dst 1.src 0.src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12132
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12133
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12134
// peephole
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12135
// %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12136
//   peepmatch (decI_iReg movI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12137
//   peepconstraint (0.dst == 1.dst);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12138
//   peepreplace (leaI_iReg_immI(0.dst 1.src 0.src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12139
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12140
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12141
// peephole
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12142
// %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12143
//   peepmatch (addI_iReg_imm movI);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12144
//   peepconstraint (0.dst == 1.dst);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12145
//   peepreplace (leaI_iReg_immI(0.dst 1.src 0.src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12146
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12147
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12148
// peephole
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12149
// %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12150
//   peepmatch (incL_iReg movL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12151
//   peepconstraint (0.dst == 1.dst);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12152
//   peepreplace (leaL_iReg_immL(0.dst 1.src 0.src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12153
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12154
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12155
// peephole
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12156
// %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12157
//   peepmatch (decL_iReg movL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12158
//   peepconstraint (0.dst == 1.dst);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12159
//   peepreplace (leaL_iReg_immL(0.dst 1.src 0.src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12160
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12161
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12162
// peephole
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12163
// %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12164
//   peepmatch (addL_iReg_imm movL);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12165
//   peepconstraint (0.dst == 1.dst);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12166
//   peepreplace (leaL_iReg_immL(0.dst 1.src 0.src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12167
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12168
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12169
// peephole
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12170
// %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12171
//   peepmatch (addP_iReg_imm movP);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12172
//   peepconstraint (0.dst == 1.dst);
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12173
//   peepreplace (leaP_iReg_imm(0.dst 1.src 0.src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12174
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12175
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12176
// // Change load of spilled value to only a spill
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12177
// instruct storeI(memory mem, iRegI src)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12178
// %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12179
//   match(Set mem (StoreI mem src));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12180
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12181
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12182
// instruct loadI(iRegINoSp dst, memory mem)
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12183
// %{
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12184
//   match(Set dst (LoadI mem));
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12185
// %}
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12186
//
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12187
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12188
//----------SMARTSPILL RULES---------------------------------------------------
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12189
// These must follow all instruction definitions as they use the names
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12190
// defined in the instructions definitions.
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12191
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12192
// Local Variables:
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12193
// mode: c++
e234025cafb6 8068053: AARCH64: C1 and C2 compilers
aph
parents:
diff changeset
 12194
// End: