hotspot/src/cpu/s390/vm/s390.ad
author goetz
Tue, 27 Dec 2016 16:10:59 +0100
changeset 43420 a056d6465ef9
parent 42897 57e7b1c75d17
child 45966 b2019823b5bd
child 46289 1904e7ec236e
permissions -rw-r--r--
8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections". Reviewed-by: mdoerr
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     1
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     2
// Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     3
// Copyright (c) 2016 SAP SE. All rights reserved.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     4
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     5
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     6
// This code is free software; you can redistribute it and/or modify it
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     7
// under the terms of the GNU General Public License version 2 only, as
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     8
// published by the Free Software Foundation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     9
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    10
// This code is distributed in the hope that it will be useful, but WITHOUT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    11
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    12
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    13
// version 2 for more details (a copy is included in the LICENSE file that
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    14
// accompanied this code).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    15
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    16
// You should have received a copy of the GNU General Public License version
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    17
// 2 along with this work; if not, write to the Free Software Foundation,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    18
// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    19
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    20
// Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    21
// or visit www.oracle.com if you need additional information or have any
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    22
// questions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    23
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    24
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    25
// z/Architecture Architecture Description File
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    26
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    27
// Major contributions by AS, JL, LS.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    28
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    29
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    30
// Following information is derived from private mail communication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    31
// (Oct. 2011).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    32
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    33
// General branch target alignment considerations
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    34
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    35
// z/Architecture does not imply a general branch target alignment requirement.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    36
// There are side effects and side considerations, though, which may
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    37
// provide some performance benefit. These are:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    38
//  - Align branch target on octoword (32-byte) boundary
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    39
//    On more recent models (from z9 on), I-fetch is done on a Octoword
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    40
//    (32 bytes at a time) basis. To avoid I-fetching unnecessary
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    41
//    instructions, branch targets should be 32-byte aligend. If this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    42
//    exact alingment cannot be achieved, having the branch target in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    43
//    the first doubleword still provides some benefit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    44
//  - Avoid branch targets at the end of cache lines (> 64 bytes distance).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    45
//    Sequential instruction prefetching after the branch target starts
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    46
//    immediately after having fetched the octoword containing the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    47
//    branch target. When I-fetching crosses a cache line, there may be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    48
//    a small stall. The worst case: the branch target (at the end of
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    49
//    a cache line) is a L1 I-cache miss and the next line as well.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    50
//    Then, the entire target line must be filled first (to contine at the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    51
//    branch target). Only then can the next sequential line be filled.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    52
//  - Avoid multiple poorly predicted branches in a row.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    53
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    54
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    55
//----------REGISTER DEFINITION BLOCK------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    56
// This information is used by the matcher and the register allocator to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    57
// describe individual registers and classes of registers within the target
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    58
// architecture.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    59
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    60
register %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    61
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    62
//----------Architecture Description Register Definitions----------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    63
// General Registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    64
// "reg_def" name (register save type, C convention save type,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    65
//                   ideal register type, encoding);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    66
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    67
// Register Save Types:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    68
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    69
//   NS  = No-Save:     The register allocator assumes that these registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    70
//                      can be used without saving upon entry to the method, &
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    71
//                      that they do not need to be saved at call sites.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    72
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    73
//   SOC = Save-On-Call: The register allocator assumes that these registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    74
//                      can be used without saving upon entry to the method,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    75
//                      but that they must be saved at call sites.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    76
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    77
//   SOE = Save-On-Entry: The register allocator assumes that these registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    78
//                      must be saved before using them upon entry to the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    79
//                      method, but they do not need to be saved at call sites.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    80
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    81
//   AS  = Always-Save: The register allocator assumes that these registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    82
//                      must be saved before using them upon entry to the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    83
//                      method, & that they must be saved at call sites.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    84
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    85
// Ideal Register Type is used to determine how to save & restore a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    86
// register. Op_RegI will get spilled with LoadI/StoreI, Op_RegP will get
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    87
// spilled with LoadP/StoreP. If the register supports both, use Op_RegI.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    88
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    89
// The encoding number is the actual bit-pattern placed into the opcodes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    90
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    91
// z/Architecture register definitions, based on the z/Architecture Principles
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    92
// of Operation, 5th Edition, September 2005, and z/Linux Elf ABI Supplement,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    93
// 5th Edition, March 2001.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    94
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    95
// For each 64-bit register we must define two registers: the register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    96
// itself, e.g. Z_R3, and a corresponding virtual other (32-bit-)'half',
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    97
// e.g. Z_R3_H, which is needed by the allocator, but is not used
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    98
// for stores, loads, etc.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    99
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   100
  // Integer/Long Registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   101
  // ----------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   102
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   103
  // z/Architecture has 16 64-bit integer registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   104
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   105
  // types: v = volatile, nv = non-volatile, s = system
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   106
  reg_def Z_R0   (SOC, SOC, Op_RegI,  0, Z_R0->as_VMReg());   // v   scratch1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   107
  reg_def Z_R0_H (SOC, SOC, Op_RegI, 99, Z_R0->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   108
  reg_def Z_R1   (SOC, SOC, Op_RegI,  1, Z_R1->as_VMReg());   // v   scratch2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   109
  reg_def Z_R1_H (SOC, SOC, Op_RegI, 99, Z_R1->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   110
  reg_def Z_R2   (SOC, SOC, Op_RegI,  2, Z_R2->as_VMReg());   // v   iarg1 & iret
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   111
  reg_def Z_R2_H (SOC, SOC, Op_RegI, 99, Z_R2->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   112
  reg_def Z_R3   (SOC, SOC, Op_RegI,  3, Z_R3->as_VMReg());   // v   iarg2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   113
  reg_def Z_R3_H (SOC, SOC, Op_RegI, 99, Z_R3->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   114
  reg_def Z_R4   (SOC, SOC, Op_RegI,  4, Z_R4->as_VMReg());   // v   iarg3
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   115
  reg_def Z_R4_H (SOC, SOC, Op_RegI, 99, Z_R4->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   116
  reg_def Z_R5   (SOC, SOC, Op_RegI,  5, Z_R5->as_VMReg());   // v   iarg4
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   117
  reg_def Z_R5_H (SOC, SOC, Op_RegI, 99, Z_R5->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   118
  reg_def Z_R6   (SOC, SOE, Op_RegI,  6, Z_R6->as_VMReg());   // v   iarg5
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   119
  reg_def Z_R6_H (SOC, SOE, Op_RegI, 99, Z_R6->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   120
  reg_def Z_R7   (SOC, SOE, Op_RegI,  7, Z_R7->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   121
  reg_def Z_R7_H (SOC, SOE, Op_RegI, 99, Z_R7->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   122
  reg_def Z_R8   (SOC, SOE, Op_RegI,  8, Z_R8->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   123
  reg_def Z_R8_H (SOC, SOE, Op_RegI, 99, Z_R8->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   124
  reg_def Z_R9   (SOC, SOE, Op_RegI,  9, Z_R9->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   125
  reg_def Z_R9_H (SOC, SOE, Op_RegI, 99, Z_R9->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   126
  reg_def Z_R10  (SOC, SOE, Op_RegI, 10, Z_R10->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   127
  reg_def Z_R10_H(SOC, SOE, Op_RegI, 99, Z_R10->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   128
  reg_def Z_R11  (SOC, SOE, Op_RegI, 11, Z_R11->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   129
  reg_def Z_R11_H(SOC, SOE, Op_RegI, 99, Z_R11->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   130
  reg_def Z_R12  (SOC, SOE, Op_RegI, 12, Z_R12->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   131
  reg_def Z_R12_H(SOC, SOE, Op_RegI, 99, Z_R12->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   132
  reg_def Z_R13  (SOC, SOE, Op_RegI, 13, Z_R13->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   133
  reg_def Z_R13_H(SOC, SOE, Op_RegI, 99, Z_R13->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   134
  reg_def Z_R14  (NS,  NS,  Op_RegI, 14, Z_R14->as_VMReg());   // s  return_pc
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   135
  reg_def Z_R14_H(NS,  NS,  Op_RegI, 99, Z_R14->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   136
  reg_def Z_R15  (NS,  NS,  Op_RegI, 15, Z_R15->as_VMReg());   // s  SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   137
  reg_def Z_R15_H(NS,  NS,  Op_RegI, 99, Z_R15->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   138
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   139
  // Float/Double Registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   140
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   141
  // The rules of ADL require that double registers be defined in pairs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   142
  // Each pair must be two 32-bit values, but not necessarily a pair of
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   143
  // single float registers. In each pair, ADLC-assigned register numbers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   144
  // must be adjacent, with the lower number even. Finally, when the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   145
  // CPU stores such a register pair to memory, the word associated with
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   146
  // the lower ADLC-assigned number must be stored to the lower address.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   147
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   148
  // z/Architecture has 16 64-bit floating-point registers. Each can store a single
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   149
  // or double precision floating-point value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   150
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   151
  // types: v = volatile, nv = non-volatile, s = system
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   152
  reg_def Z_F0   (SOC, SOC, Op_RegF,  0, Z_F0->as_VMReg());   // v   farg1 & fret
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   153
  reg_def Z_F0_H (SOC, SOC, Op_RegF, 99, Z_F0->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   154
  reg_def Z_F1   (SOC, SOC, Op_RegF,  1, Z_F1->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   155
  reg_def Z_F1_H (SOC, SOC, Op_RegF, 99, Z_F1->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   156
  reg_def Z_F2   (SOC, SOC, Op_RegF,  2, Z_F2->as_VMReg());   // v   farg2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   157
  reg_def Z_F2_H (SOC, SOC, Op_RegF, 99, Z_F2->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   158
  reg_def Z_F3   (SOC, SOC, Op_RegF,  3, Z_F3->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   159
  reg_def Z_F3_H (SOC, SOC, Op_RegF, 99, Z_F3->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   160
  reg_def Z_F4   (SOC, SOC, Op_RegF,  4, Z_F4->as_VMReg());   // v   farg3
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   161
  reg_def Z_F4_H (SOC, SOC, Op_RegF, 99, Z_F4->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   162
  reg_def Z_F5   (SOC, SOC, Op_RegF,  5, Z_F5->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   163
  reg_def Z_F5_H (SOC, SOC, Op_RegF, 99, Z_F5->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   164
  reg_def Z_F6   (SOC, SOC, Op_RegF,  6, Z_F6->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   165
  reg_def Z_F6_H (SOC, SOC, Op_RegF, 99, Z_F6->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   166
  reg_def Z_F7   (SOC, SOC, Op_RegF,  7, Z_F7->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   167
  reg_def Z_F7_H (SOC, SOC, Op_RegF, 99, Z_F7->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   168
  reg_def Z_F8   (SOC, SOE, Op_RegF,  8, Z_F8->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   169
  reg_def Z_F8_H (SOC, SOE, Op_RegF, 99, Z_F8->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   170
  reg_def Z_F9   (SOC, SOE, Op_RegF,  9, Z_F9->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   171
  reg_def Z_F9_H (SOC, SOE, Op_RegF, 99, Z_F9->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   172
  reg_def Z_F10  (SOC, SOE, Op_RegF, 10, Z_F10->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   173
  reg_def Z_F10_H(SOC, SOE, Op_RegF, 99, Z_F10->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   174
  reg_def Z_F11  (SOC, SOE, Op_RegF, 11, Z_F11->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   175
  reg_def Z_F11_H(SOC, SOE, Op_RegF, 99, Z_F11->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   176
  reg_def Z_F12  (SOC, SOE, Op_RegF, 12, Z_F12->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   177
  reg_def Z_F12_H(SOC, SOE, Op_RegF, 99, Z_F12->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   178
  reg_def Z_F13  (SOC, SOE, Op_RegF, 13, Z_F13->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   179
  reg_def Z_F13_H(SOC, SOE, Op_RegF, 99, Z_F13->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   180
  reg_def Z_F14  (SOC, SOE, Op_RegF, 14, Z_F14->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   181
  reg_def Z_F14_H(SOC, SOE, Op_RegF, 99, Z_F14->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   182
  reg_def Z_F15  (SOC, SOE, Op_RegF, 15, Z_F15->as_VMReg());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   183
  reg_def Z_F15_H(SOC, SOE, Op_RegF, 99, Z_F15->as_VMReg()->next());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   184
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   185
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   186
  // Special Registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   187
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   188
  // Condition Codes Flag Registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   189
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   190
  // z/Architecture has the PSW (program status word) that contains
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   191
  // (among other information) the condition code. We treat this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   192
  // part of the PSW as a condition register CR. It consists of 4
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   193
  // bits. Floating point instructions influence the same condition register CR.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   194
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   195
  reg_def Z_CR(SOC, SOC, Op_RegFlags, 0, Z_CR->as_VMReg());   // volatile
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   197
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   198
// Specify priority of register selection within phases of register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   199
// allocation. Highest priority is first. A useful heuristic is to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   200
// give registers a low priority when they are required by machine
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   201
// instructions, and choose no-save registers before save-on-call, and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   202
// save-on-call before save-on-entry. Registers which participate in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   203
// fix calling sequences should come last. Registers which are used
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   204
// as pairs must fall on an even boundary.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   205
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   206
// It's worth about 1% on SPEC geomean to get this right.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   207
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   208
// Chunk0, chunk1, and chunk2 form the MachRegisterNumbers enumeration
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   209
// in adGlobals_s390.hpp which defines the <register>_num values, e.g.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   210
// Z_R3_num. Therefore, Z_R3_num may not be (and in reality is not)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   211
// the same as Z_R3->encoding()! Furthermore, we cannot make any
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   212
// assumptions on ordering, e.g. Z_R3_num may be less than Z_R2_num.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   213
// Additionally, the function
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   214
//   static enum RC rc_class(OptoReg::Name reg)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   215
// maps a given <register>_num value to its chunk type (except for flags)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   216
// and its current implementation relies on chunk0 and chunk1 having a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   217
// size of 64 each.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   218
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   219
alloc_class chunk0(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   220
  // chunk0 contains *all* 32 integer registers halves.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   221
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   222
  // potential SOE regs
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   223
  Z_R13,Z_R13_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   224
  Z_R12,Z_R12_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   225
  Z_R11,Z_R11_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   226
  Z_R10,Z_R10_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   227
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   228
  Z_R9,Z_R9_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   229
  Z_R8,Z_R8_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   230
  Z_R7,Z_R7_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   231
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   232
  Z_R1,Z_R1_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   233
  Z_R0,Z_R0_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   234
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   235
  // argument registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   236
  Z_R6,Z_R6_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   237
  Z_R5,Z_R5_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   238
  Z_R4,Z_R4_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   239
  Z_R3,Z_R3_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   240
  Z_R2,Z_R2_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   241
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   242
  // special registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   243
  Z_R14,Z_R14_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   244
  Z_R15,Z_R15_H
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   245
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   246
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   247
alloc_class chunk1(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   248
  // Chunk1 contains *all* 64 floating-point registers halves.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   249
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   250
  Z_F15,Z_F15_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   251
  Z_F14,Z_F14_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   252
  Z_F13,Z_F13_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   253
  Z_F12,Z_F12_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   254
  Z_F11,Z_F11_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   255
  Z_F10,Z_F10_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   256
  Z_F9,Z_F9_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   257
  Z_F8,Z_F8_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   258
  // scratch register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   259
  Z_F7,Z_F7_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   260
  Z_F5,Z_F5_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   261
  Z_F3,Z_F3_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   262
  Z_F1,Z_F1_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   263
  // argument registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   264
  Z_F6,Z_F6_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   265
  Z_F4,Z_F4_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   266
  Z_F2,Z_F2_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   267
  Z_F0,Z_F0_H
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   268
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   269
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   270
alloc_class chunk2(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   271
  Z_CR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   272
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   273
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   274
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   275
//-------Architecture Description Register Classes-----------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   276
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   277
// Several register classes are automatically defined based upon
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   278
// information in this architecture description.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   279
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   280
// 1) reg_class inline_cache_reg           (as defined in frame section)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   281
// 2) reg_class compiler_method_oop_reg    (as defined in frame section)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   282
// 2) reg_class interpreter_method_oop_reg (as defined in frame section)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   283
// 3) reg_class stack_slots(/* one chunk of stack-based "registers" */)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   284
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   285
// Integer Register Classes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   286
reg_class z_int_reg(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   287
/*Z_R0*/              // R0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   288
/*Z_R1*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   289
  Z_R2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   290
  Z_R3,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   291
  Z_R4,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   292
  Z_R5,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   293
  Z_R6,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   294
  Z_R7,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   295
/*Z_R8,*/             // Z_thread
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   296
  Z_R9,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   297
  Z_R10,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   298
  Z_R11,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   299
  Z_R12,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   300
  Z_R13
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   301
/*Z_R14*/             // return_pc
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   302
/*Z_R15*/             // SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   303
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   304
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   305
reg_class z_no_odd_int_reg(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   306
/*Z_R0*/              // R0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   307
/*Z_R1*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   308
  Z_R2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   309
  Z_R3,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   310
  Z_R4,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   311
/*Z_R5,*/             // odd part of fix register pair
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   312
  Z_R6,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   313
  Z_R7,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   314
/*Z_R8,*/             // Z_thread
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   315
  Z_R9,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   316
  Z_R10,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   317
  Z_R11,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   318
  Z_R12,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   319
  Z_R13
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   320
/*Z_R14*/             // return_pc
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   321
/*Z_R15*/             // SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   322
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   323
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   324
reg_class z_no_arg_int_reg(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   325
/*Z_R0*/              // R0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   326
/*Z_R1*/              // scratch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   327
/*Z_R2*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   328
/*Z_R3*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   329
/*Z_R4*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   330
/*Z_R5*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   331
/*Z_R6*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   332
  Z_R7,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   333
/*Z_R8*/              // Z_thread
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   334
  Z_R9,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   335
  Z_R10,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   336
  Z_R11,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   337
  Z_R12,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   338
  Z_R13
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   339
/*Z_R14*/             // return_pc
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   340
/*Z_R15*/             // SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   341
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   342
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   343
reg_class z_rarg1_int_reg(Z_R2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   344
reg_class z_rarg2_int_reg(Z_R3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   345
reg_class z_rarg3_int_reg(Z_R4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   346
reg_class z_rarg4_int_reg(Z_R5);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   347
reg_class z_rarg5_int_reg(Z_R6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   348
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   349
// Pointer Register Classes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   350
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   351
// 64-bit build means 64-bit pointers means hi/lo pairs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   352
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   353
reg_class z_rarg5_ptrN_reg(Z_R6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   354
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   355
reg_class z_rarg1_ptr_reg(Z_R2_H,Z_R2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   356
reg_class z_rarg2_ptr_reg(Z_R3_H,Z_R3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   357
reg_class z_rarg3_ptr_reg(Z_R4_H,Z_R4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   358
reg_class z_rarg4_ptr_reg(Z_R5_H,Z_R5);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   359
reg_class z_rarg5_ptr_reg(Z_R6_H,Z_R6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   360
reg_class z_thread_ptr_reg(Z_R8_H,Z_R8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   361
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   362
reg_class z_ptr_reg(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   363
/*Z_R0_H,Z_R0*/     // R0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   364
/*Z_R1_H,Z_R1*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   365
  Z_R2_H,Z_R2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   366
  Z_R3_H,Z_R3,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   367
  Z_R4_H,Z_R4,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   368
  Z_R5_H,Z_R5,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   369
  Z_R6_H,Z_R6,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   370
  Z_R7_H,Z_R7,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   371
/*Z_R8_H,Z_R8,*/    // Z_thread
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   372
  Z_R9_H,Z_R9,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   373
  Z_R10_H,Z_R10,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   374
  Z_R11_H,Z_R11,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   375
  Z_R12_H,Z_R12,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   376
  Z_R13_H,Z_R13
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   377
/*Z_R14_H,Z_R14*/   // return_pc
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   378
/*Z_R15_H,Z_R15*/   // SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   379
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   380
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   381
reg_class z_lock_ptr_reg(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   382
/*Z_R0_H,Z_R0*/     // R0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   383
/*Z_R1_H,Z_R1*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   384
  Z_R2_H,Z_R2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   385
  Z_R3_H,Z_R3,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   386
  Z_R4_H,Z_R4,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   387
/*Z_R5_H,Z_R5,*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   388
/*Z_R6_H,Z_R6,*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   389
  Z_R7_H,Z_R7,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   390
/*Z_R8_H,Z_R8,*/    // Z_thread
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   391
  Z_R9_H,Z_R9,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   392
  Z_R10_H,Z_R10,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   393
  Z_R11_H,Z_R11,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   394
  Z_R12_H,Z_R12,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   395
  Z_R13_H,Z_R13
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   396
/*Z_R14_H,Z_R14*/   // return_pc
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   397
/*Z_R15_H,Z_R15*/   // SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   398
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   399
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   400
reg_class z_no_arg_ptr_reg(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   401
/*Z_R0_H,Z_R0*/        // R0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   402
/*Z_R1_H,Z_R1*/        // scratch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   403
/*Z_R2_H,Z_R2*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   404
/*Z_R3_H,Z_R3*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   405
/*Z_R4_H,Z_R4*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   406
/*Z_R5_H,Z_R5*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   407
/*Z_R6_H,Z_R6*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   408
  Z_R7_H, Z_R7,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   409
/*Z_R8_H,Z_R8*/        // Z_thread
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   410
  Z_R9_H,Z_R9,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   411
  Z_R10_H,Z_R10,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   412
  Z_R11_H,Z_R11,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   413
  Z_R12_H,Z_R12,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   414
  Z_R13_H,Z_R13
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   415
/*Z_R14_H,Z_R14*/      // return_pc
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   416
/*Z_R15_H,Z_R15*/      // SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   417
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   418
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   419
// Special class for storeP instructions, which can store SP or RPC to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   420
// TLS. (Note: Do not generalize this to "any_reg". If you add
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   421
// another register, such as FP, to this mask, the allocator may try
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   422
// to put a temp in it.)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   423
// Register class for memory access base registers,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   424
// This class is a superset of z_ptr_reg including Z_thread.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   425
reg_class z_memory_ptr_reg(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   426
/*Z_R0_H,Z_R0*/     // R0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   427
/*Z_R1_H,Z_R1*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   428
  Z_R2_H,Z_R2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   429
  Z_R3_H,Z_R3,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   430
  Z_R4_H,Z_R4,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   431
  Z_R5_H,Z_R5,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   432
  Z_R6_H,Z_R6,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   433
  Z_R7_H,Z_R7,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   434
  Z_R8_H,Z_R8,      // Z_thread
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   435
  Z_R9_H,Z_R9,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   436
  Z_R10_H,Z_R10,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   437
  Z_R11_H,Z_R11,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   438
  Z_R12_H,Z_R12,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   439
  Z_R13_H,Z_R13
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   440
/*Z_R14_H,Z_R14*/   // return_pc
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   441
/*Z_R15_H,Z_R15*/   // SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   442
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   443
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   444
// Other special pointer regs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   445
reg_class z_r1_regP(Z_R1_H,Z_R1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   446
reg_class z_r9_regP(Z_R9_H,Z_R9);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   447
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   448
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   449
// Long Register Classes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   450
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   451
reg_class z_rarg1_long_reg(Z_R2_H,Z_R2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   452
reg_class z_rarg2_long_reg(Z_R3_H,Z_R3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   453
reg_class z_rarg3_long_reg(Z_R4_H,Z_R4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   454
reg_class z_rarg4_long_reg(Z_R5_H,Z_R5);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   455
reg_class z_rarg5_long_reg(Z_R6_H,Z_R6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   456
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   457
// Longs in 1 register. Aligned adjacent hi/lo pairs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   458
reg_class z_long_reg(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   459
/*Z_R0_H,Z_R0*/     // R0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   460
/*Z_R1_H,Z_R1*/
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   461
  Z_R2_H,Z_R2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   462
  Z_R3_H,Z_R3,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   463
  Z_R4_H,Z_R4,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   464
  Z_R5_H,Z_R5,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   465
  Z_R6_H,Z_R6,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   466
  Z_R7_H,Z_R7,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   467
/*Z_R8_H,Z_R8,*/    // Z_thread
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   468
  Z_R9_H,Z_R9,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   469
  Z_R10_H,Z_R10,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   470
  Z_R11_H,Z_R11,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   471
  Z_R12_H,Z_R12,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   472
  Z_R13_H,Z_R13
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   473
/*Z_R14_H,Z_R14,*/  // return_pc
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   474
/*Z_R15_H,Z_R15*/   // SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   475
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   476
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   477
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   478
// Special Class for Condition Code Flags Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   479
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   480
reg_class z_condition_reg(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   481
  Z_CR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   482
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   483
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   484
// Scratch register for late profiling. Callee saved.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   485
reg_class z_rscratch2_bits64_reg(Z_R2_H, Z_R2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   486
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   487
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   488
// Float Register Classes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   489
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   490
reg_class z_flt_reg(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   491
  Z_F0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   492
/*Z_F1,*/ // scratch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   493
  Z_F2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   494
  Z_F3,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   495
  Z_F4,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   496
  Z_F5,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   497
  Z_F6,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   498
  Z_F7,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   499
  Z_F8,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   500
  Z_F9,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   501
  Z_F10,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   502
  Z_F11,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   503
  Z_F12,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   504
  Z_F13,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   505
  Z_F14,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   506
  Z_F15
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   507
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   508
reg_class z_rscratch1_flt_reg(Z_F1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   509
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   510
// Double precision float registers have virtual `high halves' that
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   511
// are needed by the allocator.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   512
reg_class z_dbl_reg(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   513
  Z_F0,Z_F0_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   514
/*Z_F1,Z_F1_H,*/ // scratch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   515
  Z_F2,Z_F2_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   516
  Z_F3,Z_F3_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   517
  Z_F4,Z_F4_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   518
  Z_F5,Z_F5_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   519
  Z_F6,Z_F6_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   520
  Z_F7,Z_F7_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   521
  Z_F8,Z_F8_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   522
  Z_F9,Z_F9_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   523
  Z_F10,Z_F10_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   524
  Z_F11,Z_F11_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   525
  Z_F12,Z_F12_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   526
  Z_F13,Z_F13_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   527
  Z_F14,Z_F14_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   528
  Z_F15,Z_F15_H
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   529
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   530
reg_class z_rscratch1_dbl_reg(Z_F1,Z_F1_H);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   531
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   532
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   533
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   534
//----------DEFINITION BLOCK---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   535
// Define 'name --> value' mappings to inform the ADLC of an integer valued name.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   536
// Current support includes integer values in the range [0, 0x7FFFFFFF].
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   537
// Format:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   538
//        int_def  <name>         (<int_value>, <expression>);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   539
// Generated Code in ad_<arch>.hpp
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   540
//        #define  <name>   (<expression>)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   541
//        // value == <int_value>
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   542
// Generated code in ad_<arch>.cpp adlc_verification()
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   543
//        assert(<name> == <int_value>, "Expect (<expression>) to equal <int_value>");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   544
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   545
definitions %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   546
  // The default cost (of an ALU instruction).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   547
  int_def DEFAULT_COST      (   100,     100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   548
  int_def DEFAULT_COST_LOW  (    80,      80);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   549
  int_def DEFAULT_COST_HIGH (   120,     120);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   550
  int_def HUGE_COST         (1000000, 1000000);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   551
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   552
  // Put an advantage on REG_MEM vs. MEM+REG_REG operations.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   553
  int_def ALU_REG_COST      (   100, DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   554
  int_def ALU_MEMORY_COST   (   150,          150);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   555
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   556
  // Memory refs are twice as expensive as run-of-the-mill.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   557
  int_def MEMORY_REF_COST_HI (   220, 2 * DEFAULT_COST+20);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   558
  int_def MEMORY_REF_COST    (   200, 2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   559
  int_def MEMORY_REF_COST_LO (   180, 2 * DEFAULT_COST-20);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   560
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   561
  // Branches are even more expensive.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   562
  int_def BRANCH_COST       (   300, DEFAULT_COST * 3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   563
  int_def CALL_COST         (   300, DEFAULT_COST * 3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   564
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   565
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   566
source %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   567
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   568
#ifdef PRODUCT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   569
#define BLOCK_COMMENT(str)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   570
#define BIND(label)        __ bind(label)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   571
#else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   572
#define BLOCK_COMMENT(str) __ block_comment(str)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   573
#define BIND(label)        __ bind(label); BLOCK_COMMENT(#label ":")
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   574
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   575
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   576
#define __ _masm.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   577
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   578
#define Z_DISP_SIZE Immediate::is_uimm12((long)opnd_array(1)->disp(ra_,this,2)) ?  4 : 6
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   579
#define Z_DISP3_SIZE 6
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   580
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   581
// Tertiary op of a LoadP or StoreP encoding.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   582
#define REGP_OP true
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   583
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   584
// Given a register encoding, produce an Integer Register object.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   585
static Register reg_to_register_object(int register_encoding);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   586
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   587
// ****************************************************************************
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   588
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   589
// REQUIRED FUNCTIONALITY
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   590
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   591
// !!!!! Special hack to get all type of calls to specify the byte offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   592
//       from the start of the call to the point where the return address
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   593
//       will point.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   594
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   595
int MachCallStaticJavaNode::ret_addr_offset() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   596
  if (_method) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   597
    return 8;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   598
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   599
    return MacroAssembler::call_far_patchable_ret_addr_offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   600
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   601
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   602
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   603
int MachCallDynamicJavaNode::ret_addr_offset() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   604
  // Consider size of receiver type profiling (C2 tiers).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   605
  int profile_receiver_type_size = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   606
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   607
  int vtable_index = this->_vtable_index;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   608
  if (vtable_index == -4) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   609
    return 14 + profile_receiver_type_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   610
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   611
    assert(!UseInlineCaches, "expect vtable calls only if not using ICs");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   612
    return 36 + profile_receiver_type_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   613
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   614
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   615
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   616
int MachCallRuntimeNode::ret_addr_offset() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   617
  return 12 + MacroAssembler::call_far_patchable_ret_addr_offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   618
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   619
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   620
// Compute padding required for nodes which need alignment
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   621
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   622
// The addresses of the call instructions needs to be 4-byte aligned to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   623
// ensure that they don't span a cache line so that they are atomically patchable.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   624
// The actual calls get emitted at different offsets within the node emitters.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   625
// ins_alignment needs to be set to 2 which means that up to 1 nop may get inserted.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   626
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   627
int CallStaticJavaDirect_dynTOCNode::compute_padding(int current_offset) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   628
  return (0 - current_offset) & 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   629
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   630
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   631
int CallDynamicJavaDirect_dynTOCNode::compute_padding(int current_offset) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   632
  return (6 - current_offset) & 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   633
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   634
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   635
int CallRuntimeDirectNode::compute_padding(int current_offset) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   636
  return (12 - current_offset) & 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   637
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   638
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   639
int CallLeafDirectNode::compute_padding(int current_offset) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   640
  return (12 - current_offset) & 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   641
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   642
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   643
int CallLeafNoFPDirectNode::compute_padding(int current_offset) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   644
  return (12 - current_offset) & 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   645
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   646
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   647
// Indicate if the safepoint node needs the polling page as an input.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   648
// Since z/Architecture does not have absolute addressing, it does.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   649
bool SafePointNode::needs_polling_address_input() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   650
  return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   651
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   652
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   653
void emit_nop(CodeBuffer &cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   654
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   655
  __ z_nop();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   656
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   657
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   658
// Emit an interrupt that is caught by the debugger (for debugging compiler).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   659
void emit_break(CodeBuffer &cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   660
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   661
  __ z_illtrap();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   662
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   663
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   664
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   665
void MachBreakpointNode::format(PhaseRegAlloc *, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   666
  os->print("TA");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   667
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   668
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   669
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   670
void MachBreakpointNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   671
  emit_break(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   672
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   673
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   674
uint MachBreakpointNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   675
  return MachNode::size(ra_);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   676
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   677
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   678
static inline void z_emit16(CodeBuffer &cbuf, long value) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   679
  // 32bit instructions may become sign extended.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   680
  assert(value >= 0, "unintended sign extension (int->long)");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   681
  assert(value < (1L << 16), "instruction too large");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   682
  *((unsigned short*)(cbuf.insts_end())) = (unsigned short)value;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   683
  cbuf.set_insts_end(cbuf.insts_end() + sizeof(unsigned short));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   684
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   685
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   686
static inline void z_emit32(CodeBuffer &cbuf, long value) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   687
  // 32bit instructions may become sign extended.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   688
  assert(value < (1L << 32), "instruction too large");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   689
  *((unsigned int*)(cbuf.insts_end())) = (unsigned int)value;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   690
  cbuf.set_insts_end(cbuf.insts_end() + sizeof(unsigned int));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   691
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   692
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   693
static inline void z_emit48(CodeBuffer &cbuf, long value) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   694
  // 32bit instructions may become sign extended.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   695
  assert(value >= 0, "unintended sign extension (int->long)");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   696
  assert(value < (1L << 48), "instruction too large");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   697
  value = value<<16;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   698
  memcpy(cbuf.insts_end(), (unsigned char*)&value, 6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   699
  cbuf.set_insts_end(cbuf.insts_end() + 6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   700
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   701
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   702
static inline unsigned int z_emit_inst(CodeBuffer &cbuf, long value) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   703
  if (value < 0) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   704
    // There obviously has been an unintended sign extension (int->long). Revert it.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   705
    value = (long)((unsigned long)((unsigned int)value));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   706
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   707
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   708
  if (value < (1L << 16)) { // 2-byte instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   709
    z_emit16(cbuf, value);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   710
    return 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   711
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   712
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   713
  if (value < (1L << 32)) { // 4-byte instruction, might be unaligned store
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   714
    z_emit32(cbuf, value);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   715
    return 4;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   716
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   717
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   718
  // 6-byte instruction, probably unaligned store.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   719
  z_emit48(cbuf, value);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   720
  return 6;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   721
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   722
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   723
// Check effective address (at runtime) for required alignment.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   724
static inline void z_assert_aligned(CodeBuffer &cbuf, int disp, Register index, Register base, int alignment) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   725
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   726
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   727
  __ z_lay(Z_R0, disp, index, base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   728
  __ z_nill(Z_R0, alignment-1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   729
  __ z_brc(Assembler::bcondEqual, +3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   730
  __ z_illtrap();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   731
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   732
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   733
int emit_call_reloc(MacroAssembler &_masm, intptr_t entry_point, relocInfo::relocType rtype,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   734
                    PhaseRegAlloc* ra_, bool is_native_call = false) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   735
  __ set_inst_mark(); // Used in z_enc_java_static_call() and emit_java_to_interp().
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   736
  address old_mark = __ inst_mark();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   737
  unsigned int start_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   738
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   739
  if (is_native_call) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   740
    ShouldNotReachHere();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   741
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   742
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   743
  if (rtype == relocInfo::runtime_call_w_cp_type) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   744
    assert((__ offset() & 2) == 0, "misaligned emit_call_reloc");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   745
    address call_addr = __ call_c_opt((address)entry_point);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   746
    if (call_addr == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   747
      Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   748
      return -1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   749
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   750
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   751
    assert(rtype == relocInfo::none || rtype == relocInfo::opt_virtual_call_type ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   752
           rtype == relocInfo::static_call_type, "unexpected rtype");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   753
    __ relocate(rtype);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   754
    // BRASL must be prepended with a nop to identify it in the instruction stream.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   755
    __ z_nop();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   756
    __ z_brasl(Z_R14, (address)entry_point);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   757
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   758
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   759
  unsigned int ret_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   760
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   761
  return (ret_off - start_off);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   762
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   763
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   764
static int emit_call_reloc(MacroAssembler &_masm, intptr_t entry_point, RelocationHolder const& rspec) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   765
  __ set_inst_mark(); // Used in z_enc_java_static_call() and emit_java_to_interp().
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   766
  address old_mark = __ inst_mark();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   767
  unsigned int start_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   768
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   769
  relocInfo::relocType rtype = rspec.type();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   770
  assert(rtype == relocInfo::opt_virtual_call_type || rtype == relocInfo::static_call_type,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   771
         "unexpected rtype");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   772
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   773
  __ relocate(rspec);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   774
  __ z_nop();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   775
  __ z_brasl(Z_R14, (address)entry_point);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   776
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   777
  unsigned int ret_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   778
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   779
  return (ret_off - start_off);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   780
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   781
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   782
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   783
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   784
const RegMask& MachConstantBaseNode::_out_RegMask = _Z_PTR_REG_mask;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   785
int Compile::ConstantTable::calculate_table_base_offset() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   786
  return 0;  // absolute addressing, no offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   787
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   788
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   789
bool MachConstantBaseNode::requires_postalloc_expand() const { return false; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   790
void MachConstantBaseNode::postalloc_expand(GrowableArray <Node *> *nodes, PhaseRegAlloc *ra_) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   791
  ShouldNotReachHere();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   792
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   793
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   794
// Even with PC-relative TOC addressing, we still need this node.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   795
// Float loads/stores do not support PC-relative addresses.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   796
void MachConstantBaseNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   797
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   798
  Register Rtoc = as_Register(ra_->get_encode(this));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   799
  __ load_toc(Rtoc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   800
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   801
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   802
uint MachConstantBaseNode::size(PhaseRegAlloc* ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   803
  // PCrelative TOC access.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   804
  return 6;   // sizeof(LARL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   805
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   806
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   807
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   808
void MachConstantBaseNode::format(PhaseRegAlloc* ra_, outputStream* st) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   809
  Register r = as_Register(ra_->get_encode(this));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   810
  st->print("LARL    %s,&constant_pool # MachConstantBaseNode", r->name());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   811
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   812
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   813
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   814
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   815
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   816
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   817
void MachPrologNode::format(PhaseRegAlloc *ra_, outputStream *st) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   818
  Compile* C = ra_->C;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   819
  st->print_cr("--- MachPrologNode ---");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   820
  st->print("\t");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   821
  for (int i = 0; i < OptoPrologueNops; i++) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   822
    st->print_cr("NOP"); st->print("\t");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   823
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   824
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   825
  if (VerifyThread) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   826
    st->print_cr("Verify_Thread");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   827
    st->print("\t");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   828
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   829
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   830
  long framesize = C->frame_size_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   831
  int bangsize   = C->bang_size_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   832
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   833
  // Calls to C2R adapters often do not accept exceptional returns.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   834
  // We require that their callers must bang for them. But be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   835
  // careful, because some VM calls (such as call site linkage) can
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   836
  // use several kilobytes of stack. But the stack safety zone should
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   837
  // account for that. See bugs 4446381, 4468289, 4497237.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   838
  if (C->need_stack_bang(bangsize) && UseStackBanging) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   839
    st->print_cr("# stack bang"); st->print("\t");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   840
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   841
  st->print_cr("push_frame %d", (int)-framesize);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   842
  st->print("\t");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   843
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   844
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   845
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   846
void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   847
  Compile* C = ra_->C;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   848
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   849
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   850
  __ verify_thread();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   851
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   852
  size_t framesize = C->frame_size_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   853
  size_t bangsize  = C->bang_size_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   854
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   855
  assert(framesize % wordSize == 0, "must preserve wordSize alignment");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   856
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   857
  // Calls to C2R adapters often do not accept exceptional returns.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   858
  // We require that their callers must bang for them. But be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   859
  // careful, because some VM calls (such as call site linkage) can
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   860
  // use several kilobytes of stack. But the stack safety zone should
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   861
  // account for that. See bugs 4446381, 4468289, 4497237.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   862
  if (C->need_stack_bang(bangsize) && UseStackBanging) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   863
    __ generate_stack_overflow_check(bangsize);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   864
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   865
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   866
  assert(Immediate::is_uimm32((long)framesize), "to do: choose suitable types!");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   867
  __ save_return_pc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   868
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   869
  // The z/Architecture abi is already accounted for in `framesize' via the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   870
  // 'out_preserve_stack_slots' declaration.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   871
  __ push_frame((unsigned int)framesize/*includes JIT ABI*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   872
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   873
  if (C->has_mach_constant_base_node()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   874
    // NOTE: We set the table base offset here because users might be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   875
    // emitted before MachConstantBaseNode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   876
    Compile::ConstantTable& constant_table = C->constant_table();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   877
    constant_table.set_table_base_offset(constant_table.calculate_table_base_offset());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   878
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   879
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   880
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   881
uint MachPrologNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   882
  // Variable size. Determine dynamically.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   883
  return MachNode::size(ra_);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   884
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   885
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   886
int MachPrologNode::reloc() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   887
  // Return number of relocatable values contained in this instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   888
  return 1; // One reloc entry for load_const(toc).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   889
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   890
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   891
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   892
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   893
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   894
void MachEpilogNode::format(PhaseRegAlloc *ra_, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   895
  os->print_cr("epilog");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   896
  os->print("\t");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   897
  if (do_polling() && ra_->C->is_method_compilation()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   898
    os->print_cr("load_from_polling_page Z_R1_scratch");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   899
    os->print("\t");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   900
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   901
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   902
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   903
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   904
void MachEpilogNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   905
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   906
  Compile* C = ra_->C;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   907
  __ verify_thread();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   908
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   909
  // If this does safepoint polling, then do it here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   910
  bool need_polling = do_polling() && C->is_method_compilation();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   911
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   912
  // Pop frame, restore return_pc, and all stuff needed by interpreter.
43420
a056d6465ef9 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
goetz
parents: 42897
diff changeset
   913
  // Pop frame by add instead of load (a penny saved is a penny got :-).
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   914
  int frame_size_in_bytes = Assembler::align((C->frame_slots() << LogBytesPerInt), frame::alignment_in_bytes);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   915
  int retPC_offset        = frame_size_in_bytes + _z_abi16(return_pc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   916
  if (Displacement::is_validDisp(retPC_offset)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   917
    __ z_lg(Z_R14, retPC_offset, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   918
    __ add2reg(Z_SP, frame_size_in_bytes);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   919
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   920
    __ add2reg(Z_SP, frame_size_in_bytes);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   921
    __ restore_return_pc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   922
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   923
43420
a056d6465ef9 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
goetz
parents: 42897
diff changeset
   924
  if (StackReservedPages > 0 && C->has_reserved_stack_access()) {
a056d6465ef9 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
goetz
parents: 42897
diff changeset
   925
    __ reserved_stack_check(Z_R14);
a056d6465ef9 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
goetz
parents: 42897
diff changeset
   926
  }
a056d6465ef9 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
goetz
parents: 42897
diff changeset
   927
a056d6465ef9 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
goetz
parents: 42897
diff changeset
   928
  // Touch the polling page.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   929
  if (need_polling) {
43420
a056d6465ef9 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
goetz
parents: 42897
diff changeset
   930
    AddressLiteral pp(os::get_polling_page());
a056d6465ef9 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
goetz
parents: 42897
diff changeset
   931
    __ load_const_optimized(Z_R1_scratch, pp);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   932
    // We need to mark the code position where the load from the safepoint
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   933
    // polling page was emitted as relocInfo::poll_return_type here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   934
    __ relocate(relocInfo::poll_return_type);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   935
    __ load_from_polling_page(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   936
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   937
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   938
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   939
uint MachEpilogNode::size(PhaseRegAlloc *ra_) const {
43420
a056d6465ef9 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
goetz
parents: 42897
diff changeset
   940
  // Variable size. determine dynamically.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   941
  return MachNode::size(ra_);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   942
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   943
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   944
int MachEpilogNode::reloc() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   945
  // Return number of relocatable values contained in this instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   946
  return 1; // One for load_from_polling_page.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   947
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   948
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   949
const Pipeline * MachEpilogNode::pipeline() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   950
  return MachNode::pipeline_class();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   951
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   952
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   953
int MachEpilogNode::safepoint_offset() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   954
  assert(do_polling(), "no return for this epilog node");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   955
  return 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   956
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   957
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   958
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   959
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   960
// Figure out which register class each belongs in: rc_int, rc_float, rc_stack.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   961
enum RC { rc_bad, rc_int, rc_float, rc_stack };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   962
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   963
static enum RC rc_class(OptoReg::Name reg) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   964
  // Return the register class for the given register. The given register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   965
  // reg is a <register>_num value, which is an index into the MachRegisterNumbers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   966
  // enumeration in adGlobals_s390.hpp.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   967
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   968
  if (reg == OptoReg::Bad) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   969
    return rc_bad;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   970
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   971
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   972
  // We have 32 integer register halves, starting at index 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   973
  if (reg < 32) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   974
    return rc_int;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   975
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   976
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   977
  // We have 32 floating-point register halves, starting at index 32.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   978
  if (reg < 32+32) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   979
    return rc_float;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   980
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   981
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   982
  // Between float regs & stack are the flags regs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   983
  assert(reg >= OptoReg::stack0(), "blow up if spilling flags");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   984
  return rc_stack;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   985
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   986
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   987
// Returns size as obtained from z_emit_instr.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   988
static unsigned int z_ld_st_helper(CodeBuffer *cbuf, const char *op_str, unsigned long opcode,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   989
                                   int reg, int offset, bool do_print, outputStream *os) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   990
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   991
  if (cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   992
    if (opcode > (1L<<32)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   993
      return z_emit_inst(*cbuf, opcode | Assembler::reg(Matcher::_regEncode[reg], 8, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   994
                         Assembler::simm20(offset) | Assembler::reg(Z_R0, 12, 48) | Assembler::regz(Z_SP, 16, 48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   995
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   996
      return z_emit_inst(*cbuf, opcode | Assembler::reg(Matcher::_regEncode[reg], 8, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   997
                         Assembler::uimm12(offset, 20, 32) | Assembler::reg(Z_R0, 12, 32) | Assembler::regz(Z_SP, 16, 32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   998
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   999
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1000
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1001
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1002
  if (do_print) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1003
    os->print("%s    %s,#%d[,SP]\t # MachCopy spill code",op_str, Matcher::regName[reg], offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1004
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1005
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1006
  return (opcode > (1L << 32)) ? 6 : 4;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1007
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1008
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1009
static unsigned int z_mvc_helper(CodeBuffer *cbuf, int len, int dst_off, int src_off, bool do_print, outputStream *os) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1010
  if (cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1011
    MacroAssembler _masm(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1012
    __ z_mvc(dst_off, len-1, Z_SP, src_off, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1013
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1014
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1015
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1016
  else if (do_print) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1017
    os->print("MVC     %d(%d,SP),%d(SP)\t # MachCopy spill code",dst_off, len, src_off);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1018
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1019
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1020
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1021
  return 6;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1022
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1023
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1024
uint MachSpillCopyNode::implementation(CodeBuffer *cbuf, PhaseRegAlloc *ra_, bool do_size, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1025
  // Get registers to move.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1026
  OptoReg::Name src_hi = ra_->get_reg_second(in(1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1027
  OptoReg::Name src_lo = ra_->get_reg_first(in(1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1028
  OptoReg::Name dst_hi = ra_->get_reg_second(this);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1029
  OptoReg::Name dst_lo = ra_->get_reg_first(this);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1030
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1031
  enum RC src_hi_rc = rc_class(src_hi);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1032
  enum RC src_lo_rc = rc_class(src_lo);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1033
  enum RC dst_hi_rc = rc_class(dst_hi);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1034
  enum RC dst_lo_rc = rc_class(dst_lo);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1035
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1036
  assert(src_lo != OptoReg::Bad && dst_lo != OptoReg::Bad, "must move at least 1 register");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1037
  bool is64 = (src_hi_rc != rc_bad);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1038
  assert(!is64 ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1039
         ((src_lo&1) == 0 && src_lo+1 == src_hi && (dst_lo&1) == 0 && dst_lo+1 == dst_hi),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1040
         "expected aligned-adjacent pairs");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1041
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1042
  // Generate spill code!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1043
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1044
  if (src_lo == dst_lo && src_hi == dst_hi) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1045
    return 0;            // Self copy, no move.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1046
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1047
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1048
  int  src_offset = ra_->reg2offset(src_lo);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1049
  int  dst_offset = ra_->reg2offset(dst_lo);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1050
  bool print = !do_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1051
  bool src12 = Immediate::is_uimm12(src_offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1052
  bool dst12 = Immediate::is_uimm12(dst_offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1053
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1054
  const char   *mnemo = NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1055
  unsigned long opc = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1056
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1057
  // Memory->Memory Spill. Use Z_R0 to hold the value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1058
  if (src_lo_rc == rc_stack && dst_lo_rc == rc_stack) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1059
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1060
    assert(!is64 || (src_hi_rc==rc_stack && dst_hi_rc==rc_stack),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1061
           "expected same type of move for high parts");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1062
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1063
    if (src12 && dst12) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1064
      return z_mvc_helper(cbuf, is64 ? 8 : 4, dst_offset, src_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1065
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1066
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1067
    int r0 = Z_R0_num;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1068
    if (is64) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1069
      return z_ld_st_helper(cbuf, "LG  ", LG_ZOPC, r0, src_offset, print, os) +
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1070
             z_ld_st_helper(cbuf, "STG ", STG_ZOPC, r0, dst_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1071
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1072
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1073
    return z_ld_st_helper(cbuf, "LY   ", LY_ZOPC, r0, src_offset, print, os) +
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1074
           z_ld_st_helper(cbuf, "STY  ", STY_ZOPC, r0, dst_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1075
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1076
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1077
  // Check for float->int copy. Requires a trip through memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1078
  if (src_lo_rc == rc_float && dst_lo_rc == rc_int) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1079
    Unimplemented();  // Unsafe, do not remove!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1080
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1081
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1082
  // Check for integer reg-reg copy.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1083
  if (src_lo_rc == rc_int && dst_lo_rc == rc_int) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1084
    if (cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1085
      MacroAssembler _masm(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1086
      Register Rsrc = as_Register(Matcher::_regEncode[src_lo]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1087
      Register Rdst = as_Register(Matcher::_regEncode[dst_lo]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1088
      __ z_lgr(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1089
      return 4;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1090
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1091
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1092
    // else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1093
    if (print) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1094
      os->print("LGR     %s,%s\t # MachCopy spill code", Matcher::regName[dst_lo], Matcher::regName[src_lo]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1095
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1096
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1097
    return 4;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1098
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1099
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1100
  // Check for integer store.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1101
  if (src_lo_rc == rc_int && dst_lo_rc == rc_stack) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1102
    assert(!is64 || (src_hi_rc==rc_int && dst_hi_rc==rc_stack),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1103
           "expected same type of move for high parts");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1104
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1105
    if (is64) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1106
      return z_ld_st_helper(cbuf, "STG ", STG_ZOPC, src_lo, dst_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1107
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1108
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1109
    // else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1110
    mnemo = dst12 ? "ST  " : "STY ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1111
    opc = dst12 ? ST_ZOPC : STY_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1112
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1113
    return z_ld_st_helper(cbuf, mnemo, opc, src_lo, dst_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1114
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1115
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1116
  // Check for integer load
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1117
  // Always load cOops zero-extended. That doesn't hurt int loads.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1118
  if (dst_lo_rc == rc_int && src_lo_rc == rc_stack) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1119
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1120
    assert(!is64 || (dst_hi_rc==rc_int && src_hi_rc==rc_stack),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1121
           "expected same type of move for high parts");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1122
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1123
    mnemo = is64 ? "LG  " : "LLGF";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1124
    opc = is64 ? LG_ZOPC : LLGF_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1125
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1126
    return z_ld_st_helper(cbuf, mnemo, opc, dst_lo, src_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1127
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1128
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1129
  // Check for float reg-reg copy.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1130
  if (src_lo_rc == rc_float && dst_lo_rc == rc_float) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1131
    if (cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1132
      MacroAssembler _masm(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1133
      FloatRegister Rsrc = as_FloatRegister(Matcher::_regEncode[src_lo]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1134
      FloatRegister Rdst = as_FloatRegister(Matcher::_regEncode[dst_lo]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1135
      __ z_ldr(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1136
      return 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1137
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1138
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1139
    // else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1140
    if (print) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1141
      os->print("LDR      %s,%s\t # MachCopy spill code", Matcher::regName[dst_lo], Matcher::regName[src_lo]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1142
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1143
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1144
    return 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1145
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1146
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1147
  // Check for float store.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1148
  if (src_lo_rc == rc_float && dst_lo_rc == rc_stack) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1149
    assert(!is64 || (src_hi_rc==rc_float && dst_hi_rc==rc_stack),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1150
           "expected same type of move for high parts");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1151
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1152
    if (is64) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1153
      mnemo = dst12 ? "STD  " : "STDY ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1154
      opc = dst12 ? STD_ZOPC : STDY_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1155
      return z_ld_st_helper(cbuf, mnemo, opc, src_lo, dst_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1156
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1157
    // else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1158
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1159
    mnemo = dst12 ? "STE  " : "STEY ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1160
    opc = dst12 ? STE_ZOPC : STEY_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1161
    return z_ld_st_helper(cbuf, mnemo, opc, src_lo, dst_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1162
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1163
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1164
  // Check for float load.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1165
  if (dst_lo_rc == rc_float && src_lo_rc == rc_stack) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1166
    assert(!is64 || (dst_hi_rc==rc_float && src_hi_rc==rc_stack),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1167
           "expected same type of move for high parts");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1168
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1169
    if (is64) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1170
      mnemo = src12 ? "LD   " : "LDY  ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1171
      opc = src12 ? LD_ZOPC : LDY_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1172
      return z_ld_st_helper(cbuf, mnemo, opc, dst_lo, src_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1173
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1174
    // else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1175
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1176
    mnemo = src12 ? "LE   " : "LEY  ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1177
    opc = src12 ? LE_ZOPC : LEY_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1178
    return z_ld_st_helper(cbuf, mnemo, opc, dst_lo, src_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1179
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1180
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1181
  // --------------------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1182
  // Check for hi bits still needing moving. Only happens for misaligned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1183
  // arguments to native calls.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1184
  if (src_hi == dst_hi) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1185
    return 0;               // Self copy, no move.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1186
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1187
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1188
  assert(is64 && dst_hi_rc != rc_bad, "src_hi & dst_hi cannot be Bad");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1189
  Unimplemented();  // Unsafe, do not remove!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1190
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1191
  return 0; // never reached, but make the compiler shut up!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1192
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1193
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1194
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1195
void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1196
  if (ra_ && ra_->node_regs_max_index() > 0) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1197
    implementation(NULL, ra_, false, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1198
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1199
    if (req() == 2 && in(1)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1200
      os->print("N%d = N%d\n", _idx, in(1)->_idx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1201
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1202
      const char *c = "(";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1203
      os->print("N%d = ", _idx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1204
      for (uint i = 1; i < req(); ++i) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1205
        os->print("%sN%d", c, in(i)->_idx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1206
        c = ", ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1207
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1208
      os->print(")");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1209
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1210
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1211
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1212
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1213
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1214
void MachSpillCopyNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1215
  implementation(&cbuf, ra_, false, NULL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1216
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1217
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1218
uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1219
  return implementation(NULL, ra_, true, NULL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1220
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1221
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1222
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1223
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1224
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1225
void MachNopNode::format(PhaseRegAlloc *, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1226
  os->print("NOP     # pad for alignment (%d nops, %d bytes)", _count, _count*MacroAssembler::nop_size());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1227
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1228
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1229
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1230
void MachNopNode::emit(CodeBuffer &cbuf, PhaseRegAlloc * ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1231
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1232
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1233
  int rem_space = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1234
  if (!(ra_->C->in_scratch_emit_size())) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1235
    rem_space = cbuf.insts()->remaining();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1236
    if (rem_space <= _count*2 + 8) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1237
      tty->print("NopNode: _count = %3.3d, remaining space before = %d", _count, rem_space);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1238
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1239
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1240
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1241
  for (int i = 0; i < _count; i++) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1242
    __ z_nop();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1243
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1244
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1245
  if (!(ra_->C->in_scratch_emit_size())) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1246
    if (rem_space <= _count*2 + 8) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1247
      int rem_space2 = cbuf.insts()->remaining();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1248
      tty->print_cr(", after = %d", rem_space2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1249
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1250
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1251
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1252
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1253
uint MachNopNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1254
   return 2 * _count;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1255
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1256
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1257
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1258
void BoxLockNode::format(PhaseRegAlloc *ra_, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1259
  int offset = ra_->reg2offset(in_RegMask(0).find_first_elem());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1260
  if (ra_ && ra_->node_regs_max_index() > 0) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1261
    int reg = ra_->get_reg_first(this);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1262
    os->print("ADDHI  %s, SP, %d\t//box node", Matcher::regName[reg], offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1263
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1264
    os->print("ADDHI  N%d = SP + %d\t// box node", _idx, offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1265
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1266
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1267
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1268
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1269
// Take care of the size function, if you make changes here!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1270
void BoxLockNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1271
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1272
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1273
  int offset = ra_->reg2offset(in_RegMask(0).find_first_elem());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1274
  int reg = ra_->get_encode(this);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1275
  __ z_lay(as_Register(reg), offset, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1276
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1277
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1278
uint BoxLockNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1279
  // BoxLockNode is not a MachNode, so we can't just call MachNode::size(ra_)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1280
  return 6;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1281
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1282
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1283
 %} // end source section
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1284
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1285
//----------SOURCE BLOCK-------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1286
// This is a block of C++ code which provides values, functions, and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1287
// definitions necessary in the rest of the architecture description
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1288
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1289
source_hpp %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1290
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1291
// Header information of the source block.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1292
// Method declarations/definitions which are used outside
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1293
// the ad-scope can conveniently be defined here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1294
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1295
// To keep related declarations/definitions/uses close together,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1296
// we switch between source %{ }% and source_hpp %{ }% freely as needed.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1297
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1298
//--------------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1299
// Used for optimization in Compile::Shorten_branches
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1300
//--------------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1301
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1302
class CallStubImpl {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1303
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1304
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1305
  // call trampolines
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1306
  // Size of call trampoline stub. For add'l comments, see size_java_to_interp().
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1307
  static uint size_call_trampoline() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1308
    return 0; // no call trampolines on this platform
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1309
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1310
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1311
  // call trampolines
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1312
  // Number of relocations needed by a call trampoline stub.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1313
  static uint reloc_call_trampoline() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1314
    return 0; // No call trampolines on this platform.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1315
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1316
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1317
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1318
%} // end source_hpp section
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1319
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1320
source %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1321
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1322
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1323
void MachUEPNode::format(PhaseRegAlloc *ra_, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1324
  os->print_cr("---- MachUEPNode ----");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1325
  os->print_cr("\tTA");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1326
  os->print_cr("\tload_const Z_R1, SharedRuntime::get_ic_miss_stub()");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1327
  os->print_cr("\tBR(Z_R1)");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1328
  os->print_cr("\tTA  # pad with illtraps");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1329
  os->print_cr("\t...");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1330
  os->print_cr("\tTA");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1331
  os->print_cr("\tLTGR    Z_R2, Z_R2");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1332
  os->print_cr("\tBRU     ic_miss");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1333
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1334
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1335
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1336
void MachUEPNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1337
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1338
  const int ic_miss_offset = 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1339
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1340
  // Inline_cache contains a klass.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1341
  Register ic_klass = as_Register(Matcher::inline_cache_reg_encode());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1342
  // ARG1 is the receiver oop.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1343
  Register R2_receiver = Z_ARG1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1344
  int      klass_offset = oopDesc::klass_offset_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1345
  AddressLiteral icmiss(SharedRuntime::get_ic_miss_stub());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1346
  Register R1_ic_miss_stub_addr = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1347
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1348
  // Null check of receiver.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1349
  // This is the null check of the receiver that actually should be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1350
  // done in the caller. It's here because in case of implicit null
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1351
  // checks we get it for free.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1352
  assert(!MacroAssembler::needs_explicit_null_check(oopDesc::klass_offset_in_bytes()),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1353
         "second word in oop should not require explicit null check.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1354
  if (!ImplicitNullChecks) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1355
    Label valid;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1356
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1357
      __ z_cgij(R2_receiver, 0, Assembler::bcondNotEqual, valid);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1358
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1359
      __ z_ltgr(R2_receiver, R2_receiver);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1360
      __ z_bre(valid);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1361
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1362
    // The ic_miss_stub will handle the null pointer exception.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1363
    __ load_const_optimized(R1_ic_miss_stub_addr, icmiss);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1364
    __ z_br(R1_ic_miss_stub_addr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1365
    __ bind(valid);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1366
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1367
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1368
  // Check whether this method is the proper implementation for the class of
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1369
  // the receiver (ic miss check).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1370
  {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1371
    Label valid;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1372
    // Compare cached class against klass from receiver.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1373
    // This also does an implicit null check!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1374
    __ compare_klass_ptr(ic_klass, klass_offset, R2_receiver, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1375
    __ z_bre(valid);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1376
    // The inline cache points to the wrong method. Call the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1377
    // ic_miss_stub to find the proper method.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1378
    __ load_const_optimized(R1_ic_miss_stub_addr, icmiss);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1379
    __ z_br(R1_ic_miss_stub_addr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1380
    __ bind(valid);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1381
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1382
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1383
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1384
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1385
uint MachUEPNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1386
  // Determine size dynamically.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1387
  return MachNode::size(ra_);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1388
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1389
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1390
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1391
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1392
%} // interrupt source section
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1393
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1394
source_hpp %{ // Header information of the source block.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1395
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1396
class HandlerImpl {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1397
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1398
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1399
  static int emit_exception_handler(CodeBuffer &cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1400
  static int emit_deopt_handler(CodeBuffer& cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1401
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1402
  static uint size_exception_handler() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1403
    return NativeJump::max_instruction_size();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1404
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1405
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1406
  static uint size_deopt_handler() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1407
    return NativeCall::max_instruction_size();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1408
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1409
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1410
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1411
%} // end source_hpp section
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1412
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1413
source %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1414
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1415
// This exception handler code snippet is placed after the method's
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1416
// code. It is the return point if an exception occurred. it jumps to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1417
// the exception blob.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1418
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1419
// If the method gets deoptimized, the method and this code snippet
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1420
// get patched.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1421
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1422
// 1) Trampoline code gets patched into the end of this exception
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1423
//   handler. the trampoline code jumps to the deoptimization blob.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1424
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1425
// 2) The return address in the method's code will get patched such
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1426
//   that it jumps to the trampoline.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1427
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1428
// 3) The handler will get patched such that it does not jump to the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1429
//   exception blob, but to an entry in the deoptimization blob being
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1430
//   aware of the exception.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1431
int HandlerImpl::emit_exception_handler(CodeBuffer &cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1432
  Register temp_reg = Z_R1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1433
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1434
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1435
  address base = __ start_a_stub(size_exception_handler());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1436
  if (base == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1437
    return 0;          // CodeBuffer::expand failed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1438
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1439
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1440
  int offset = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1441
  // Use unconditional pc-relative jump with 32-bit range here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1442
  __ load_const_optimized(temp_reg, (address)OptoRuntime::exception_blob()->content_begin());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1443
  __ z_br(temp_reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1444
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1445
  assert(__ offset() - offset <= (int) size_exception_handler(), "overflow");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1446
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1447
  __ end_a_stub();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1448
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1449
  return offset;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1450
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1451
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1452
// Emit deopt handler code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1453
int HandlerImpl::emit_deopt_handler(CodeBuffer& cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1454
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1455
  address        base = __ start_a_stub(size_deopt_handler());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1456
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1457
  if (base == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1458
    return 0;  // CodeBuffer::expand failed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1459
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1460
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1461
  int offset = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1462
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1463
  // Size_deopt_handler() must be exact on zarch, so for simplicity
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1464
  // we do not use load_const_opt here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1465
  __ load_const(Z_R1, SharedRuntime::deopt_blob()->unpack());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1466
  __ call(Z_R1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1467
  assert(__ offset() - offset == (int) size_deopt_handler(), "must be fixed size");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1468
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1469
  __ end_a_stub();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1470
  return offset;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1471
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1472
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1473
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1474
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1475
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1476
// Given a register encoding, produce an Integer Register object.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1477
static Register reg_to_register_object(int register_encoding) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1478
  assert(Z_R12->encoding() == Z_R12_enc, "wrong coding");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1479
  return as_Register(register_encoding);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1480
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1481
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1482
const bool Matcher::match_rule_supported(int opcode) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1483
  if (!has_match_rule(opcode)) return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1484
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1485
  switch (opcode) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1486
    case Op_CountLeadingZerosI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1487
    case Op_CountLeadingZerosL:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1488
    case Op_CountTrailingZerosI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1489
    case Op_CountTrailingZerosL:
42556
c03d98321ad1 8169317: [s390] Various minor bug fixes and adaptions.
goetz
parents: 42065
diff changeset
  1490
      // Implementation requires FLOGR instruction, which is available since z9.
c03d98321ad1 8169317: [s390] Various minor bug fixes and adaptions.
goetz
parents: 42065
diff changeset
  1491
      return true;
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1492
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1493
    case Op_ReverseBytesI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1494
    case Op_ReverseBytesL:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1495
      return UseByteReverseInstruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1496
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1497
    // PopCount supported by H/W from z/Architecture G5 (z196) on.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1498
    case Op_PopCountI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1499
    case Op_PopCountL:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1500
      return UsePopCountInstruction && VM_Version::has_PopCount();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1501
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1502
    case Op_StrComp:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1503
      return SpecialStringCompareTo;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1504
    case Op_StrEquals:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1505
      return SpecialStringEquals;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1506
    case Op_StrIndexOf:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1507
    case Op_StrIndexOfChar:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1508
      return SpecialStringIndexOf;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1509
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1510
    case Op_GetAndAddI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1511
    case Op_GetAndAddL:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1512
      return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1513
      // return VM_Version::has_AtomicMemWithImmALUOps();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1514
    case Op_GetAndSetI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1515
    case Op_GetAndSetL:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1516
    case Op_GetAndSetP:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1517
    case Op_GetAndSetN:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1518
      return true;  // General CAS implementation, always available.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1519
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1520
    default:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1521
      return true;  // Per default match rules are supported.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1522
                    // BUT: make sure match rule is not disabled by a false predicate!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1523
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1524
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1525
  return true;  // Per default match rules are supported.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1526
                // BUT: make sure match rule is not disabled by a false predicate!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1527
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1528
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1529
const bool Matcher::match_rule_supported_vector(int opcode, int vlen) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1530
  // TODO
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1531
  // Identify extra cases that we might want to provide match rules for
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1532
  // e.g. Op_ vector nodes and other intrinsics while guarding with vlen.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1533
  bool ret_value = match_rule_supported(opcode);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1534
  // Add rules here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1535
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1536
  return ret_value;  // Per default match rules are supported.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1537
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1538
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1539
int Matcher::regnum_to_fpu_offset(int regnum) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1540
  ShouldNotReachHere();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1541
  return regnum - 32; // The FP registers are in the second chunk.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1542
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1543
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1544
const bool Matcher::has_predicated_vectors(void) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1545
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1546
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1547
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1548
const int Matcher::float_pressure(int default_pressure_threshold) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1549
  return default_pressure_threshold;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1550
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1551
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1552
const bool Matcher::convL2FSupported(void) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1553
  return true; // False means that conversion is done by runtime call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1554
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1555
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1556
//----------SUPERWORD HELPERS----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1557
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1558
// Vector width in bytes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1559
const int Matcher::vector_width_in_bytes(BasicType bt) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1560
  assert(MaxVectorSize == 8, "");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1561
  return 8;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1562
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1563
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1564
// Vector ideal reg.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1565
const int Matcher::vector_ideal_reg(int size) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1566
  assert(MaxVectorSize == 8 && size == 8, "");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1567
  return Op_RegL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1568
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1569
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1570
// Limits on vector size (number of elements) loaded into vector.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1571
const int Matcher::max_vector_size(const BasicType bt) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1572
  assert(is_java_primitive(bt), "only primitive type vectors");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1573
  return vector_width_in_bytes(bt)/type2aelembytes(bt);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1574
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1575
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1576
const int Matcher::min_vector_size(const BasicType bt) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1577
  return max_vector_size(bt); // Same as max.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1578
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1579
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1580
const int Matcher::vector_shift_count_ideal_reg(int size) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1581
  fatal("vector shift is not supported");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1582
  return Node::NotAMachineReg;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1583
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1584
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1585
// z/Architecture does support misaligned store/load at minimal extra cost.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1586
const bool Matcher::misaligned_vectors_ok() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1587
  return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1588
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1589
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1590
// Not yet ported to z/Architecture.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1591
const bool Matcher::pass_original_key_for_aes() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1592
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1593
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1594
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1595
// RETURNS: whether this branch offset is short enough that a short
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1596
// branch can be used.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1597
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1598
// If the platform does not provide any short branch variants, then
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1599
// this method should return `false' for offset 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1600
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1601
// `Compile::Fill_buffer' will decide on basis of this information
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1602
// whether to do the pass `Compile::Shorten_branches' at all.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1603
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1604
// And `Compile::Shorten_branches' will decide on basis of this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1605
// information whether to replace particular branch sites by short
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1606
// ones.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1607
bool Matcher::is_short_branch_offset(int rule, int br_size, int offset) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1608
  // On zarch short branches use a 16 bit signed immediate that
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1609
  // is the pc-relative offset in halfword (= 2 bytes) units.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1610
  return Assembler::is_within_range_of_RelAddr16((address)((long)offset), (address)0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1611
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1612
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1613
const bool Matcher::isSimpleConstant64(jlong value) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1614
  // Probably always true, even if a temp register is required.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1615
  return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1616
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1617
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1618
// Should correspond to setting above
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1619
const bool Matcher::init_array_count_is_in_bytes = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1620
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1621
// Suppress CMOVL. Conditional move available on z/Architecture only from z196 onwards. Not exploited yet.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1622
const int Matcher::long_cmove_cost() { return ConditionalMoveLimit; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1623
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1624
// Suppress CMOVF. Conditional move available on z/Architecture only from z196 onwards. Not exploited yet.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1625
const int Matcher::float_cmove_cost() { return ConditionalMoveLimit; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1626
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1627
// Does the CPU require postalloc expand (see block.cpp for description of postalloc expand)?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1628
const bool Matcher::require_postalloc_expand = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1629
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1630
// Do we need to mask the count passed to shift instructions or does
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1631
// the cpu only look at the lower 5/6 bits anyway?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1632
// 32bit shifts mask in emitter, 64bit shifts need no mask.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1633
// Constant shift counts are handled in Ideal phase.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1634
const bool Matcher::need_masked_shift_count = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1635
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1636
// Set this as clone_shift_expressions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1637
bool Matcher::narrow_oop_use_complex_address() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1638
  if (Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0) return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1639
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1640
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1641
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1642
bool Matcher::narrow_klass_use_complex_address() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1643
  NOT_LP64(ShouldNotCallThis());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1644
  assert(UseCompressedClassPointers, "only for compressed klass code");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1645
  // TODO HS25: z port if (MatchDecodeNodes) return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1646
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1647
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1648
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1649
bool Matcher::const_oop_prefer_decode() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1650
  // Prefer ConN+DecodeN over ConP in simple compressed oops mode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1651
  return Universe::narrow_oop_base() == NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1652
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1653
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1654
bool Matcher::const_klass_prefer_decode() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1655
  // Prefer ConNKlass+DecodeNKlass over ConP in simple compressed klass mode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1656
  return Universe::narrow_klass_base() == NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1657
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1658
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1659
// Is it better to copy float constants, or load them directly from memory?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1660
// Most RISCs will have to materialize an address into a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1661
// register first, so they would do better to copy the constant from stack.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1662
const bool Matcher::rematerialize_float_constants = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1663
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1664
// If CPU can load and store mis-aligned doubles directly then no fixup is
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1665
// needed. Else we split the double into 2 integer pieces and move it
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1666
// piece-by-piece. Only happens when passing doubles into C code as the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1667
// Java calling convention forces doubles to be aligned.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1668
const bool Matcher::misaligned_doubles_ok = true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1669
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1670
// Advertise here if the CPU requires explicit rounding operations
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1671
// to implement the UseStrictFP mode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1672
const bool Matcher::strict_fp_requires_explicit_rounding = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1673
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1674
// Do floats take an entire double register or just half?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1675
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1676
// A float in resides in a zarch double register. When storing it by
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1677
// z_std, it cannot be restored in C-code by reloading it as a double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1678
// and casting it into a float afterwards.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1679
bool Matcher::float_in_double() { return false; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1680
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1681
// Do ints take an entire long register or just half?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1682
// The relevant question is how the int is callee-saved:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1683
// the whole long is written but de-opt'ing will have to extract
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1684
// the relevant 32 bits.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1685
const bool Matcher::int_in_long = true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1686
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1687
// Constants for c2c and c calling conventions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1688
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1689
const MachRegisterNumbers z_iarg_reg[5] = {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1690
  Z_R2_num, Z_R3_num, Z_R4_num, Z_R5_num, Z_R6_num
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1691
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1692
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1693
const MachRegisterNumbers z_farg_reg[4] = {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1694
  Z_F0_num, Z_F2_num, Z_F4_num, Z_F6_num
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1695
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1696
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1697
const int z_num_iarg_registers = sizeof(z_iarg_reg) / sizeof(z_iarg_reg[0]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1698
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1699
const int z_num_farg_registers = sizeof(z_farg_reg) / sizeof(z_farg_reg[0]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1700
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1701
// Return whether or not this register is ever used as an argument. This
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1702
// function is used on startup to build the trampoline stubs in generateOptoStub.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1703
// Registers not mentioned will be killed by the VM call in the trampoline, and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1704
// arguments in those registers not be available to the callee.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1705
bool Matcher::can_be_java_arg(int reg) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1706
  // We return true for all registers contained in z_iarg_reg[] and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1707
  // z_farg_reg[] and their virtual halves.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1708
  // We must include the virtual halves in order to get STDs and LDs
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1709
  // instead of STWs and LWs in the trampoline stubs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1710
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1711
  if (reg == Z_R2_num || reg == Z_R2_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1712
      reg == Z_R3_num || reg == Z_R3_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1713
      reg == Z_R4_num || reg == Z_R4_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1714
      reg == Z_R5_num || reg == Z_R5_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1715
      reg == Z_R6_num || reg == Z_R6_H_num) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1716
    return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1717
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1718
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1719
  if (reg == Z_F0_num || reg == Z_F0_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1720
      reg == Z_F2_num || reg == Z_F2_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1721
      reg == Z_F4_num || reg == Z_F4_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1722
      reg == Z_F6_num || reg == Z_F6_H_num) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1723
    return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1724
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1725
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1726
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1727
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1728
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1729
bool Matcher::is_spillable_arg(int reg) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1730
  return can_be_java_arg(reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1731
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1732
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1733
bool Matcher::use_asm_for_ldiv_by_con(jlong divisor) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1734
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1735
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1736
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1737
// Register for DIVI projection of divmodI
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1738
RegMask Matcher::divI_proj_mask() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1739
  return _Z_RARG4_INT_REG_mask;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1740
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1741
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1742
// Register for MODI projection of divmodI
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1743
RegMask Matcher::modI_proj_mask() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1744
  return _Z_RARG3_INT_REG_mask;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1745
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1746
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1747
// Register for DIVL projection of divmodL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1748
RegMask Matcher::divL_proj_mask() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1749
  return _Z_RARG4_LONG_REG_mask;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1750
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1751
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1752
// Register for MODL projection of divmodL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1753
RegMask Matcher::modL_proj_mask() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1754
  return _Z_RARG3_LONG_REG_mask;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1755
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1756
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1757
// Copied from sparc.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1758
const RegMask Matcher::method_handle_invoke_SP_save_mask() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1759
  return RegMask();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1760
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1761
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1762
const bool Matcher::convi2l_type_required = true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1763
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1764
// Should the Matcher clone shifts on addressing modes, expecting them
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1765
// to be subsumed into complex addressing expressions or compute them
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1766
// into registers?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1767
bool Matcher::clone_address_expressions(AddPNode* m, Matcher::MStack& mstack, VectorSet& address_visited) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1768
  return clone_base_plus_offset_address(m, mstack, address_visited);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1769
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1770
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1771
void Compile::reshape_address(AddPNode* addp) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1772
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1773
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1774
%} // source
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1775
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1776
//----------ENCODING BLOCK-----------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1777
// This block specifies the encoding classes used by the compiler to output
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1778
// byte streams. Encoding classes are parameterized macros used by
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1779
// Machine Instruction Nodes in order to generate the bit encoding of the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1780
// instruction. Operands specify their base encoding interface with the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1781
// interface keyword. There are currently supported four interfaces,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1782
// REG_INTER, CONST_INTER, MEMORY_INTER, & COND_INTER. REG_INTER causes an
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1783
// operand to generate a function which returns its register number when
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1784
// queried. CONST_INTER causes an operand to generate a function which
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1785
// returns the value of the constant when queried. MEMORY_INTER causes an
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1786
// operand to generate four functions which return the Base Register, the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1787
// Index Register, the Scale Value, and the Offset Value of the operand when
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1788
// queried. COND_INTER causes an operand to generate six functions which
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1789
// return the encoding code (ie - encoding bits for the instruction)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1790
// associated with each basic boolean condition for a conditional instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1791
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1792
// Instructions specify two basic values for encoding. Again, a function
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1793
// is available to check if the constant displacement is an oop. They use the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1794
// ins_encode keyword to specify their encoding classes (which must be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1795
// a sequence of enc_class names, and their parameters, specified in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1796
// the encoding block), and they use the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1797
// opcode keyword to specify, in order, their primary, secondary, and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1798
// tertiary opcode. Only the opcode sections which a particular instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1799
// needs for encoding need to be specified.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1800
encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1801
  enc_class enc_unimplemented %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1802
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1803
    __ unimplemented("Unimplemented mach node encoding in AD file.", 13);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1804
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1805
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1806
  enc_class enc_untested %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1807
#ifdef ASSERT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1808
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1809
    __ untested("Untested mach node encoding in AD file.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1810
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1811
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1812
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1813
  enc_class z_rrform(iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1814
    assert((($primary >> 14) & 0x03) == 0, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1815
    assert( ($primary >> 16)         == 0, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1816
    z_emit16(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1817
             Assembler::reg($dst$$reg,8,16) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1818
             Assembler::reg($src$$reg,12,16));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1819
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1820
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1821
  enc_class z_rreform(iRegI dst1, iRegI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1822
    assert((($primary >> 30) & 0x03) == 2, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1823
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1824
             Assembler::reg($dst1$$reg,24,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1825
             Assembler::reg($src2$$reg,28,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1826
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1827
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1828
  enc_class z_rrfform(iRegI dst1, iRegI src2, iRegI src3) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1829
    assert((($primary >> 30) & 0x03) == 2, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1830
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1831
             Assembler::reg($dst1$$reg,24,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1832
             Assembler::reg($src2$$reg,28,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1833
             Assembler::reg($src3$$reg,16,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1834
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1835
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1836
  enc_class z_riform_signed(iRegI dst, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1837
    assert((($primary>>30) & 0x03) == 2, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1838
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1839
             Assembler::reg($dst$$reg,8,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1840
             Assembler::simm16($src$$constant,16,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1841
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1842
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1843
  enc_class z_riform_unsigned(iRegI dst, uimmI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1844
    assert((($primary>>30) & 0x03) == 2, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1845
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1846
             Assembler::reg($dst$$reg,8,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1847
             Assembler::uimm16($src$$constant,16,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1848
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1849
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1850
  enc_class z_rieform_d(iRegI dst1, iRegI src3, immI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1851
    assert((($primary>>46) & 0x03) == 3, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1852
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1853
             Assembler::reg($dst1$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1854
             Assembler::reg($src3$$reg,12,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1855
             Assembler::simm16($src2$$constant,16,48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1856
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1857
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1858
  enc_class z_rilform_signed(iRegI dst, immL32 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1859
    assert((($primary>>46) & 0x03) == 3, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1860
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1861
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1862
             Assembler::simm32($src$$constant,16,48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1863
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1864
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1865
  enc_class z_rilform_unsigned(iRegI dst, uimmL32 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1866
    assert((($primary>>46) & 0x03) == 3, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1867
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1868
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1869
             Assembler::uimm32($src$$constant,16,48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1870
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1871
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1872
  enc_class z_rsyform_const(iRegI dst, iRegI src1, immI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1873
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1874
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1875
             Assembler::reg($src1$$reg,12,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1876
             Assembler::simm20($src2$$constant));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1877
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1878
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1879
  enc_class z_rsyform_reg_reg(iRegI dst, iRegI src, iRegI shft) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1880
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1881
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1882
             Assembler::reg($src$$reg,12,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1883
             Assembler::reg($shft$$reg,16,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1884
             Assembler::simm20(0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1885
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1886
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1887
  enc_class z_rxform_imm_reg_reg(iRegL dst, immL con, iRegL src1, iRegL src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1888
    assert((($primary>>30) & 0x03) == 1, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1889
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1890
             Assembler::reg($dst$$reg,8,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1891
             Assembler::reg($src1$$reg,12,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1892
             Assembler::reg($src2$$reg,16,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1893
             Assembler::uimm12($con$$constant,20,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1894
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1895
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1896
  enc_class z_rxform_imm_reg(iRegL dst, immL con, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1897
    assert((($primary>>30) & 0x03) == 1, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1898
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1899
             Assembler::reg($dst$$reg,8,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1900
             Assembler::reg($src$$reg,16,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1901
             Assembler::uimm12($con$$constant,20,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1902
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1903
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1904
  enc_class z_rxyform_imm_reg_reg(iRegL dst, immL con, iRegL src1, iRegL src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1905
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1906
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1907
             Assembler::reg($src1$$reg,12,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1908
             Assembler::reg($src2$$reg,16,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1909
             Assembler::simm20($con$$constant));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1910
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1911
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1912
  enc_class z_rxyform_imm_reg(iRegL dst, immL con, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1913
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1914
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1915
             Assembler::reg($src$$reg,16,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1916
             Assembler::simm20($con$$constant));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1917
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1918
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1919
  // Direct memory arithmetic.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1920
  enc_class z_siyform(memoryRSY mem, immI8 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1921
    int      disp = $mem$$disp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1922
    Register base = reg_to_register_object($mem$$base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1923
    int      con  = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1924
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1925
    assert(VM_Version::has_MemWithImmALUOps(), "unsupported CPU");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1926
    z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1927
                Assembler::regz(base,16,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1928
                Assembler::simm20(disp) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1929
                Assembler::simm8(con,8,48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1930
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1931
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1932
  enc_class z_silform(memoryRS mem, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1933
    z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1934
                Assembler::regz(reg_to_register_object($mem$$base),16,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1935
                Assembler::uimm12($mem$$disp,20,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1936
                Assembler::simm16($src$$constant,32,48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1937
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1938
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1939
  // Encoder for FP ALU reg/mem instructions (support only short displacements).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1940
  enc_class z_form_rt_memFP(RegF dst, memoryRX mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1941
    Register Ridx = $mem$$index$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1942
    if (Ridx == noreg) { Ridx = Z_R0; } // Index is 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1943
    if ($primary > (1L << 32)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1944
      z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1945
                  Assembler::reg($dst$$reg, 8, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1946
                  Assembler::uimm12($mem$$disp, 20, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1947
                  Assembler::reg(Ridx, 12, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1948
                  Assembler::regz(reg_to_register_object($mem$$base), 16, 48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1949
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1950
      z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1951
                  Assembler::reg($dst$$reg, 8, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1952
                  Assembler::uimm12($mem$$disp, 20, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1953
                  Assembler::reg(Ridx, 12, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1954
                  Assembler::regz(reg_to_register_object($mem$$base), 16, 32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1955
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1956
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1957
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1958
  enc_class z_form_rt_mem(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1959
    Register Ridx = $mem$$index$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1960
    if (Ridx == noreg) { Ridx = Z_R0; } // Index is 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1961
    if ($primary > (1L<<32)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1962
      z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1963
                  Assembler::reg($dst$$reg, 8, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1964
                  Assembler::simm20($mem$$disp) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1965
                  Assembler::reg(Ridx, 12, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1966
                  Assembler::regz(reg_to_register_object($mem$$base), 16, 48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1967
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1968
      z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1969
                  Assembler::reg($dst$$reg, 8, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1970
                  Assembler::uimm12($mem$$disp, 20, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1971
                  Assembler::reg(Ridx, 12, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1972
                  Assembler::regz(reg_to_register_object($mem$$base), 16, 32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1973
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1974
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1975
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1976
  enc_class z_form_rt_mem_opt(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1977
    int isize = $secondary > 1L << 32 ? 48 : 32;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1978
    Register Ridx = $mem$$index$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1979
    if (Ridx == noreg) { Ridx = Z_R0; } // Index is 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1980
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1981
    if (Displacement::is_shortDisp((long)$mem$$disp)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1982
      z_emit_inst(cbuf, $secondary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1983
                  Assembler::reg($dst$$reg, 8, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1984
                  Assembler::uimm12($mem$$disp, 20, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1985
                  Assembler::reg(Ridx, 12, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1986
                  Assembler::regz(reg_to_register_object($mem$$base), 16, isize));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1987
    } else if (Displacement::is_validDisp((long)$mem$$disp)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1988
      z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1989
                  Assembler::reg($dst$$reg, 8, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1990
                  Assembler::simm20($mem$$disp) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1991
                  Assembler::reg(Ridx, 12, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1992
                  Assembler::regz(reg_to_register_object($mem$$base), 16, 48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1993
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1994
        MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1995
        __ load_const_optimized(Z_R1_scratch, $mem$$disp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1996
        if (Ridx != Z_R0) { __ z_agr(Z_R1_scratch, Ridx); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1997
        z_emit_inst(cbuf, $secondary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1998
                    Assembler::reg($dst$$reg, 8, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1999
                    Assembler::uimm12(0, 20, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2000
                    Assembler::reg(Z_R1_scratch, 12, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2001
                    Assembler::regz(reg_to_register_object($mem$$base), 16, isize));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2002
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2003
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2004
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2005
  enc_class z_enc_brul(Label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2006
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2007
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2008
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2009
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2010
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2011
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2012
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2013
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2014
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2015
    __ z_brul(l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2016
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2017
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2018
  enc_class z_enc_bru(Label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2019
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2020
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2021
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2022
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2023
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2024
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2025
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2026
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2027
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2028
    __ z_bru(l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2029
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2030
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2031
  enc_class z_enc_branch_con_far(cmpOp cmp, Label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2032
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2033
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2034
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2035
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2036
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2037
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2038
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2039
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2040
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2041
    __ z_brcl((Assembler::branch_condition)$cmp$$cmpcode, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2042
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2043
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2044
  enc_class z_enc_branch_con_short(cmpOp cmp, Label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2045
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2046
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2047
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2048
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2049
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2050
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2051
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2052
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2053
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2054
    __ z_brc((Assembler::branch_condition)$cmp$$cmpcode, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2055
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2056
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2057
  enc_class z_enc_cmpb_regreg(iRegI src1, iRegI src2, Label lbl, cmpOpT cmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2058
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2059
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2060
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2061
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2062
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2063
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2064
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2065
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2066
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2067
    Assembler::branch_condition cc = (Assembler::branch_condition)$cmp$$cmpcode;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2068
    unsigned long instr = $primary;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2069
    if (instr == CRJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2070
      __ z_crj($src1$$Register, $src2$$Register, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2071
    } else if (instr == CLRJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2072
      __ z_clrj($src1$$Register, $src2$$Register, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2073
    } else if (instr == CGRJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2074
      __ z_cgrj($src1$$Register, $src2$$Register, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2075
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2076
      guarantee(instr == CLGRJ_ZOPC, "opcode not implemented");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2077
      __ z_clgrj($src1$$Register, $src2$$Register, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2078
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2079
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2080
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2081
  enc_class z_enc_cmpb_regregFar(iRegI src1, iRegI src2, Label lbl, cmpOpT cmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2082
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2083
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2084
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2085
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2086
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2087
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2088
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2089
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2090
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2091
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2092
    unsigned long instr = $primary;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2093
    if (instr == CR_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2094
      __ z_cr($src1$$Register, $src2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2095
    } else if (instr == CLR_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2096
      __ z_clr($src1$$Register, $src2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2097
    } else if (instr == CGR_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2098
      __ z_cgr($src1$$Register, $src2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2099
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2100
      guarantee(instr == CLGR_ZOPC, "opcode not implemented");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2101
      __ z_clgr($src1$$Register, $src2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2102
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2103
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2104
    __ z_brcl((Assembler::branch_condition)$cmp$$cmpcode, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2105
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2106
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2107
  enc_class z_enc_cmpb_regimm(iRegI src1, immI8 src2, Label lbl, cmpOpT cmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2108
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2109
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2110
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2111
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2112
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2113
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2114
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2115
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2116
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2117
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2118
    Assembler::branch_condition cc = (Assembler::branch_condition)$cmp$$cmpcode;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2119
    unsigned long instr = $primary;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2120
    if (instr == CIJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2121
      __ z_cij($src1$$Register, $src2$$constant, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2122
    } else if (instr == CLIJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2123
      __ z_clij($src1$$Register, $src2$$constant, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2124
    } else if (instr == CGIJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2125
      __ z_cgij($src1$$Register, $src2$$constant, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2126
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2127
      guarantee(instr == CLGIJ_ZOPC, "opcode not implemented");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2128
      __ z_clgij($src1$$Register, $src2$$constant, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2129
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2130
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2131
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2132
  enc_class z_enc_cmpb_regimmFar(iRegI src1, immI8 src2, Label lbl, cmpOpT cmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2133
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2134
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2135
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2136
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2137
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2138
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2139
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2140
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2141
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2142
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2143
    unsigned long instr = $primary;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2144
    if (instr == CHI_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2145
      __ z_chi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2146
    } else if (instr == CLFI_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2147
      __ z_clfi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2148
    } else if (instr == CGHI_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2149
      __ z_cghi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2150
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2151
      guarantee(instr == CLGFI_ZOPC, "opcode not implemented");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2152
      __ z_clgfi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2153
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2154
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2155
    __ z_brcl((Assembler::branch_condition)$cmp$$cmpcode, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2156
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2157
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2158
  // Call from Java to runtime.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2159
  enc_class z_enc_java_to_runtime_call(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2160
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2161
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2162
    // Save return pc before call to the place where we need it, since
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2163
    // callee doesn't.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2164
    unsigned int start_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2165
    // Compute size of "larl + stg + call_c_opt".
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2166
    const int size_of_code = 6 + 6 + MacroAssembler::call_far_patchable_size();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2167
    __ get_PC(Z_R14, size_of_code);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2168
    __ save_return_pc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2169
    assert(__ offset() - start_off == 12, "bad prelude len: %d", __ offset() - start_off);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2170
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2171
    assert((__ offset() & 2) == 0, "misaligned z_enc_java_to_runtime_call");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2172
    address call_addr = __ call_c_opt((address)$meth$$method);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2173
    if (call_addr == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2174
      Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2175
      return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2176
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2177
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2178
#ifdef ASSERT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2179
    // Plausibility check for size_of_code assumptions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2180
    unsigned int actual_ret_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2181
    assert(start_off + size_of_code == actual_ret_off, "wrong return_pc");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2182
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2183
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2184
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2185
  enc_class z_enc_java_static_call(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2186
    // Call to fixup routine. Fixup routine uses ScopeDesc info to determine
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2187
    // whom we intended to call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2188
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2189
    int ret_offset = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2190
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2191
    if (!_method) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2192
      ret_offset = emit_call_reloc(_masm, $meth$$method,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2193
                                   relocInfo::runtime_call_w_cp_type, ra_);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2194
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2195
      int method_index = resolved_method_index(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2196
      if (_optimized_virtual) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2197
        ret_offset = emit_call_reloc(_masm, $meth$$method,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2198
                                     opt_virtual_call_Relocation::spec(method_index));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2199
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2200
        ret_offset = emit_call_reloc(_masm, $meth$$method,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2201
                                     static_call_Relocation::spec(method_index));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2202
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2203
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2204
    assert(__ inst_mark() != NULL, "emit_call_reloc must set_inst_mark()");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2205
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2206
    if (_method) { // Emit stub for static call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2207
      address stub = CompiledStaticCall::emit_to_interp_stub(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2208
      if (stub == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2209
        ciEnv::current()->record_failure("CodeCache is full");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2210
        return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2211
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2212
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2213
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2214
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2215
  // Java dynamic call
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2216
  enc_class z_enc_java_dynamic_call(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2217
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2218
    unsigned int start_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2219
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2220
    int vtable_index = this->_vtable_index;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2221
    if (vtable_index == -4) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2222
      Register ic_reg = reg_to_register_object(Matcher::inline_cache_reg_encode());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2223
      address virtual_call_oop_addr = NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2224
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2225
      AddressLiteral empty_ic((address) Universe::non_oop_word());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2226
      virtual_call_oop_addr = __ pc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2227
      bool success = __ load_const_from_toc(ic_reg, empty_ic);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2228
      if (!success) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2229
        Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2230
        return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2231
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2232
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2233
      // Call to fixup routine. Fixup routine uses ScopeDesc info
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2234
      // to determine who we intended to call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2235
      int method_index = resolved_method_index(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2236
      __ relocate(virtual_call_Relocation::spec(virtual_call_oop_addr, method_index));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2237
      unsigned int ret_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2238
      assert(__ offset() - start_off == 6, "bad prelude len: %d", __ offset() - start_off);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2239
      ret_off += emit_call_reloc(_masm, $meth$$method, relocInfo::none, ra_);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2240
      assert(_method, "lazy_constant may be wrong when _method==null");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2241
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2242
      assert(!UseInlineCaches, "expect vtable calls only if not using ICs");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2243
      // Go through the vtable. Get receiver klass. Receiver already
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2244
      // checked for non-null. If we'll go thru a C2I adapter, the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2245
      // interpreter expects method in Z_method.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2246
      // Use Z_method to temporarily hold the klass oop. Z_R1_scratch is destroyed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2247
      // by load_heap_oop_not_null.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2248
      __ load_klass(Z_method, Z_R2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2249
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2250
      int entry_offset = in_bytes(Klass::vtable_start_offset()) + vtable_index * vtableEntry::size_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2251
      int v_off        = entry_offset + vtableEntry::method_offset_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2252
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2253
      if (Displacement::is_validDisp(v_off) ) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2254
        // Can use load instruction with large offset.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2255
        __ z_lg(Z_method, Address(Z_method /*class oop*/, v_off /*method offset*/));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2256
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2257
        // Worse case, must load offset into register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2258
        __ load_const(Z_R1_scratch, v_off);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2259
        __ z_lg(Z_method, Address(Z_method /*class oop*/, Z_R1_scratch /*method offset*/));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2260
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2261
      // NOTE: for vtable dispatches, the vtable entry will never be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2262
      // null. However it may very well end up in handle_wrong_method
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2263
      // if the method is abstract for the particular class.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2264
      __ z_lg(Z_R1_scratch, Address(Z_method, Method::from_compiled_offset()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2265
      // Call target. Either compiled code or C2I adapter.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2266
      __ z_basr(Z_R14, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2267
      unsigned int ret_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2268
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2269
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2270
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2271
  enc_class z_enc_cmov_reg(cmpOp cmp, iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2272
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2273
    Register Rdst = reg_to_register_object($dst$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2274
    Register Rsrc = reg_to_register_object($src$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2275
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2276
    // Don't emit code if operands are identical (same register).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2277
    if (Rsrc != Rdst) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2278
      Assembler::branch_condition cc = (Assembler::branch_condition)$cmp$$cmpcode;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2279
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2280
      if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2281
        __ z_locgr(Rdst, Rsrc, cc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2282
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2283
        // Branch if not (cmp cr).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2284
        Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2285
        __ z_brc(Assembler::inverse_condition(cc), done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2286
        __ z_lgr(Rdst, Rsrc); // Used for int and long+ptr.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2287
        __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2288
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2289
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2290
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2291
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2292
  enc_class z_enc_cmov_imm(cmpOp cmp, iRegI dst, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2293
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2294
    Register Rdst = reg_to_register_object($dst$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2295
    int      Csrc = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2296
    Assembler::branch_condition cc = (Assembler::branch_condition)$cmp$$cmpcode;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2297
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2298
    // Branch if not (cmp cr).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2299
    __ z_brc(Assembler::inverse_condition(cc), done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2300
    if (Csrc == 0) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2301
      // Don't set CC.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2302
      __ clear_reg(Rdst, true, false);  // Use for int, long & ptr.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2303
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2304
      __ z_lghi(Rdst, Csrc); // Use for int, long & ptr.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2305
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2306
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2307
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2308
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2309
  enc_class z_enc_cctobool(iRegI res) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2310
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2311
    Register Rres = reg_to_register_object($res$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2312
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2313
    if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2314
      __ load_const_optimized(Z_R0_scratch, 0L); // false (failed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2315
      __ load_const_optimized(Rres, 1L);         // true  (succeed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2316
      __ z_locgr(Rres, Z_R0_scratch, Assembler::bcondNotEqual);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2317
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2318
      Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2319
      __ load_const_optimized(Rres, 0L); // false (failed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2320
      __ z_brne(done);                   // Assume true to be the common case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2321
      __ load_const_optimized(Rres, 1L); // true  (succeed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2322
      __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2323
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2324
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2325
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2326
  enc_class z_enc_casI(iRegI compare_value, iRegI exchange_value, iRegP addr_ptr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2327
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2328
    Register Rcomp = reg_to_register_object($compare_value$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2329
    Register Rnew  = reg_to_register_object($exchange_value$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2330
    Register Raddr = reg_to_register_object($addr_ptr$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2331
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2332
    __ z_cs(Rcomp, Rnew, 0, Raddr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2333
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2334
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2335
  enc_class z_enc_casL(iRegL compare_value, iRegL exchange_value, iRegP addr_ptr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2336
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2337
    Register Rcomp = reg_to_register_object($compare_value$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2338
    Register Rnew  = reg_to_register_object($exchange_value$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2339
    Register Raddr = reg_to_register_object($addr_ptr$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2340
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2341
    __ z_csg(Rcomp, Rnew, 0, Raddr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2342
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2343
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2344
  enc_class z_enc_SwapI(memoryRSY mem, iRegI dst, iRegI tmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2345
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2346
    Register Rdst = reg_to_register_object($dst$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2347
    Register Rtmp = reg_to_register_object($tmp$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2348
    guarantee(Rdst != Rtmp, "Fix match rule to use TEMP_DEF");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2349
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2350
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2351
    // Iterate until swap succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2352
    __ z_llgf(Rtmp, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2353
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2354
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2355
      __ z_csy(Rtmp, Rdst, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2356
      __ z_brne(retry);                    // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2357
    __ z_lgr(Rdst, Rtmp);                  // Exchanged value from memory is return value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2358
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2359
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2360
  enc_class z_enc_SwapL(memoryRSY mem, iRegL dst, iRegL tmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2361
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2362
    Register Rdst = reg_to_register_object($dst$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2363
    Register Rtmp = reg_to_register_object($tmp$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2364
    guarantee(Rdst != Rtmp, "Fix match rule to use TEMP_DEF");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2365
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2366
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2367
    // Iterate until swap succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2368
    __ z_lg(Rtmp, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2369
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2370
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2371
      __ z_csg(Rtmp, Rdst, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2372
      __ z_brne(retry);                    // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2373
    __ z_lgr(Rdst, Rtmp);                  // Exchanged value from memory is return value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2374
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2375
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2376
%} // encode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2377
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2378
source %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2379
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2380
  // Check whether outs are all Stores. If so, we can omit clearing the upper
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2381
  // 32 bits after encoding.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2382
  static bool all_outs_are_Stores(const Node *n) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2383
    for (DUIterator_Fast imax, k = n->fast_outs(imax); k < imax; k++) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2384
      Node *out = n->fast_out(k);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2385
      if (!out->is_Mach() || out->as_Mach()->ideal_Opcode() != Op_StoreN) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2386
        // Most other outs are SpillCopy, but there are various other.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2387
        // jvm98 has arond 9% Encodes where we return false.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2388
        return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2389
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2390
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2391
    return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2392
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2393
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2394
%} // source
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2395
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2396
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2397
//----------FRAME--------------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2398
// Definition of frame structure and management information.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2399
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2400
frame %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2401
  // What direction does stack grow in (assumed to be same for native & Java).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2402
  stack_direction(TOWARDS_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2403
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2404
  // These two registers define part of the calling convention between
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2405
  // compiled code and the interpreter.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2406
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2407
  // Inline Cache Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2408
  inline_cache_reg(Z_R9); // Z_inline_cache
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2409
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2410
  // Argument pointer for I2C adapters
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2411
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2412
  // Tos is loaded in run_compiled_code to Z_ARG5=Z_R6.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2413
  // interpreter_arg_ptr_reg(Z_R6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2414
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2415
  // Temporary in compiled entry-points
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2416
  // compiler_method_oop_reg(Z_R1);//Z_R1_scratch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2417
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2418
  // Method Oop Register when calling interpreter
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2419
  interpreter_method_oop_reg(Z_R9);//Z_method
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2420
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2421
  // Optional: name the operand used by cisc-spilling to access
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2422
  // [stack_pointer + offset].
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2423
  cisc_spilling_operand_name(indOffset12);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2424
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2425
  // Number of stack slots consumed by a Monitor enter.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2426
  sync_stack_slots(frame::jit_monitor_size_in_4_byte_units);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2427
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2428
  // Compiled code's Frame Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2429
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2430
  // z/Architecture stack pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2431
  frame_pointer(Z_R15); // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2432
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2433
  // Interpreter stores its frame pointer in a register which is
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2434
  // stored to the stack by I2CAdaptors. I2CAdaptors convert from
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2435
  // interpreted java to compiled java.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2436
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2437
  // Z_state holds pointer to caller's cInterpreter.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2438
  interpreter_frame_pointer(Z_R7); // Z_state
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2439
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2440
  // Use alignment_in_bytes instead of log_2_of_alignment_in_bits.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2441
  stack_alignment(frame::alignment_in_bytes);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2442
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2443
  in_preserve_stack_slots(frame::jit_in_preserve_size_in_4_byte_units);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2444
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2445
  // A `slot' is assumed 4 bytes here!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2446
  // out_preserve_stack_slots(frame::jit_out_preserve_size_in_4_byte_units);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2447
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2448
  // Number of outgoing stack slots killed above the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2449
  // out_preserve_stack_slots for calls to C. Supports the var-args
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2450
  // backing area for register parms.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2451
  varargs_C_out_slots_killed(((frame::z_abi_160_size - frame::z_jit_out_preserve_size) / VMRegImpl::stack_slot_size));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2452
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2453
  // The after-PROLOG location of the return address. Location of
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2454
  // return address specifies a type (REG or STACK) and a number
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2455
  // representing the register number (i.e. - use a register name) or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2456
  // stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2457
  return_addr(REG Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2458
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2459
  // This is the body of the function
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2460
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2461
  // void Matcher::calling_convention(OptoRegPair* sig /* array of ideal regs */,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2462
  //                                  uint length      /* length of array */,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2463
  //                                  bool is_outgoing)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2464
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2465
  // The `sig' array is to be updated. Sig[j] represents the location
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2466
  // of the j-th argument, either a register or a stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2467
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2468
  // Body of function which returns an integer array locating
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2469
  // arguments either in registers or in stack slots. Passed an array
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2470
  // of ideal registers called "sig" and a "length" count. Stack-slot
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2471
  // offsets are based on outgoing arguments, i.e. a CALLER setting up
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2472
  // arguments for a CALLEE. Incoming stack arguments are
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2473
  // automatically biased by the preserve_stack_slots field above.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2474
  calling_convention %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2475
    // No difference between ingoing/outgoing just pass false.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2476
    SharedRuntime::java_calling_convention(sig_bt, regs, length, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2477
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2478
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2479
  // Body of function which returns an integer array locating
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2480
  // arguments either in registers or in stack slots. Passed an array
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2481
  // of ideal registers called "sig" and a "length" count. Stack-slot
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2482
  // offsets are based on outgoing arguments, i.e. a CALLER setting up
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2483
  // arguments for a CALLEE. Incoming stack arguments are
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2484
  // automatically biased by the preserve_stack_slots field above.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2485
  c_calling_convention %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2486
    // This is obviously always outgoing.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2487
    // C argument must be in register AND stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2488
    (void) SharedRuntime::c_calling_convention(sig_bt, regs, /*regs2=*/NULL, length);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2489
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2490
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2491
  // Location of native (C/C++) and interpreter return values. This
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2492
  // is specified to be the same as Java. In the 32-bit VM, long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2493
  // values are actually returned from native calls in O0:O1 and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2494
  // returned to the interpreter in I0:I1. The copying to and from
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2495
  // the register pairs is done by the appropriate call and epilog
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2496
  // opcodes. This simplifies the register allocator.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2497
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2498
  // Use register pair for c return value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2499
  c_return_value %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2500
    assert(ideal_reg >= Op_RegI && ideal_reg <= Op_RegL, "only return normal values");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2501
    static int typeToRegLo[Op_RegL+1] = { 0, 0, Z_R2_num, Z_R2_num, Z_R2_num, Z_F0_num, Z_F0_num, Z_R2_num };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2502
    static int typeToRegHi[Op_RegL+1] = { 0, 0, OptoReg::Bad, OptoReg::Bad, Z_R2_H_num, OptoReg::Bad, Z_F0_H_num, Z_R2_H_num };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2503
    return OptoRegPair(typeToRegHi[ideal_reg], typeToRegLo[ideal_reg]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2504
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2505
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2506
  // Use register pair for return value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2507
  // Location of compiled Java return values. Same as C
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2508
  return_value %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2509
    assert(ideal_reg >= Op_RegI && ideal_reg <= Op_RegL, "only return normal values");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2510
    static int typeToRegLo[Op_RegL+1] = { 0, 0, Z_R2_num, Z_R2_num, Z_R2_num, Z_F0_num, Z_F0_num, Z_R2_num };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2511
    static int typeToRegHi[Op_RegL+1] = { 0, 0, OptoReg::Bad, OptoReg::Bad, Z_R2_H_num, OptoReg::Bad, Z_F0_H_num, Z_R2_H_num };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2512
    return OptoRegPair(typeToRegHi[ideal_reg], typeToRegLo[ideal_reg]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2513
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2514
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2515
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2516
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2517
//----------ATTRIBUTES---------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2518
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2519
//----------Operand Attributes-------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2520
op_attrib op_cost(1);          // Required cost attribute
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2521
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2522
//----------Instruction Attributes---------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2523
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2524
// Cost attribute. required.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2525
ins_attrib ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2526
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2527
// Is this instruction a non-matching short branch variant of some
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2528
// long branch? Not required.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2529
ins_attrib ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2530
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2531
// Indicates this is a trap based check node and final control-flow fixup
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2532
// must generate a proper fall through.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2533
ins_attrib ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2534
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2535
// Attribute of instruction to tell how many constants the instruction will generate.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2536
// (optional attribute). Default: 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2537
ins_attrib ins_num_consts(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2538
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2539
// Required alignment attribute (must be a power of 2)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2540
// specifies the alignment that some part of the instruction (not
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2541
// necessarily the start) requires. If > 1, a compute_padding()
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2542
// function must be provided for the instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2543
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2544
// WARNING: Don't use size(FIXED_SIZE) or size(VARIABLE_SIZE) in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2545
// instructions which depend on the proper alignment, because the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2546
// desired alignment isn't guaranteed for the call to "emit()" during
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2547
// the size computation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2548
ins_attrib ins_alignment(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2549
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2550
// Enforce/prohibit rematerializations.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2551
// - If an instruction is attributed with 'ins_cannot_rematerialize(true)'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2552
//   then rematerialization of that instruction is prohibited and the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2553
//   instruction's value will be spilled if necessary.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2554
// - If an instruction is attributed with 'ins_should_rematerialize(true)'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2555
//   then rematerialization is enforced and the instruction's value will
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2556
//   never get spilled. a copy of the instruction will be inserted if
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2557
//   necessary.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2558
//   Note: this may result in rematerializations in front of every use.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2559
// (optional attribute)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2560
ins_attrib ins_cannot_rematerialize(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2561
ins_attrib ins_should_rematerialize(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2562
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2563
//----------OPERANDS-----------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2564
// Operand definitions must precede instruction definitions for correct
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2565
// parsing in the ADLC because operands constitute user defined types
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2566
// which are used in instruction definitions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2567
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2568
//----------Simple Operands----------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2569
// Immediate Operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2570
// Please note:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2571
// Formats are generated automatically for constants and base registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2572
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2573
//----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2574
// SIGNED (shorter than INT) immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2575
//----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2576
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2577
// Byte Immediate: constant 'int -1'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2578
operand immB_minus1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2579
  //         sign-ext constant      zero-ext constant
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2580
  predicate((n->get_int() == -1) || ((n->get_int()&0x000000ff) == 0x000000ff));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2581
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2582
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2583
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2584
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2585
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2586
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2587
// Byte Immediate: constant, but not 'int 0' nor 'int -1'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2588
operand immB_n0m1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2589
  //                             sign-ext constant     zero-ext constant
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2590
  predicate(n->get_int() != 0 && n->get_int() != -1 && (n->get_int()&0x000000ff) != 0x000000ff);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2591
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2592
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2593
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2594
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2595
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2596
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2597
// Short Immediate: constant 'int -1'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2598
operand immS_minus1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2599
  //         sign-ext constant      zero-ext constant
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2600
  predicate((n->get_int() == -1) || ((n->get_int()&0x0000ffff) == 0x0000ffff));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2601
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2602
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2603
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2604
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2605
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2606
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2607
// Short Immediate: constant, but not 'int 0' nor 'int -1'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2608
operand immS_n0m1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2609
  //                             sign-ext constant     zero-ext constant
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2610
  predicate(n->get_int() != 0 && n->get_int() != -1 && (n->get_int()&0x0000ffff) != 0x0000ffff);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2611
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2612
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2613
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2614
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2615
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2616
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2617
//-----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2618
//  SIGNED INT immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2619
//-----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2620
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2621
// Integer Immediate: 32-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2622
operand immI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2623
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2624
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2625
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2626
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2627
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2628
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2629
// Int Immediate: 20-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2630
operand immI20() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2631
  predicate(Immediate::is_simm20(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2632
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2633
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2634
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2635
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2636
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2637
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2638
// Integer Immediate: 16-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2639
operand immI16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2640
  predicate(Immediate::is_simm16(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2641
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2642
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2643
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2644
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2645
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2646
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2647
// Integer Immediate: 8-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2648
operand immI8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2649
  predicate(Immediate::is_simm8(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2650
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2651
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2652
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2653
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2654
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2655
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2656
// Integer Immediate: constant 'int 0'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2657
operand immI_0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2658
  predicate(n->get_int() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2659
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2660
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2661
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2662
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2663
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2664
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2665
// Integer Immediate: constant 'int -1'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2666
operand immI_minus1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2667
  predicate(n->get_int() == -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2668
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2669
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2670
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2671
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2672
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2673
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2674
// Integer Immediate: constant, but not 'int 0' nor 'int -1'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2675
operand immI_n0m1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2676
  predicate(n->get_int() != 0 && n->get_int() != -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2677
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2678
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2679
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2680
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2681
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2682
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2683
//-------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2684
// UNSIGNED INT immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2685
//-------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2686
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2687
// Unsigned Integer Immediate: 32-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2688
operand uimmI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2689
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2690
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2691
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2692
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2693
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2694
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2695
// Unsigned Integer Immediate: 16-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2696
operand uimmI16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2697
  predicate(Immediate::is_uimm16(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2698
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2699
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2700
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2701
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2702
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2703
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2704
// Unsigned Integer Immediate: 12-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2705
operand uimmI12() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2706
  predicate(Immediate::is_uimm12(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2707
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2708
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2709
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2710
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2711
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2712
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2713
// Unsigned Integer Immediate: 12-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2714
operand uimmI8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2715
  predicate(Immediate::is_uimm8(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2716
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2717
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2718
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2719
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2720
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2721
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2722
// Integer Immediate: 6-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2723
operand uimmI6() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2724
  predicate(Immediate::is_uimm(n->get_int(), 6));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2725
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2726
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2727
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2728
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2729
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2730
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2731
// Integer Immediate: 5-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2732
operand uimmI5() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2733
  predicate(Immediate::is_uimm(n->get_int(), 5));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2734
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2735
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2736
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2737
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2738
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2739
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2740
// Length for SS instructions, given in DWs,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2741
//   possible range [1..512], i.e. [8..4096] Bytes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2742
//   used     range [1..256], i.e. [8..2048] Bytes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2743
//   operand type int
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2744
// Unsigned Integer Immediate: 9-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2745
operand SSlenDW() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2746
  predicate(Immediate::is_uimm8(n->get_long()-1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2747
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2748
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2749
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2750
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2751
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2752
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2753
//------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2754
// (UN)SIGNED INT specific values
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2755
//------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2756
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2757
// Integer Immediate: the value 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2758
operand immI_1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2759
  predicate(n->get_int() == 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2760
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2761
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2762
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2763
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2764
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2765
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2766
// Integer Immediate: the value 16.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2767
operand immI_16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2768
  predicate(n->get_int() == 16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2769
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2770
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2771
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2772
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2773
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2774
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2775
// Integer Immediate: the value 24.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2776
operand immI_24() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2777
  predicate(n->get_int() == 24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2778
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2779
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2780
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2781
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2782
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2783
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2784
// Integer Immediate: the value 255
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2785
operand immI_255() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2786
  predicate(n->get_int() == 255);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2787
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2788
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2789
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2790
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2791
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2792
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2793
// Integer Immediate: the values 32-63
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2794
operand immI_32_63() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2795
  predicate(n->get_int() >= 32 && n->get_int() <= 63);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2796
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2797
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2798
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2799
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2800
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2801
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2802
// Unsigned Integer Immediate: LL-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2803
operand uimmI_LL1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2804
  predicate((n->get_int() & 0xFFFF0000) == 0xFFFF0000);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2805
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2806
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2807
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2808
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2809
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2810
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2811
// Unsigned Integer Immediate: LH-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2812
operand uimmI_LH1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2813
  predicate((n->get_int() & 0xFFFF) == 0xFFFF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2814
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2815
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2816
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2817
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2818
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2819
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2820
//------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2821
// SIGNED LONG immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2822
//------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2823
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2824
operand immL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2825
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2826
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2827
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2828
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2829
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2830
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2831
// Long Immediate: 32-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2832
operand immL32() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2833
  predicate(Immediate::is_simm32(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2834
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2835
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2836
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2837
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2838
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2839
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2840
// Long Immediate: 20-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2841
operand immL20() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2842
  predicate(Immediate::is_simm20(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2843
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2844
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2845
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2846
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2847
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2848
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2849
// Long Immediate: 16-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2850
operand immL16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2851
  predicate(Immediate::is_simm16(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2852
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2853
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2854
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2855
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2856
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2857
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2858
// Long Immediate: 8-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2859
operand immL8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2860
  predicate(Immediate::is_simm8(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2861
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2862
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2863
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2864
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2865
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2866
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2867
//--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2868
// UNSIGNED LONG immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2869
//--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2870
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2871
operand uimmL32() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2872
  predicate(Immediate::is_uimm32(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2873
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2874
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2875
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2876
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2877
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2878
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2879
// Unsigned Long Immediate: 16-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2880
operand uimmL16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2881
  predicate(Immediate::is_uimm16(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2882
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2883
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2884
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2885
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2886
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2887
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2888
// Unsigned Long Immediate: 12-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2889
operand uimmL12() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2890
  predicate(Immediate::is_uimm12(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2891
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2892
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2893
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2894
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2895
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2896
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2897
// Unsigned Long Immediate: 8-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2898
operand uimmL8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2899
  predicate(Immediate::is_uimm8(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2900
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2901
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2902
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2903
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2904
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2905
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2906
//-------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2907
// (UN)SIGNED LONG specific values
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2908
//-------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2909
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2910
// Long Immediate: the value FF
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2911
operand immL_FF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2912
  predicate(n->get_long() == 0xFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2913
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2914
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2915
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2916
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2917
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2918
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2919
// Long Immediate: the value FFFF
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2920
operand immL_FFFF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2921
  predicate(n->get_long() == 0xFFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2922
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2923
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2924
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2925
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2926
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2927
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2928
// Long Immediate: the value FFFFFFFF
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2929
operand immL_FFFFFFFF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2930
  predicate(n->get_long() == 0xFFFFFFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2931
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2932
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2933
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2934
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2935
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2936
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2937
operand immL_0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2938
  predicate(n->get_long() == 0L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2939
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2940
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2941
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2942
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2943
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2944
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2945
// Unsigned Long Immediate: LL-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2946
operand uimmL_LL1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2947
  predicate((n->get_long() & 0xFFFFFFFFFFFF0000L) == 0xFFFFFFFFFFFF0000L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2948
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2949
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2950
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2951
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2952
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2953
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2954
// Unsigned Long Immediate: LH-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2955
operand uimmL_LH1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2956
  predicate((n->get_long() & 0xFFFFFFFF0000FFFFL) == 0xFFFFFFFF0000FFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2957
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2958
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2959
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2960
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2961
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2962
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2963
// Unsigned Long Immediate: HL-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2964
operand uimmL_HL1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2965
  predicate((n->get_long() & 0xFFFF0000FFFFFFFFL) == 0xFFFF0000FFFFFFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2966
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2967
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2968
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2969
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2970
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2971
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2972
// Unsigned Long Immediate: HH-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2973
operand uimmL_HH1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2974
  predicate((n->get_long() & 0xFFFFFFFFFFFFL) == 0xFFFFFFFFFFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2975
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2976
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2977
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2978
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2979
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2980
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2981
// Long Immediate: low 32-bit mask
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2982
operand immL_32bits() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2983
  predicate(n->get_long() == 0xFFFFFFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2984
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2985
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2986
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2987
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2988
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2989
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2990
//--------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2991
//  POINTER immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2992
//--------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2993
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2994
// Pointer Immediate: 64-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2995
operand immP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2996
  match(ConP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2997
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2998
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2999
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3000
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3001
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3002
// Pointer Immediate: 32-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3003
operand immP32() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3004
  predicate(Immediate::is_uimm32(n->get_ptr()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3005
  match(ConP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3006
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3007
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3008
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3009
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3010
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3011
// Pointer Immediate: 16-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3012
operand immP16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3013
  predicate(Immediate::is_uimm16(n->get_ptr()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3014
  match(ConP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3015
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3016
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3017
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3018
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3019
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3020
// Pointer Immediate: 8-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3021
operand immP8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3022
  predicate(Immediate::is_uimm8(n->get_ptr()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3023
  match(ConP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3024
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3025
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3026
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3027
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3028
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3029
//-----------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3030
// POINTER specific values
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3031
//-----------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3032
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3033
// Pointer Immediate: NULL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3034
operand immP0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3035
  predicate(n->get_ptr() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3036
  match(ConP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3037
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3038
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3039
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3040
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3041
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3042
//---------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3043
// NARROW POINTER immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3044
//---------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3045
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3046
// Narrow Pointer Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3047
operand immN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3048
  match(ConN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3049
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3050
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3051
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3052
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3053
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3054
operand immNKlass() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3055
  match(ConNKlass);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3056
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3057
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3058
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3059
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3060
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3061
// Narrow Pointer Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3062
operand immN8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3063
  predicate(Immediate::is_uimm8(n->get_narrowcon()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3064
  match(ConN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3065
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3066
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3067
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3068
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3069
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3070
// Narrow NULL Pointer Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3071
operand immN0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3072
  predicate(n->get_narrowcon() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3073
  match(ConN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3074
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3075
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3076
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3077
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3078
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3079
// FLOAT and DOUBLE immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3080
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3081
// Double Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3082
operand immD() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3083
  match(ConD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3084
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3085
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3086
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3087
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3088
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3089
// Double Immediate: +-0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3090
operand immDpm0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3091
  predicate(n->getd() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3092
  match(ConD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3093
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3094
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3095
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3096
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3097
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3098
// Double Immediate: +0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3099
operand immDp0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3100
  predicate(jlong_cast(n->getd()) == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3101
  match(ConD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3102
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3103
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3104
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3105
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3106
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3107
// Float Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3108
operand immF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3109
  match(ConF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3110
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3111
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3112
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3113
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3114
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3115
// Float Immediate: +-0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3116
operand immFpm0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3117
  predicate(n->getf() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3118
  match(ConF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3119
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3120
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3121
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3122
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3123
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3124
// Float Immediate: +0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3125
operand immFp0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3126
  predicate(jint_cast(n->getf()) == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3127
  match(ConF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3128
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3129
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3130
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3131
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3132
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3133
// End of Immediate Operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3134
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3135
// Integer Register Operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3136
// Integer Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3137
operand iRegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3138
  constraint(ALLOC_IN_RC(z_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3139
  match(RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3140
  match(noArg_iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3141
  match(rarg1RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3142
  match(rarg2RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3143
  match(rarg3RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3144
  match(rarg4RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3145
  match(rarg5RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3146
  match(noOdd_iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3147
  match(revenRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3148
  match(roddRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3149
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3150
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3151
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3152
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3153
operand noArg_iRegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3154
  constraint(ALLOC_IN_RC(z_no_arg_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3155
  match(RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3156
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3157
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3158
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3159
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3160
// Revenregi and roddRegI constitute and even-odd-pair.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3161
operand revenRegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3162
  constraint(ALLOC_IN_RC(z_rarg3_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3163
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3164
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3165
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3166
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3167
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3168
// Revenregi and roddRegI constitute and even-odd-pair.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3169
operand roddRegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3170
  constraint(ALLOC_IN_RC(z_rarg4_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3171
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3172
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3173
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3174
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3175
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3176
operand rarg1RegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3177
  constraint(ALLOC_IN_RC(z_rarg1_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3178
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3179
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3180
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3181
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3182
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3183
operand rarg2RegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3184
  constraint(ALLOC_IN_RC(z_rarg2_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3185
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3186
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3187
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3188
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3189
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3190
operand rarg3RegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3191
  constraint(ALLOC_IN_RC(z_rarg3_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3192
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3193
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3194
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3195
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3197
operand rarg4RegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3198
  constraint(ALLOC_IN_RC(z_rarg4_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3199
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3200
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3201
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3202
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3203
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3204
operand rarg5RegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3205
  constraint(ALLOC_IN_RC(z_rarg5_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3206
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3207
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3208
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3209
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3210
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3211
operand noOdd_iRegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3212
  constraint(ALLOC_IN_RC(z_no_odd_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3213
  match(RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3214
  match(revenRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3215
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3216
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3217
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3218
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3219
// Pointer Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3220
operand iRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3221
  constraint(ALLOC_IN_RC(z_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3222
  match(RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3223
  match(noArg_iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3224
  match(rarg1RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3225
  match(rarg2RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3226
  match(rarg3RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3227
  match(rarg4RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3228
  match(rarg5RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3229
  match(revenRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3230
  match(roddRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3231
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3232
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3233
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3234
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3235
// thread operand
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3236
operand threadRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3237
  constraint(ALLOC_IN_RC(z_thread_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3238
  match(RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3239
  format %{ "Z_THREAD" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3240
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3241
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3242
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3243
operand noArg_iRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3244
  constraint(ALLOC_IN_RC(z_no_arg_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3245
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3246
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3247
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3248
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3249
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3250
operand rarg1RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3251
  constraint(ALLOC_IN_RC(z_rarg1_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3252
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3253
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3254
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3255
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3256
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3257
operand rarg2RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3258
  constraint(ALLOC_IN_RC(z_rarg2_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3259
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3260
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3261
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3262
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3263
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3264
operand rarg3RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3265
  constraint(ALLOC_IN_RC(z_rarg3_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3266
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3267
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3268
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3269
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3270
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3271
operand rarg4RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3272
  constraint(ALLOC_IN_RC(z_rarg4_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3273
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3274
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3275
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3276
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3277
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3278
operand rarg5RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3279
  constraint(ALLOC_IN_RC(z_rarg5_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3280
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3281
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3282
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3283
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3284
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3285
operand memoryRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3286
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3287
  match(RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3288
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3289
  match(threadRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3290
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3291
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3292
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3293
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3294
// Revenregp and roddRegP constitute and even-odd-pair.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3295
operand revenRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3296
  constraint(ALLOC_IN_RC(z_rarg3_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3297
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3298
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3299
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3300
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3301
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3302
// Revenregl and roddRegL constitute and even-odd-pair.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3303
operand roddRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3304
  constraint(ALLOC_IN_RC(z_rarg4_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3305
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3306
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3307
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3308
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3309
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3310
operand lock_ptr_RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3311
  constraint(ALLOC_IN_RC(z_lock_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3312
  match(RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3313
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3314
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3315
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3316
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3317
operand rscratch2RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3318
  constraint(ALLOC_IN_RC(z_rscratch2_bits64_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3319
  match(RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3320
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3321
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3322
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3323
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3324
operand iRegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3325
  constraint(ALLOC_IN_RC(z_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3326
  match(RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3327
  match(noArg_iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3328
  match(rarg1RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3329
  match(rarg2RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3330
  match(rarg3RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3331
  match(rarg4RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3332
  match(rarg5RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3333
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3334
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3335
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3336
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3337
operand noArg_iRegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3338
  constraint(ALLOC_IN_RC(z_no_arg_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3339
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3340
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3341
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3342
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3343
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3344
operand rarg1RegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3345
  constraint(ALLOC_IN_RC(z_rarg1_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3346
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3347
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3348
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3349
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3350
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3351
operand rarg2RegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3352
  constraint(ALLOC_IN_RC(z_rarg2_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3353
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3354
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3355
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3356
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3357
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3358
operand rarg3RegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3359
  constraint(ALLOC_IN_RC(z_rarg3_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3360
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3361
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3362
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3363
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3364
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3365
operand rarg4RegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3366
  constraint(ALLOC_IN_RC(z_rarg4_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3367
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3368
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3369
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3370
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3371
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3372
operand rarg5RegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3373
  constraint(ALLOC_IN_RC(z_rarg5_ptrN_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3374
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3375
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3376
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3377
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3378
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3379
// Long Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3380
operand iRegL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3381
  constraint(ALLOC_IN_RC(z_long_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3382
  match(RegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3383
  match(revenRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3384
  match(roddRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3385
  match(rarg1RegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3386
  match(rarg5RegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3387
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3388
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3389
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3390
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3391
// Revenregl and roddRegL constitute and even-odd-pair.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3392
operand revenRegL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3393
  constraint(ALLOC_IN_RC(z_rarg3_long_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3394
  match(iRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3395
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3396
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3397
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3398
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3399
// Revenregl and roddRegL constitute and even-odd-pair.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3400
operand roddRegL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3401
  constraint(ALLOC_IN_RC(z_rarg4_long_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3402
  match(iRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3403
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3404
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3405
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3406
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3407
operand rarg1RegL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3408
  constraint(ALLOC_IN_RC(z_rarg1_long_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3409
  match(iRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3410
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3411
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3412
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3413
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3414
operand rarg5RegL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3415
  constraint(ALLOC_IN_RC(z_rarg5_long_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3416
  match(iRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3417
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3418
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3419
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3420
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3421
// Condition Code Flag Registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3422
operand flagsReg() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3423
  constraint(ALLOC_IN_RC(z_condition_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3424
  match(RegFlags);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3425
  format %{ "CR" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3426
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3427
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3428
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3429
// Condition Code Flag Registers for rules with result tuples
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3430
operand TD_flagsReg() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3431
  constraint(ALLOC_IN_RC(z_condition_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3432
  match(RegFlags);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3433
  format %{ "CR" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3434
  interface(REG_TUPLE_DEST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3435
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3436
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3437
operand regD() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3438
  constraint(ALLOC_IN_RC(z_dbl_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3439
  match(RegD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3440
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3441
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3442
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3443
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3444
operand rscratchRegD() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3445
  constraint(ALLOC_IN_RC(z_rscratch1_dbl_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3446
  match(RegD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3447
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3448
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3449
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3450
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3451
operand regF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3452
  constraint(ALLOC_IN_RC(z_flt_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3453
  match(RegF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3454
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3455
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3456
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3457
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3458
operand rscratchRegF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3459
  constraint(ALLOC_IN_RC(z_rscratch1_flt_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3460
  match(RegF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3461
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3462
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3463
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3464
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3465
// Special Registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3466
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3467
// Method Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3468
operand inline_cache_regP(iRegP reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3469
  constraint(ALLOC_IN_RC(z_r9_regP)); // inline_cache_reg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3470
  match(reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3471
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3472
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3473
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3474
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3475
operand compiler_method_oop_regP(iRegP reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3476
  constraint(ALLOC_IN_RC(z_r1_RegP)); // compiler_method_oop_reg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3477
  match(reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3478
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3479
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3480
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3481
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3482
operand interpreter_method_oop_regP(iRegP reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3483
  constraint(ALLOC_IN_RC(z_r9_regP)); // interpreter_method_oop_reg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3484
  match(reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3485
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3486
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3487
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3488
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3489
// Operands to remove register moves in unscaled mode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3490
// Match read/write registers with an EncodeP node if neither shift nor add are required.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3491
operand iRegP2N(iRegP reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3492
  predicate(Universe::narrow_oop_shift() == 0 && _leaf->as_EncodeP()->in(0) == NULL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3493
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3494
  match(EncodeP reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3495
  format %{ "$reg" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3496
  interface(REG_INTER)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3497
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3498
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3499
operand iRegN2P(iRegN reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3500
  predicate(Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0 &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3501
            _leaf->as_DecodeN()->in(0) == NULL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3502
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3503
  match(DecodeN reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3504
  format %{ "$reg" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3505
  interface(REG_INTER)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3506
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3507
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3508
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3509
//----------Complex Operands---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3510
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3511
// Indirect Memory Reference
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3512
operand indirect(memoryRegP base) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3513
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3514
  match(base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3515
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3516
  format %{ "#0[,$base]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3517
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3518
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3519
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3520
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3521
    disp(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3522
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3523
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3524
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3525
// Indirect with Offset (long)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3526
operand indOffset20(memoryRegP base, immL20 offset) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3527
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3528
  match(AddP base offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3529
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3530
  format %{ "$offset[,$base]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3531
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3532
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3533
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3534
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3535
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3536
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3537
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3538
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3539
operand indOffset20Narrow(iRegN base, immL20 offset) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3540
  predicate(Matcher::narrow_oop_use_complex_address());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3541
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3542
  match(AddP (DecodeN base) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3543
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3544
  format %{ "$offset[,$base]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3545
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3546
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3547
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3548
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3549
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3550
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3551
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3552
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3553
// Indirect with Offset (short)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3554
operand indOffset12(memoryRegP base, uimmL12 offset) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3555
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3556
  match(AddP base offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3557
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3558
  format %{ "$offset[[,$base]]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3559
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3560
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3561
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3562
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3563
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3564
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3565
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3566
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3567
operand indOffset12Narrow(iRegN base, uimmL12 offset) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3568
  predicate(Matcher::narrow_oop_use_complex_address());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3569
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3570
  match(AddP (DecodeN base) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3571
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3572
  format %{ "$offset[[,$base]]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3573
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3574
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3575
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3576
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3577
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3578
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3579
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3580
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3581
// Indirect with Register Index
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3582
operand indIndex(memoryRegP base, iRegL index) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3583
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3584
  match(AddP base index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3585
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3586
  format %{ "#0[($index,$base)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3587
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3588
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3589
    index($index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3590
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3591
    disp(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3592
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3593
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3594
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3595
// Indirect with Offset (long) and index
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3596
operand indOffset20index(memoryRegP base, immL20 offset, iRegL index) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3597
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3598
  match(AddP (AddP base index) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3599
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3600
  format %{ "$offset[($index,$base)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3601
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3602
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3603
    index($index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3604
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3605
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3606
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3607
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3608
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3609
operand indOffset20indexNarrow(iRegN base, immL20 offset, iRegL index) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3610
  predicate(Matcher::narrow_oop_use_complex_address());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3611
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3612
  match(AddP (AddP (DecodeN base) index) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3613
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3614
  format %{ "$offset[($index,$base)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3615
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3616
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3617
    index($index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3618
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3619
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3620
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3621
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3622
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3623
// Indirect with Offset (short) and index
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3624
operand indOffset12index(memoryRegP base, uimmL12 offset, iRegL index) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3625
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3626
  match(AddP (AddP base index) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3627
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3628
  format %{ "$offset[[($index,$base)]]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3629
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3630
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3631
    index($index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3632
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3633
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3634
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3635
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3636
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3637
operand indOffset12indexNarrow(iRegN base, uimmL12 offset, iRegL index) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3638
  predicate(Matcher::narrow_oop_use_complex_address());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3639
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3640
  match(AddP (AddP (DecodeN base) index) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3641
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3642
  format %{ "$offset[[($index,$base)]]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3643
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3644
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3645
    index($index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3646
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3647
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3648
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3649
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3650
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3651
//----------Special Memory Operands--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3652
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3653
// Stack Slot Operand
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3654
// This operand is used for loading and storing temporary values on
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3655
// the stack where a match requires a value to flow through memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3656
operand stackSlotI(sRegI reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3657
  constraint(ALLOC_IN_RC(stack_slots));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3658
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3659
  format %{ "[$reg(stackSlotI)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3660
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3661
    base(0xf);   // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3662
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3663
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3664
    disp($reg);  // stack offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3665
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3666
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3667
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3668
operand stackSlotP(sRegP reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3669
  constraint(ALLOC_IN_RC(stack_slots));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3670
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3671
  format %{ "[$reg(stackSlotP)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3672
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3673
    base(0xf);   // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3674
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3675
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3676
    disp($reg);  // Stack Offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3677
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3678
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3679
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3680
operand stackSlotF(sRegF reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3681
  constraint(ALLOC_IN_RC(stack_slots));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3682
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3683
  format %{ "[$reg(stackSlotF)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3684
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3685
    base(0xf);   // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3686
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3687
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3688
    disp($reg);  // Stack Offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3689
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3690
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3691
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3692
operand stackSlotD(sRegD reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3693
  constraint(ALLOC_IN_RC(stack_slots));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3694
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3695
  //match(RegD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3696
  format %{ "[$reg(stackSlotD)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3697
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3698
    base(0xf);   // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3699
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3700
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3701
    disp($reg);  // Stack Offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3702
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3703
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3704
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3705
operand stackSlotL(sRegL reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3706
  constraint(ALLOC_IN_RC(stack_slots));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3707
  op_cost(1);  //match(RegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3708
  format %{ "[$reg(stackSlotL)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3709
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3710
    base(0xf);   // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3711
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3712
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3713
    disp($reg);  // Stack Offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3714
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3715
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3716
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3717
// Operands for expressing Control Flow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3718
// NOTE: Label is a predefined operand which should not be redefined in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3719
// the AD file. It is generically handled within the ADLC.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3720
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3721
//----------Conditional Branch Operands----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3722
// Comparison Op  - This is the operation of the comparison, and is limited to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3723
//                  the following set of codes:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3724
//                  L (<), LE (<=), G (>), GE (>=), E (==), NE (!=)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3725
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3726
// Other attributes of the comparison, such as unsignedness, are specified
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3727
// by the comparison instruction that sets a condition code flags register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3728
// That result is represented by a flags operand whose subtype is appropriate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3729
// to the unsignedness (etc.) of the comparison.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3730
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3731
// Later, the instruction which matches both the Comparison Op (a Bool) and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3732
// the flags (produced by the Cmp) specifies the coding of the comparison op
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3733
// by matching a specific subtype of Bool operand below.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3734
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3735
// INT cmpOps for CompareAndBranch and CompareAndTrap instructions should not
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3736
// have mask bit #3 set.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3737
operand cmpOpT() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3738
  match(Bool);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3739
  format %{ "" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3740
  interface(COND_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3741
    equal(0x8);         // Assembler::bcondEqual
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3742
    not_equal(0x6);     // Assembler::bcondNotEqual
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3743
    less(0x4);          // Assembler::bcondLow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3744
    greater_equal(0xa); // Assembler::bcondNotLow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3745
    less_equal(0xc);    // Assembler::bcondNotHigh
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3746
    greater(0x2);       // Assembler::bcondHigh
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3747
    overflow(0x1);      // Assembler::bcondOverflow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3748
    no_overflow(0xe);   // Assembler::bcondNotOverflow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3749
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3750
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3751
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3752
// When used for floating point comparisons: unordered is treated as less.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3753
operand cmpOpF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3754
  match(Bool);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3755
  format %{ "" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3756
  interface(COND_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3757
    equal(0x8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3758
    not_equal(0x7);     // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3759
    less(0x5);          // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3760
    greater_equal(0xa);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3761
    less_equal(0xd);    // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3762
    greater(0x2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3763
    overflow(0x0);      // Not meaningful on z/Architecture.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3764
    no_overflow(0x0);   // leave unchanged (zero) therefore
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3765
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3766
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3767
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3768
// "Regular" cmpOp for int comparisons, includes bit #3 (overflow).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3769
operand cmpOp() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3770
  match(Bool);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3771
  format %{ "" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3772
  interface(COND_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3773
    equal(0x8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3774
    not_equal(0x7);     // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3775
    less(0x5);          // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3776
    greater_equal(0xa);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3777
    less_equal(0xd);    // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3778
    greater(0x2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3779
    overflow(0x1);      // Assembler::bcondOverflow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3780
    no_overflow(0xe);   // Assembler::bcondNotOverflow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3781
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3782
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3783
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3784
//----------OPERAND CLASSES----------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3785
// Operand Classes are groups of operands that are used to simplify
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3786
// instruction definitions by not requiring the AD writer to specify
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3787
// seperate instructions for every form of operand when the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3788
// instruction accepts multiple operand types with the same basic
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3789
// encoding and format.  The classic case of this is memory operands.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3790
// Indirect is not included since its use is limited to Compare & Swap
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3791
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3792
// Most general memory operand, allows base, index, and long displacement.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3793
opclass memory(indirect, indIndex, indOffset20, indOffset20Narrow, indOffset20index, indOffset20indexNarrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3794
opclass memoryRXY(indirect, indIndex, indOffset20, indOffset20Narrow, indOffset20index, indOffset20indexNarrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3795
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3796
// General memory operand, allows base, index, and short displacement.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3797
opclass memoryRX(indirect, indIndex, indOffset12, indOffset12Narrow, indOffset12index, indOffset12indexNarrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3798
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3799
// Memory operand, allows only base and long displacement.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3800
opclass memoryRSY(indirect, indOffset20, indOffset20Narrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3801
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3802
// Memory operand, allows only base and short displacement.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3803
opclass memoryRS(indirect, indOffset12, indOffset12Narrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3804
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3805
// Operand classes to match encode and decode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3806
opclass iRegN_P2N(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3807
opclass iRegP_N2P(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3808
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3809
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3810
//----------PIPELINE-----------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3811
pipeline %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3812
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3813
//----------ATTRIBUTES---------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3814
attributes %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3815
  // z/Architecture instructions are of length 2, 4, or 6 bytes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3816
  variable_size_instructions;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3817
  instruction_unit_size = 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3818
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3819
  // Meaningless on z/Architecture.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3820
  max_instructions_per_bundle = 1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3821
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3822
  // The z/Architecture processor fetches 64 bytes...
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3823
  instruction_fetch_unit_size = 64;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3824
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3825
  // ...in one line.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3826
  instruction_fetch_units = 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3827
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3828
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3829
//----------RESOURCES----------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3830
// Resources are the functional units available to the machine.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3831
resources(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3832
   Z_BR,     // branch unit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3833
   Z_CR,     // condition unit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3834
   Z_FX1,    // integer arithmetic unit 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3835
   Z_FX2,    // integer arithmetic unit 2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3836
   Z_LDST1,  // load/store unit 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3837
   Z_LDST2,  // load/store unit 2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3838
   Z_FP1,    // float arithmetic unit 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3839
   Z_FP2,    // float arithmetic unit 2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3840
   Z_LDST = Z_LDST1 | Z_LDST2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3841
   Z_FX   = Z_FX1 | Z_FX2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3842
   Z_FP   = Z_FP1 | Z_FP2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3843
  );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3844
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3845
//----------PIPELINE DESCRIPTION-----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3846
// Pipeline Description specifies the stages in the machine's pipeline.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3847
pipe_desc(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3848
   // TODO: adapt
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3849
   Z_IF,  // instruction fetch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3850
   Z_IC,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3851
   Z_D0,  // decode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3852
   Z_D1,  // decode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3853
   Z_D2,  // decode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3854
   Z_D3,  // decode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3855
   Z_Xfer1,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3856
   Z_GD,  // group definition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3857
   Z_MP,  // map
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3858
   Z_ISS, // issue
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3859
   Z_RF,  // resource fetch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3860
   Z_EX1, // execute (all units)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3861
   Z_EX2, // execute (FP, LDST)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3862
   Z_EX3, // execute (FP, LDST)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3863
   Z_EX4, // execute (FP)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3864
   Z_EX5, // execute (FP)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3865
   Z_EX6, // execute (FP)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3866
   Z_WB,  // write back
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3867
   Z_Xfer2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3868
   Z_CP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3869
  );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3870
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3871
//----------PIPELINE CLASSES---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3872
// Pipeline Classes describe the stages in which input and output are
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3873
// referenced by the hardware pipeline.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3874
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3875
// Providing the `ins_pipe' declarations in the instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3876
// specifications seems to be of little use. So we use
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3877
// `pipe_class_dummy' for all our instructions at present.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3878
pipe_class pipe_class_dummy() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3879
  single_instruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3880
  fixed_latency(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3881
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3882
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3883
// SIGTRAP based implicit range checks in compiled code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3884
// Currently, no pipe classes are used on z/Architecture.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3885
pipe_class pipe_class_trap() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3886
  single_instruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3887
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3888
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3889
pipe_class pipe_class_fx_reg_reg(iRegI dst, iRegI src1, iRegI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3890
  single_instruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3891
  dst  : Z_EX1(write);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3892
  src1 : Z_RF(read);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3893
  src2 : Z_RF(read);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3894
  Z_FX : Z_RF;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3895
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3896
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3897
pipe_class pipe_class_ldst(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3898
  single_instruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3899
  mem : Z_RF(read);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3900
  dst : Z_WB(write);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3901
  Z_LDST : Z_RF;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3902
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3903
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3904
define %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3905
  MachNop = pipe_class_dummy;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3906
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3907
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3908
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3909
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3910
//----------INSTRUCTIONS-------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3911
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3912
//---------- Chain stack slots between similar types --------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3913
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3914
// Load integer from stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3915
instruct stkI_to_regI(iRegI dst, stackSlotI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3916
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3917
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3918
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3919
  format %{ "L       $dst,$src\t # stk reload int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3920
  opcode(L_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3921
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3922
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3923
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3924
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3925
// Store integer to stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3926
instruct regI_to_stkI(stackSlotI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3927
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3928
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3929
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3930
  format %{ "ST      $src,$dst\t # stk spill int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3931
  opcode(ST_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3932
  ins_encode(z_form_rt_mem(src, dst)); // rs=rt
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3933
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3934
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3935
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3936
// Load long from stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3937
instruct stkL_to_regL(iRegL dst, stackSlotL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3938
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3939
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3940
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3941
  format %{ "LG      $dst,$src\t # stk reload long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3942
  opcode(LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3943
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3944
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3945
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3946
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3947
// Store long to stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3948
instruct regL_to_stkL(stackSlotL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3949
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3950
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3951
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3952
  format %{ "STG     $src,$dst\t # stk spill long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3953
  opcode(STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3954
  ins_encode(z_form_rt_mem(src, dst)); // rs=rt
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3955
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3956
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3957
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3958
// Load pointer from stack slot, 64-bit encoding.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3959
instruct stkP_to_regP(iRegP dst, stackSlotP src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3960
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3961
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3962
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3963
  format %{ "LG      $dst,$src\t # stk reload ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3964
  opcode(LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3965
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3966
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3967
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3968
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3969
// Store pointer to stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3970
instruct regP_to_stkP(stackSlotP dst, iRegP src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3971
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3972
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3973
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3974
  format %{ "STG     $src,$dst\t # stk spill ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3975
  opcode(STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3976
  ins_encode(z_form_rt_mem(src, dst)); // rs=rt
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3977
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3978
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3979
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3980
//  Float types
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3981
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3982
// Load float value from stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3983
instruct stkF_to_regF(regF dst, stackSlotF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3984
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3985
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3986
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3987
  format %{ "LE(Y)   $dst,$src\t # stk reload float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3988
  opcode(LE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3989
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3990
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3991
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3992
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3993
// Store float value to stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3994
instruct regF_to_stkF(stackSlotF dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3995
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3996
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3997
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3998
  format %{ "STE(Y)  $src,$dst\t # stk spill float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3999
  opcode(STE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4000
  ins_encode(z_form_rt_mem(src, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4001
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4002
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4003
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4004
// Load double value from stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4005
instruct stkD_to_regD(regD dst, stackSlotD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4006
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4007
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4008
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4009
  format %{ "LD(Y)   $dst,$src\t # stk reload double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4010
  opcode(LD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4011
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4012
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4013
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4014
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4015
// Store double value to stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4016
instruct regD_to_stkD(stackSlotD dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4017
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4018
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4019
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4020
  format %{ "STD(Y)  $src,$dst\t # stk spill double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4021
  opcode(STD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4022
  ins_encode(z_form_rt_mem(src, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4023
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4024
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4025
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4026
//----------Load/Store/Move Instructions---------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4027
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4028
//----------Load Instructions--------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4029
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4030
//------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4031
//  MEMORY
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4032
//------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4033
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4034
//  BYTE
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4035
// Load Byte (8bit signed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4036
instruct loadB(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4037
  match(Set dst (LoadB mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4038
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4039
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4040
  format %{ "LB      $dst, $mem\t # sign-extend byte to int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4041
  opcode(LB_ZOPC, LB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4042
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4043
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4044
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4045
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4046
// Load Byte (8bit signed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4047
instruct loadB2L(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4048
  match(Set dst (ConvI2L (LoadB mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4049
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4050
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4051
  format %{ "LGB     $dst, $mem\t # sign-extend byte to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4052
  opcode(LGB_ZOPC, LGB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4053
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4054
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4055
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4056
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4057
// Load Unsigned Byte (8bit UNsigned) into an int reg.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4058
instruct loadUB(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4059
  match(Set dst (LoadUB mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4060
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4061
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4062
  format %{ "LLGC    $dst,$mem\t # zero-extend byte to int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4063
  opcode(LLGC_ZOPC, LLGC_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4064
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4065
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4066
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4067
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4068
// Load Unsigned Byte (8bit UNsigned) into a Long Register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4069
instruct loadUB2L(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4070
  match(Set dst (ConvI2L (LoadUB mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4071
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4072
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4073
  format %{ "LLGC    $dst,$mem\t # zero-extend byte to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4074
  opcode(LLGC_ZOPC, LLGC_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4075
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4076
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4077
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4078
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4079
// CHAR/SHORT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4080
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4081
// Load Short (16bit signed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4082
instruct loadS(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4083
  match(Set dst (LoadS mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4084
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4085
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4086
  format %{ "LH(Y)   $dst,$mem\t # sign-extend short to int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4087
  opcode(LHY_ZOPC, LH_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4088
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4089
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4090
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4091
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4092
// Load Short (16bit signed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4093
instruct loadS2L(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4094
  match(Set dst (ConvI2L (LoadS mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4095
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4096
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4097
  format %{ "LGH     $dst,$mem\t # sign-extend short to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4098
  opcode(LGH_ZOPC, LGH_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4099
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4100
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4101
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4102
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4103
// Load Char (16bit Unsigned)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4104
instruct loadUS(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4105
  match(Set dst (LoadUS mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4106
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4107
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4108
  format %{ "LLGH    $dst,$mem\t # zero-extend short to int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4109
  opcode(LLGH_ZOPC, LLGH_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4110
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4111
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4112
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4113
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4114
// Load Unsigned Short/Char (16bit UNsigned) into a Long Register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4115
instruct loadUS2L(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4116
  match(Set dst (ConvI2L (LoadUS mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4117
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4118
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4119
  format %{ "LLGH    $dst,$mem\t # zero-extend short to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4120
  opcode(LLGH_ZOPC, LLGH_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4121
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4122
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4123
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4124
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4125
// INT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4126
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4127
// Load Integer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4128
instruct loadI(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4129
  match(Set dst (LoadI mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4130
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4131
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4132
  format %{ "L(Y)    $dst,$mem\t #" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4133
  opcode(LY_ZOPC, L_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4134
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4135
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4136
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4137
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4138
// Load and convert to long.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4139
instruct loadI2L(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4140
  match(Set dst (ConvI2L (LoadI mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4141
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4142
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4143
  format %{ "LGF     $dst,$mem\t #" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4144
  opcode(LGF_ZOPC, LGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4145
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4146
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4147
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4148
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4149
// Load Unsigned Integer into a Long Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4150
instruct loadUI2L(iRegL dst, memory mem, immL_FFFFFFFF mask) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4151
  match(Set dst (AndL (ConvI2L (LoadI mem)) mask));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4152
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4153
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4154
  format %{ "LLGF    $dst,$mem\t # zero-extend int to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4155
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4156
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4157
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4158
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4159
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4160
// range = array length (=jint)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4161
// Load Range
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4162
instruct loadRange(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4163
  match(Set dst (LoadRange mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4164
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4165
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4166
  format %{ "L(Y)    $dst,$mem\t # range" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4167
  opcode(LY_ZOPC, L_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4168
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4169
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4170
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4171
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4172
// LONG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4173
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4174
// Load Long - aligned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4175
instruct loadL(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4176
  match(Set dst (LoadL mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4177
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4178
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4179
  format %{ "LG      $dst,$mem\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4180
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4181
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4182
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4183
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4184
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4185
// Load Long - UNaligned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4186
instruct loadL_unaligned(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4187
  match(Set dst (LoadL_unaligned mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4188
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4189
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4190
  format %{ "LG      $dst,$mem\t # unaligned long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4191
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4192
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4193
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4194
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4195
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4197
// PTR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4198
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4199
// Load Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4200
instruct loadP(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4201
  match(Set dst (LoadP mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4202
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4203
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4204
  format %{ "LG      $dst,$mem\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4205
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4206
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4207
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4208
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4209
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4210
// LoadP + CastP2L
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4211
instruct castP2X_loadP(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4212
  match(Set dst (CastP2X (LoadP mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4213
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4214
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4215
  format %{ "LG      $dst,$mem\t # ptr + p2x" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4216
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4217
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4218
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4219
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4220
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4221
// Load Klass Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4222
instruct loadKlass(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4223
  match(Set dst (LoadKlass mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4224
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4225
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4226
  format %{ "LG      $dst,$mem\t # klass ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4227
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4228
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4229
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4230
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4231
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4232
instruct loadTOC(iRegL dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4233
  effect(DEF dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4234
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4235
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4236
  // TODO: check why this attribute causes many unnecessary rematerializations.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4237
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4238
  // The graphs I saw just had high register pressure. Further the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4239
  // register TOC is loaded to is overwritten by the constant short
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4240
  // after. Here something as round robin register allocation might
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4241
  // help. But rematerializing seems not to hurt, jack even seems to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4242
  // improve slightly.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4243
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4244
  // Without this flag we get spill-split recycle sanity check
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4245
  // failures in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4246
  // spec.benchmarks._228_jack.NfaState::GenerateCode. This happens in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4247
  // a block with three loadConP_dynTOC nodes and a tlsLoadP. The
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4248
  // tlsLoadP has a huge amount of outs and forces the TOC down to the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4249
  // stack. Later tlsLoadP is rematerialized, leaving the register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4250
  // allocator with TOC on the stack and a badly placed reload.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4251
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4252
  format %{ "LARL    $dst, &constant_pool\t; load dynTOC" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4253
  ins_encode %{ __ load_toc($dst$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4254
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4255
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4256
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4257
// FLOAT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4258
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4259
// Load Float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4260
instruct loadF(regF dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4261
  match(Set dst (LoadF mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4262
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4263
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4264
  format %{ "LE(Y)    $dst,$mem" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4265
  opcode(LEY_ZOPC, LE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4266
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4267
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4268
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4269
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4270
// DOUBLE
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4271
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4272
// Load Double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4273
instruct loadD(regD dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4274
  match(Set dst (LoadD mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4275
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4276
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4277
  format %{ "LD(Y)    $dst,$mem" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4278
  opcode(LDY_ZOPC, LD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4279
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4280
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4281
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4282
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4283
// Load Double - UNaligned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4284
instruct loadD_unaligned(regD dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4285
  match(Set dst (LoadD_unaligned mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4286
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4287
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4288
  format %{ "LD(Y)    $dst,$mem" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4289
  opcode(LDY_ZOPC, LD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4290
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4291
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4292
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4293
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4294
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4295
//----------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4296
//  IMMEDIATES
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4297
//----------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4298
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4299
instruct loadConI(iRegI dst, immI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4300
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4301
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4302
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4303
  format %{ "LGFI     $dst,$src\t # (int)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4304
  ins_encode %{ __ z_lgfi($dst$$Register, $src$$constant); %}  // Sign-extend to 64 bit, it's at no cost.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4305
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4306
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4307
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4308
instruct loadConI16(iRegI dst, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4309
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4310
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4311
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4312
  format %{ "LGHI     $dst,$src\t # (int)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4313
  ins_encode %{ __ z_lghi($dst$$Register, $src$$constant); %}  // Sign-extend to 64 bit, it's at no cost.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4314
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4315
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4316
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4317
instruct loadConI_0(iRegI dst, immI_0 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4318
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4319
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4320
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4321
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4322
  format %{ "loadConI $dst,$src\t # (int) XGR because ZERO is loaded" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4323
  opcode(XGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4324
  ins_encode(z_rreform(dst, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4325
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4326
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4327
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4328
instruct loadConUI16(iRegI dst, uimmI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4329
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4330
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4331
  format %{ "LLILL    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4332
  opcode(LLILL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4333
  ins_encode(z_riform_unsigned(dst, src) );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4334
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4335
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4336
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4337
// Load long constant from TOC with pcrelative address.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4338
instruct loadConL_pcrelTOC(iRegL dst, immL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4339
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4340
  ins_cost(MEMORY_REF_COST_LO);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4341
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4342
  format %{ "LGRL    $dst,[pcrelTOC]\t # load long $src from table" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4343
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4344
    address long_address = __ long_constant($src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4345
    if (long_address == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4346
      Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4347
      return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4348
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4349
    __ load_long_pcrelative($dst$$Register, long_address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4350
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4351
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4352
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4353
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4354
instruct loadConL32(iRegL dst, immL32 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4355
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4356
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4357
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4358
  format %{ "LGFI     $dst,$src\t # (long)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4359
  ins_encode %{ __ z_lgfi($dst$$Register, $src$$constant); %}  // Sign-extend to 64 bit, it's at no cost.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4360
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4361
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4362
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4363
instruct loadConL16(iRegL dst, immL16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4364
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4365
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4366
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4367
  format %{ "LGHI     $dst,$src\t # (long)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4368
  ins_encode %{ __ z_lghi($dst$$Register, $src$$constant); %}  // Sign-extend to 64 bit, it's at no cost.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4369
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4370
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4371
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4372
instruct loadConL_0(iRegL dst, immL_0 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4373
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4374
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4375
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4376
  format %{ "LoadConL    $dst,$src\t # (long) XGR because ZERO is loaded" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4377
  opcode(XGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4378
  ins_encode(z_rreform(dst, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4379
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4380
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4381
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4382
// Load ptr constant from TOC with pc relative address.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4383
// Special handling for oop constants required.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4384
instruct loadConP_pcrelTOC(iRegP dst, immP src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4385
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4386
  ins_cost(MEMORY_REF_COST_LO);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4387
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4388
  format %{ "LGRL    $dst,[pcrelTOC]\t # load ptr $src from table" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4389
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4390
    relocInfo::relocType constant_reloc = $src->constant_reloc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4391
    if (constant_reloc == relocInfo::oop_type) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4392
      AddressLiteral a = __ allocate_oop_address((jobject)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4393
      bool success = __ load_oop_from_toc($dst$$Register, a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4394
      if (!success) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4395
        Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4396
        return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4397
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4398
    } else if (constant_reloc == relocInfo::metadata_type) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4399
      AddressLiteral a = __ constant_metadata_address((Metadata *)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4400
      address const_toc_addr = __ address_constant((address)a.value(), RelocationHolder::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4401
      if (const_toc_addr == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4402
        Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4403
        return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4404
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4405
      __ load_long_pcrelative($dst$$Register, const_toc_addr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4406
    } else {          // Non-oop pointers, e.g. card mark base, heap top.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4407
      address long_address = __ long_constant((jlong)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4408
      if (long_address == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4409
        Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4410
        return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4411
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4412
      __ load_long_pcrelative($dst$$Register, long_address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4413
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4414
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4415
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4416
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4417
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4418
// We don't use immP16 to avoid problems with oops.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4419
instruct loadConP0(iRegP dst, immP0 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4420
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4421
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4422
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4423
  format %{ "XGR     $dst,$dst\t # NULL ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4424
  opcode(XGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4425
  ins_encode(z_rreform(dst, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4426
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4427
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4428
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4429
//----------Load Float Constant Instructions-------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4430
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4431
// We may not specify this instruction via an `expand' rule. If we do,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4432
// code selection will forget that this instruction needs a floating
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4433
// point constant inserted into the code buffer. So `Shorten_branches'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4434
// will fail.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4435
instruct loadConF_dynTOC(regF dst, immF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4436
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4437
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4438
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4439
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4440
  // If this instruction rematerializes, it prolongs the live range
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4441
  // of the toc node, causing illegal graphs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4442
  ins_cannot_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4443
  format %{ "LE(Y)    $dst,$constantoffset[,$constanttablebase]\t # load FLOAT $src from table" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4444
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4445
    __ load_float_largeoffset($dst$$FloatRegister, $constantoffset($src), $constanttablebase, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4446
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4447
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4448
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4449
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4450
// E may not specify this instruction via an `expand' rule. If we do,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4451
// code selection will forget that this instruction needs a floating
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4452
// point constant inserted into the code buffer. So `Shorten_branches'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4453
// will fail.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4454
instruct loadConD_dynTOC(regD dst, immD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4455
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4456
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4457
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4458
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4459
  // If this instruction rematerializes, it prolongs the live range
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4460
  // of the toc node, causing illegal graphs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4461
  ins_cannot_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4462
  format %{ "LD(Y)    $dst,$constantoffset[,$constanttablebase]\t # load DOUBLE $src from table" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4463
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4464
    __ load_double_largeoffset($dst$$FloatRegister, $constantoffset($src), $constanttablebase, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4465
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4466
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4467
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4468
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4469
// Special case: Load Const 0.0F
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4470
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4471
// There's a special instr to clear a FP register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4472
instruct loadConF0(regF dst, immFp0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4473
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4474
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4475
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4476
  format %{ "LZER     $dst,$src\t # clear to zero" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4477
  opcode(LZER_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4478
  ins_encode(z_rreform(dst, Z_F0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4479
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4480
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4481
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4482
// There's a special instr to clear a FP register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4483
instruct loadConD0(regD dst, immDp0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4484
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4485
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4486
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4487
  format %{ "LZDR     $dst,$src\t # clear to zero" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4488
  opcode(LZDR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4489
  ins_encode(z_rreform(dst, Z_F0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4490
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4491
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4492
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4493
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4494
//----------Store Instructions-------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4495
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4496
// BYTE
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4497
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4498
// Store Byte
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4499
instruct storeB(memory mem, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4500
  match(Set mem (StoreB mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4501
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4502
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4503
  format %{ "STC(Y)  $src,$mem\t # byte" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4504
  opcode(STCY_ZOPC, STC_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4505
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4506
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4507
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4508
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4509
instruct storeCM(memory mem, immI_0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4510
  match(Set mem (StoreCM mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4511
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4512
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4513
  format %{ "STC(Y)  $src,$mem\t # CMS card-mark byte (must be 0!)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4514
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4515
    guarantee($mem$$index$$Register != Z_R0, "content will not be used.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4516
    if ($mem$$index$$Register != noreg) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4517
      // Can't use clear_mem --> load const zero and store character.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4518
      __ load_const_optimized(Z_R0_scratch, (long)0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4519
      if (Immediate::is_uimm12($mem$$disp)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4520
        __ z_stc(Z_R0_scratch, $mem$$Address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4521
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4522
        __ z_stcy(Z_R0_scratch, $mem$$Address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4523
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4524
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4525
      __ clear_mem(Address($mem$$Address), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4526
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4527
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4528
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4529
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4530
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4531
// CHAR/SHORT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4532
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4533
// Store Char/Short
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4534
instruct storeC(memory mem, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4535
  match(Set mem (StoreC mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4536
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4537
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4538
  format %{ "STH(Y)  $src,$mem\t # short" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4539
  opcode(STHY_ZOPC, STH_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4540
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4541
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4542
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4543
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4544
// INT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4545
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4546
// Store Integer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4547
instruct storeI(memory mem, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4548
  match(Set mem (StoreI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4549
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4550
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4551
  format %{ "ST(Y)   $src,$mem\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4552
  opcode(STY_ZOPC, ST_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4553
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4554
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4555
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4556
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4557
// LONG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4558
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4559
// Store Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4560
instruct storeL(memory mem, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4561
  match(Set mem (StoreL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4562
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4563
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4564
  format %{ "STG     $src,$mem\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4565
  opcode(STG_ZOPC, STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4566
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4567
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4568
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4569
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4570
// PTR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4571
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4572
// Store Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4573
instruct storeP(memory dst, memoryRegP src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4574
  match(Set dst (StoreP dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4575
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4576
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4577
  format %{ "STG     $src,$dst\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4578
  opcode(STG_ZOPC, STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4579
  ins_encode(z_form_rt_mem_opt(src, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4580
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4581
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4582
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4583
// FLOAT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4584
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4585
// Store Float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4586
instruct storeF(memory mem, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4587
  match(Set mem (StoreF mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4588
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4589
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4590
  format %{ "STE(Y)   $src,$mem\t # float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4591
  opcode(STEY_ZOPC, STE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4592
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4593
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4594
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4595
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4596
// DOUBLE
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4597
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4598
// Store Double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4599
instruct storeD(memory mem, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4600
  match(Set mem (StoreD mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4601
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4602
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4603
  format %{ "STD(Y)   $src,$mem\t # double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4604
  opcode(STDY_ZOPC, STD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4605
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4606
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4607
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4608
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4609
// Prefetch instructions. Must be safe to execute with invalid address (cannot fault).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4610
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4611
// Should support match rule for PrefetchAllocation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4612
// Still needed after 8068977 for PrefetchAllocate.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4613
instruct prefetchAlloc(memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4614
  match(PrefetchAllocation mem);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4615
  predicate(VM_Version::has_Prefetch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4616
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4617
  format %{ "PREFETCH 2, $mem\t # Prefetch allocation, z10 only" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4618
  ins_encode %{ __ z_pfd(0x02, $mem$$Address); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4619
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4620
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4621
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4622
//----------Memory init instructions------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4623
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4624
// Move Immediate to 1-byte memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4625
instruct memInitB(memoryRSY mem, immI8 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4626
  match(Set mem (StoreB mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4627
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4628
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4629
  format %{ "MVI     $mem,$src\t # direct mem init 1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4630
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4631
    if (Immediate::is_uimm12((long)$mem$$disp)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4632
      __ z_mvi($mem$$Address, $src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4633
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4634
      __ z_mviy($mem$$Address, $src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4635
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4636
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4637
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4638
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4639
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4640
// Move Immediate to 2-byte memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4641
instruct memInitC(memoryRS mem, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4642
  match(Set mem (StoreC mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4643
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4644
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4645
  format %{ "MVHHI   $mem,$src\t # direct mem init 2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4646
  opcode(MVHHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4647
  ins_encode(z_silform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4648
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4649
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4650
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4651
// Move Immediate to 4-byte memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4652
instruct memInitI(memoryRS mem, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4653
  match(Set mem (StoreI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4654
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4655
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4656
  format %{ "MVHI    $mem,$src\t # direct mem init 4" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4657
  opcode(MVHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4658
  ins_encode(z_silform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4659
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4660
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4661
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4662
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4663
// Move Immediate to 8-byte memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4664
instruct memInitL(memoryRS mem, immL16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4665
  match(Set mem (StoreL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4666
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4667
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4668
  format %{ "MVGHI   $mem,$src\t # direct mem init 8" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4669
  opcode(MVGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4670
  ins_encode(z_silform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4671
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4672
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4673
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4674
// Move Immediate to 8-byte memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4675
instruct memInitP(memoryRS mem, immP16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4676
  match(Set mem (StoreP mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4677
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4678
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4679
  format %{ "MVGHI   $mem,$src\t # direct mem init 8" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4680
  opcode(MVGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4681
  ins_encode(z_silform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4682
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4683
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4684
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4685
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4686
//----------Instructions for compressed pointers (cOop and NKlass)-------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4687
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4688
// See cOop encoding classes for elaborate comment.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4689
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4690
// Moved here because it is needed in expand rules for encode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4691
// Long negation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4692
instruct negL_reg_reg(iRegL dst, immL_0 zero, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4693
  match(Set dst (SubL zero src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4694
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4695
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4696
  format %{ "NEG     $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4697
  ins_encode %{ __ z_lcgr($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4698
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4699
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4700
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4701
// Load Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4702
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4703
// Load narrow oop
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4704
instruct loadN(iRegN dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4705
  match(Set dst (LoadN mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4706
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4707
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4708
  format %{ "LoadN  $dst,$mem\t# (cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4709
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4710
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4711
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4712
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4713
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4714
// Load narrow Klass Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4715
instruct loadNKlass(iRegN dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4716
  match(Set dst (LoadNKlass mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4717
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4718
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4719
  format %{ "LoadNKlass $dst,$mem\t# (klass cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4720
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4721
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4722
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4723
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4724
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4725
// Load constant Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4726
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4727
instruct loadConN(iRegN dst, immN src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4728
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4729
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4730
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4731
  format %{ "loadConN    $dst,$src\t # (cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4732
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4733
    AddressLiteral cOop = __ constant_oop_address((jobject)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4734
    __ relocate(cOop.rspec(), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4735
    __ load_narrow_oop($dst$$Register, (narrowOop)cOop.value());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4736
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4737
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4738
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4739
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4740
instruct loadConN0(iRegN dst, immN0 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4741
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4742
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4743
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4744
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4745
  format %{ "loadConN    $dst,$src\t # (cOop) XGR because ZERO is loaded" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4746
  opcode(XGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4747
  ins_encode(z_rreform(dst, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4748
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4749
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4750
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4751
instruct loadConNKlass(iRegN dst, immNKlass src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4752
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4753
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4754
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4755
  format %{ "loadConNKlass $dst,$src\t # (cKlass)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4756
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4757
    AddressLiteral NKlass = __ constant_metadata_address((Metadata*)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4758
    __ relocate(NKlass.rspec(), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4759
    __ load_narrow_klass($dst$$Register, (Klass*)NKlass.value());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4760
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4761
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4762
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4763
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4764
// Load and Decode Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4765
// optimized variants for Unscaled cOops
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4766
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4767
instruct decodeLoadN(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4768
  match(Set dst (DecodeN (LoadN mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4769
  predicate(false && (Universe::narrow_oop_base()==NULL)&&(Universe::narrow_oop_shift()==0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4770
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4771
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4772
  format %{ "DecodeLoadN  $dst,$mem\t# (cOop Load+Decode)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4773
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4774
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4775
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4776
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4777
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4778
instruct decodeLoadNKlass(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4779
  match(Set dst (DecodeNKlass (LoadNKlass mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4780
  predicate(false && (Universe::narrow_klass_base()==NULL)&&(Universe::narrow_klass_shift()==0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4781
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4782
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4783
  format %{ "DecodeLoadNKlass  $dst,$mem\t# (load/decode NKlass)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4784
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4785
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4786
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4787
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4788
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4789
instruct decodeLoadConNKlass(iRegP dst, immNKlass src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4790
  match(Set dst (DecodeNKlass src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4791
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4792
  size(12);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4793
  format %{ "DecodeLoadConNKlass  $dst,$src\t # decode(cKlass)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4794
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4795
    AddressLiteral NKlass = __ constant_metadata_address((Metadata*)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4796
    __ relocate(NKlass.rspec(), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4797
    __ load_const($dst$$Register, (Klass*)NKlass.value());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4798
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4799
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4800
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4801
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4802
// Decode Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4803
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4804
// General decoder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4805
instruct decodeN(iRegP dst, iRegN src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4806
  match(Set dst (DecodeN src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4807
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4808
  predicate(Universe::narrow_oop_base() == NULL || !ExpandLoadingBaseDecode);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4809
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4810
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4811
  format %{ "decodeN  $dst,$src\t# (decode cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4812
  ins_encode %{  __ oop_decoder($dst$$Register, $src$$Register, true); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4813
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4814
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4815
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4816
// General Klass decoder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4817
instruct decodeKlass(iRegP dst, iRegN src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4818
  match(Set dst (DecodeNKlass src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4819
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4820
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4821
  format %{ "decode_klass $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4822
  ins_encode %{ __ decode_klass_not_null($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4823
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4824
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4825
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4826
// General decoder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4827
instruct decodeN_NN(iRegP dst, iRegN src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4828
  match(Set dst (DecodeN src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4829
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4830
  predicate((n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4831
             n->bottom_type()->is_oopptr()->ptr() == TypePtr::Constant) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4832
            (Universe::narrow_oop_base()== NULL || !ExpandLoadingBaseDecode_NN));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4833
  ins_cost(MEMORY_REF_COST+2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4834
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4835
  format %{ "decodeN  $dst,$src\t# (decode cOop NN)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4836
  ins_encode %{ __ oop_decoder($dst$$Register, $src$$Register, false); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4837
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4838
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4839
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4840
  instruct loadBase(iRegL dst, immL baseImm) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4841
    effect(DEF dst, USE baseImm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4842
    predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4843
    format %{ "llihl    $dst=$baseImm \t// load heap base" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4844
    ins_encode %{ __ get_oop_base($dst$$Register, $baseImm$$constant); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4845
    ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4846
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4847
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4848
  // Decoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4849
  instruct decodeN_base(iRegP dst, iRegN src, iRegL base, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4850
    match(Set dst (DecodeN src base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4851
    // Note: Effect TEMP dst was used with the intention to get
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4852
    // different regs for dst and base, but this has caused ADLC to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4853
    // generate wrong code. Oop_decoder generates additional lgr when
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4854
    // dst==base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4855
    effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4856
    predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4857
    // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4858
    format %{ "decodeN  $dst = ($src == 0) ? NULL : ($src << 3) + $base + pow2_offset\t# (decode cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4859
    ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4860
      __ oop_decoder($dst$$Register, $src$$Register, true, $base$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4861
                     (jlong)MacroAssembler::get_oop_base_pow2_offset((uint64_t)(intptr_t)Universe::narrow_oop_base()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4862
    %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4863
    ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4864
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4865
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4866
  // Decoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4867
  instruct decodeN_NN_base(iRegP dst, iRegN src, iRegL base, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4868
    match(Set dst (DecodeN src base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4869
    effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4870
    predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4871
    // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4872
    format %{ "decodeN  $dst = ($src << 3) + $base + pow2_offset\t# (decode cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4873
    ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4874
      __ oop_decoder($dst$$Register, $src$$Register, false, $base$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4875
                     (jlong)MacroAssembler::get_oop_base_pow2_offset((uint64_t)(intptr_t)Universe::narrow_oop_base()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4876
    %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4877
    ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4878
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4879
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4880
// Decoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4881
instruct decodeN_Ex(iRegP dst, iRegN src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4882
  match(Set dst (DecodeN src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4883
  predicate(Universe::narrow_oop_base() != NULL && ExpandLoadingBaseDecode);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4884
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4885
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4886
  expand %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4887
    immL baseImm %{ (jlong)(intptr_t)Universe::narrow_oop_base() %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4888
    iRegL base;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4889
    loadBase(base, baseImm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4890
    decodeN_base(dst, src, base, cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4891
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4892
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4893
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4894
// Decoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4895
instruct decodeN_NN_Ex(iRegP dst, iRegN src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4896
  match(Set dst (DecodeN src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4897
  predicate((n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4898
             n->bottom_type()->is_oopptr()->ptr() == TypePtr::Constant) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4899
            Universe::narrow_oop_base() != NULL && ExpandLoadingBaseDecode_NN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4900
  ins_cost(MEMORY_REF_COST+2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4901
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4902
  expand %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4903
    immL baseImm %{ (jlong)(intptr_t)Universe::narrow_oop_base() %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4904
    iRegL base;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4905
    loadBase(base, baseImm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4906
    decodeN_NN_base(dst, src, base, cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4907
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4908
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4909
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4910
//  Encode Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4911
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4912
// General encoder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4913
instruct encodeP(iRegN dst, iRegP src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4914
  match(Set dst (EncodeP src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4915
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4916
  predicate((n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4917
            (Universe::narrow_oop_base() == 0 ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4918
             Universe::narrow_oop_base_disjoint() ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4919
             !ExpandLoadingBaseEncode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4920
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4921
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4922
  format %{ "encodeP  $dst,$src\t# (encode cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4923
  ins_encode %{ __ oop_encoder($dst$$Register, $src$$Register, true, Z_R1_scratch, -1, all_outs_are_Stores(this)); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4924
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4925
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4926
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4927
// General class encoder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4928
instruct encodeKlass(iRegN dst, iRegP src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4929
  match(Set dst (EncodePKlass src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4930
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4931
  format %{ "encode_klass $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4932
  ins_encode %{ __ encode_klass_not_null($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4933
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4934
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4935
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4936
instruct encodeP_NN(iRegN dst, iRegP src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4937
  match(Set dst (EncodeP src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4938
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4939
  predicate((n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4940
            (Universe::narrow_oop_base() == 0 ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4941
             Universe::narrow_oop_base_disjoint() ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4942
             !ExpandLoadingBaseEncode_NN));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4943
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4944
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4945
  format %{ "encodeP  $dst,$src\t# (encode cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4946
  ins_encode %{ __ oop_encoder($dst$$Register, $src$$Register, false, Z_R1_scratch, -1, all_outs_are_Stores(this)); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4947
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4948
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4949
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4950
  // Encoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4951
  instruct encodeP_base(iRegN dst, iRegP src, iRegL base) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4952
    match(Set dst (EncodeP src (Binary base dst)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4953
    effect(TEMP_DEF dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4954
    predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4955
    ins_cost(MEMORY_REF_COST+2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4956
    // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4957
    format %{ "encodeP  $dst = ($src>>3) +$base + pow2_offset\t# (encode cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4958
    ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4959
      jlong offset = -(jlong)MacroAssembler::get_oop_base_pow2_offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4960
        (((uint64_t)(intptr_t)Universe::narrow_oop_base()) >> Universe::narrow_oop_shift());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4961
      __ oop_encoder($dst$$Register, $src$$Register, true, $base$$Register, offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4962
    %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4963
    ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4964
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4965
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4966
  // Encoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4967
  instruct encodeP_NN_base(iRegN dst, iRegP src, iRegL base, immL pow2_offset) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4968
    match(Set dst (EncodeP src base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4969
    effect(USE pow2_offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4970
    predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4971
    ins_cost(MEMORY_REF_COST+2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4972
    // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4973
    format %{ "encodeP  $dst = ($src>>3) +$base + $pow2_offset\t# (encode cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4974
    ins_encode %{ __ oop_encoder($dst$$Register, $src$$Register, false, $base$$Register, $pow2_offset$$constant); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4975
    ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4976
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4977
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4978
// Encoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4979
instruct encodeP_Ex(iRegN dst, iRegP src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4980
  match(Set dst (EncodeP src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4981
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4982
  predicate((n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4983
            (Universe::narrow_oop_base_overlaps() && ExpandLoadingBaseEncode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4984
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4985
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4986
  expand %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4987
    immL baseImm %{ ((jlong)(intptr_t)Universe::narrow_oop_base()) >> Universe::narrow_oop_shift() %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4988
    immL_0 zero %{ (0) %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4989
    flagsReg ccr;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4990
    iRegL base;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4991
    iRegL negBase;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4992
    loadBase(base, baseImm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4993
    negL_reg_reg(negBase, zero, base, ccr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4994
    encodeP_base(dst, src, negBase);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4995
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4996
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4997
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4998
// Encoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4999
instruct encodeP_NN_Ex(iRegN dst, iRegP src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5000
  match(Set dst (EncodeP src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5001
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5002
  predicate((n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5003
            (Universe::narrow_oop_base_overlaps() && ExpandLoadingBaseEncode_NN));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5004
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5005
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5006
  expand %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5007
    immL baseImm %{ (jlong)(intptr_t)Universe::narrow_oop_base() %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5008
    immL pow2_offset %{ -(jlong)MacroAssembler::get_oop_base_pow2_offset(((uint64_t)(intptr_t)Universe::narrow_oop_base())) %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5009
    immL_0 zero %{ 0 %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5010
    flagsReg ccr;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5011
    iRegL base;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5012
    iRegL negBase;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5013
    loadBase(base, baseImm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5014
    negL_reg_reg(negBase, zero, base, ccr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5015
    encodeP_NN_base(dst, src, negBase, pow2_offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5016
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5017
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5018
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5019
//  Store Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5020
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5021
// Store Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5022
instruct storeN(memory mem, iRegN_P2N src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5023
  match(Set mem (StoreN mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5024
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5025
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5026
  format %{ "ST      $src,$mem\t# (cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5027
  opcode(STY_ZOPC, ST_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5028
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5029
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5030
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5031
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5032
// Store Compressed Klass pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5033
instruct storeNKlass(memory mem, iRegN src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5034
  match(Set mem (StoreNKlass mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5035
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5036
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5037
  format %{ "ST      $src,$mem\t# (cKlass)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5038
  opcode(STY_ZOPC, ST_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5039
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5040
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5041
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5042
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5043
// Compare Compressed Pointers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5044
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5045
instruct compN_iRegN(iRegN_P2N src1, iRegN_P2N src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5046
  match(Set cr (CmpN src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5047
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5048
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5049
  format %{ "CLR     $src1,$src2\t# (cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5050
  opcode(CLR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5051
  ins_encode(z_rrform(src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5052
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5053
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5054
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5055
instruct compN_iRegN_immN(iRegN_P2N src1, immN src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5056
  match(Set cr (CmpN src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5057
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5058
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5059
  format %{ "CLFI    $src1,$src2\t# (cOop) compare immediate narrow" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5060
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5061
    AddressLiteral cOop = __ constant_oop_address((jobject)$src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5062
    __ relocate(cOop.rspec(), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5063
    __ compare_immediate_narrow_oop($src1$$Register, (narrowOop)cOop.value());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5064
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5065
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5066
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5067
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5068
instruct compNKlass_iRegN_immN(iRegN src1, immNKlass src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5069
  match(Set cr (CmpN src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5070
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5071
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5072
  format %{ "CLFI    $src1,$src2\t# (NKlass) compare immediate narrow" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5073
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5074
    AddressLiteral NKlass = __ constant_metadata_address((Metadata*)$src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5075
    __ relocate(NKlass.rspec(), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5076
    __ compare_immediate_narrow_klass($src1$$Register, (Klass*)NKlass.value());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5077
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5078
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5079
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5080
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5081
instruct compN_iRegN_immN0(iRegN_P2N src1, immN0 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5082
  match(Set cr (CmpN src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5083
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5084
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5085
  format %{ "LTR     $src1,$src2\t# (cOop) LTR because comparing against zero" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5086
  opcode(LTR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5087
  ins_encode(z_rrform(src1, src1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5088
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5089
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5090
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5091
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5092
//----------MemBar Instructions-----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5093
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5094
// Memory barrier flavors
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5095
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5096
instruct membar_acquire() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5097
  match(MemBarAcquire);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5098
  match(LoadFence);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5099
  ins_cost(4*MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5100
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5101
  format %{ "MEMBAR-acquire" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5102
  ins_encode %{ __ z_acquire(); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5103
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5104
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5105
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5106
instruct membar_acquire_lock() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5107
  match(MemBarAcquireLock);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5108
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5109
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5110
  format %{ "MEMBAR-acquire (CAS in prior FastLock so empty encoding)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5111
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5112
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5113
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5114
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5115
instruct membar_release() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5116
  match(MemBarRelease);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5117
  match(StoreFence);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5118
  ins_cost(4 * MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5119
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5120
  format %{ "MEMBAR-release" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5121
  ins_encode %{ __ z_release(); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5122
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5123
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5124
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5125
instruct membar_release_lock() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5126
  match(MemBarReleaseLock);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5127
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5128
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5129
  format %{ "MEMBAR-release (CAS in succeeding FastUnlock so empty encoding)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5130
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5131
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5132
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5133
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5134
instruct membar_volatile() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5135
  match(MemBarVolatile);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5136
  ins_cost(4 * MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5137
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5138
  format %{ "MEMBAR-volatile" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5139
  ins_encode %{ __ z_fence(); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5140
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5141
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5142
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5143
instruct unnecessary_membar_volatile() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5144
  match(MemBarVolatile);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5145
  predicate(Matcher::post_store_load_barrier(n));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5146
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5147
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5148
  format %{ "# MEMBAR-volatile (empty)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5149
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5150
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5151
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5152
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5153
instruct membar_CPUOrder() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5154
  match(MemBarCPUOrder);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5155
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5156
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5157
  format %{ "MEMBAR-CPUOrder (empty)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5158
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5159
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5160
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5161
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5162
instruct membar_storestore() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5163
  match(MemBarStoreStore);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5164
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5165
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5166
  format %{ "MEMBAR-storestore (empty)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5167
  ins_encode();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5168
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5169
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5170
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5171
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5172
//----------Register Move Instructions-----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5173
instruct roundDouble_nop(regD dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5174
  match(Set dst (RoundDouble dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5175
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5176
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5177
  // z/Architecture results are already "rounded" (i.e., normal-format IEEE).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5178
  ins_encode();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5179
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5180
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5181
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5182
instruct roundFloat_nop(regF dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5183
  match(Set dst (RoundFloat dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5184
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5185
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5186
  // z/Architecture results are already "rounded" (i.e., normal-format IEEE).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5187
  ins_encode();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5188
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5189
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5190
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5191
// Cast Long to Pointer for unsafe natives.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5192
instruct castX2P(iRegP dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5193
  match(Set dst (CastX2P src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5194
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5195
  format %{ "LGR     $dst,$src\t # CastX2P" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5196
  ins_encode %{ __ lgr_if_needed($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5197
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5198
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5199
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5200
// Cast Pointer to Long for unsafe natives.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5201
instruct castP2X(iRegL dst, iRegP_N2P src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5202
  match(Set dst (CastP2X src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5203
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5204
  format %{ "LGR     $dst,$src\t # CastP2X" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5205
  ins_encode %{ __ lgr_if_needed($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5206
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5207
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5208
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5209
instruct stfSSD(stackSlotD stkSlot, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5210
  // %%%% TODO: Tell the coalescer that this kind of node is a copy!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5211
  match(Set stkSlot src);   // chain rule
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5212
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5213
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5214
  format %{ " STD   $src,$stkSlot\t # stk" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5215
  opcode(STD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5216
  ins_encode(z_form_rt_mem(src, stkSlot));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5217
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5218
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5219
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5220
instruct stfSSF(stackSlotF stkSlot, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5221
  // %%%% TODO: Tell the coalescer that this kind of node is a copy!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5222
  match(Set stkSlot src);   // chain rule
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5223
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5224
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5225
  format %{ "STE   $src,$stkSlot\t # stk" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5226
  opcode(STE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5227
  ins_encode(z_form_rt_mem(src, stkSlot));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5228
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5229
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5230
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5231
//----------Conditional Move---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5232
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5233
instruct cmovN_reg(cmpOp cmp, flagsReg cr, iRegN dst, iRegN_P2N src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5234
  match(Set dst (CMoveN (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5235
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5236
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5237
  format %{ "CMoveN,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5238
  ins_encode(z_enc_cmov_reg(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5239
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5240
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5241
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5242
instruct cmovN_imm(cmpOp cmp, flagsReg cr, iRegN dst, immN0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5243
  match(Set dst (CMoveN (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5244
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5245
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5246
  format %{ "CMoveN,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5247
  ins_encode(z_enc_cmov_imm(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5248
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5249
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5250
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5251
instruct cmovI_reg(cmpOp cmp, flagsReg cr, iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5252
  match(Set dst (CMoveI (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5253
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5254
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5255
  format %{ "CMoveI,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5256
  ins_encode(z_enc_cmov_reg(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5257
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5258
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5259
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5260
instruct cmovI_imm(cmpOp cmp, flagsReg cr, iRegI dst, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5261
  match(Set dst (CMoveI (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5262
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5263
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5264
  format %{ "CMoveI,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5265
  ins_encode(z_enc_cmov_imm(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5266
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5267
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5268
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5269
instruct cmovP_reg(cmpOp cmp, flagsReg cr, iRegP dst, iRegP_N2P src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5270
  match(Set dst (CMoveP (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5271
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5272
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5273
  format %{ "CMoveP,$cmp    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5274
  ins_encode(z_enc_cmov_reg(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5275
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5276
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5277
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5278
instruct cmovP_imm(cmpOp cmp, flagsReg cr, iRegP dst, immP0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5279
  match(Set dst (CMoveP (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5280
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5281
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5282
  format %{ "CMoveP,$cmp  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5283
  ins_encode(z_enc_cmov_imm(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5284
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5285
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5286
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5287
instruct cmovF_reg(cmpOpF cmp, flagsReg cr, regF dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5288
  match(Set dst (CMoveF (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5289
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5290
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5291
  format %{ "CMoveF,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5292
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5293
    // Don't emit code if operands are identical (same register).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5294
    if ($dst$$FloatRegister != $src$$FloatRegister) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5295
      Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5296
      __ z_brc(Assembler::inverse_float_condition((Assembler::branch_condition)$cmp$$cmpcode), done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5297
      __ z_ler($dst$$FloatRegister, $src$$FloatRegister);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5298
      __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5299
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5300
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5301
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5302
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5303
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5304
instruct cmovD_reg(cmpOpF cmp, flagsReg cr, regD dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5305
  match(Set dst (CMoveD (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5306
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5307
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5308
  format %{ "CMoveD,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5309
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5310
    // Don't emit code if operands are identical (same register).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5311
    if ($dst$$FloatRegister != $src$$FloatRegister) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5312
      Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5313
      __ z_brc(Assembler::inverse_float_condition((Assembler::branch_condition)$cmp$$cmpcode), done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5314
      __ z_ldr($dst$$FloatRegister, $src$$FloatRegister);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5315
      __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5316
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5317
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5318
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5319
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5320
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5321
instruct cmovL_reg(cmpOp cmp, flagsReg cr, iRegL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5322
  match(Set dst (CMoveL (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5323
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5324
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5325
  format %{ "CMoveL,$cmp  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5326
  ins_encode(z_enc_cmov_reg(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5327
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5328
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5329
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5330
instruct cmovL_imm(cmpOp cmp, flagsReg cr, iRegL dst, immL16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5331
  match(Set dst (CMoveL (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5332
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5333
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5334
  format %{ "CMoveL,$cmp  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5335
  ins_encode(z_enc_cmov_imm(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5336
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5337
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5338
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5339
//----------OS and Locking Instructions----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5340
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5341
// This name is KNOWN by the ADLC and cannot be changed.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5342
// The ADLC forces a 'TypeRawPtr::BOTTOM' output type
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5343
// for this guy.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5344
instruct tlsLoadP(threadRegP dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5345
  match(Set dst (ThreadLocal));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5346
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5347
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5348
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5349
  format %{ "# $dst=ThreadLocal" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5350
  ins_encode(/* empty */);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5351
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5352
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5353
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5354
instruct checkCastPP(iRegP dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5355
  match(Set dst (CheckCastPP dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5356
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5357
  format %{ "# checkcastPP of $dst" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5358
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5359
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5360
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5361
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5362
instruct castPP(iRegP dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5363
  match(Set dst (CastPP dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5364
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5365
  format %{ "# castPP of $dst" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5366
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5367
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5368
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5369
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5370
instruct castII(iRegI dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5371
  match(Set dst (CastII dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5372
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5373
  format %{ "# castII of $dst" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5374
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5375
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5376
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5377
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5378
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5379
//----------Conditional_store--------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5380
// Conditional-store of the updated heap-top.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5381
// Used during allocation of the shared heap.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5382
// Sets flags (EQ) on success.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5383
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5384
// Implement LoadPLocked. Must be ordered against changes of the memory location
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5385
// by storePConditional.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5386
// Don't know whether this is ever used.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5387
instruct loadPLocked(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5388
  match(Set dst (LoadPLocked mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5389
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5390
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5391
  format %{ "LG      $dst,$mem\t # LoadPLocked" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5392
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5393
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5394
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5395
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5396
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5397
// As compareAndSwapP, but return flag register instead of boolean value in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5398
// int register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5399
// This instruction is matched if UseTLAB is off. Needed to pass
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5400
// option tests.  Mem_ptr must be a memory operand, else this node
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5401
// does not get Flag_needs_anti_dependence_check set by adlc. If this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5402
// is not set this node can be rematerialized which leads to errors.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5403
instruct storePConditional(indirect mem_ptr, rarg5RegP oldval, iRegP_N2P newval, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5404
  match(Set cr (StorePConditional mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5405
  effect(KILL oldval);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5406
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5407
  format %{ "storePConditional $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5408
  ins_encode(z_enc_casL(oldval, newval, mem_ptr));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5409
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5410
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5411
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5412
// As compareAndSwapL, but return flag register instead of boolean value in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5413
// int register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5414
// Used by sun/misc/AtomicLongCSImpl.java. Mem_ptr must be a memory
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5415
// operand, else this node does not get
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5416
// Flag_needs_anti_dependence_check set by adlc. If this is not set
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5417
// this node can be rematerialized which leads to errors.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5418
instruct storeLConditional(indirect mem_ptr, rarg5RegL oldval, iRegL newval, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5419
  match(Set cr (StoreLConditional mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5420
  effect(KILL oldval);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5421
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5422
  format %{ "storePConditional $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5423
  ins_encode(z_enc_casL(oldval, newval, mem_ptr));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5424
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5425
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5426
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5427
// No flag versions for CompareAndSwap{P,I,L,N} because matcher can't match them.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5428
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5429
instruct compareAndSwapI_bool(iRegP mem_ptr, rarg5RegI oldval, iRegI newval, iRegI res, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5430
  match(Set res (CompareAndSwapI mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5431
  effect(USE mem_ptr, USE_KILL oldval, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5432
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5433
  format %{ "$res = CompareAndSwapI $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5434
  ins_encode(z_enc_casI(oldval, newval, mem_ptr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5435
             z_enc_cctobool(res));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5436
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5437
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5438
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5439
instruct compareAndSwapL_bool(iRegP mem_ptr, rarg5RegL oldval, iRegL newval, iRegI res, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5440
  match(Set res (CompareAndSwapL mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5441
  effect(USE mem_ptr, USE_KILL oldval, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5442
  size(18);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5443
  format %{ "$res = CompareAndSwapL $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5444
  ins_encode(z_enc_casL(oldval, newval, mem_ptr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5445
             z_enc_cctobool(res));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5446
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5447
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5448
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5449
instruct compareAndSwapP_bool(iRegP mem_ptr, rarg5RegP oldval, iRegP_N2P newval, iRegI res, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5450
  match(Set res (CompareAndSwapP mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5451
  effect(USE mem_ptr, USE_KILL oldval, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5452
  size(18);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5453
  format %{ "$res = CompareAndSwapP $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5454
  ins_encode(z_enc_casL(oldval, newval, mem_ptr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5455
             z_enc_cctobool(res));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5456
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5457
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5458
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5459
instruct compareAndSwapN_bool(iRegP mem_ptr, rarg5RegN oldval, iRegN_P2N newval, iRegI res, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5460
  match(Set res (CompareAndSwapN mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5461
  effect(USE mem_ptr, USE_KILL oldval, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5462
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5463
  format %{ "$res = CompareAndSwapN $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5464
  ins_encode(z_enc_casI(oldval, newval, mem_ptr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5465
             z_enc_cctobool(res));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5466
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5467
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5468
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5469
//----------Atomic operations on memory (GetAndSet*, GetAndAdd*)---------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5470
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5471
// Exploit: direct memory arithmetic
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5472
// Prereqs: - instructions available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5473
//          - instructions guarantee atomicity
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5474
//          - immediate operand to be added
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5475
//          - immediate operand is small enough (8-bit signed).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5476
//          - result of instruction is not used
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5477
instruct addI_mem_imm8_atomic_no_res(memoryRSY mem, Universe dummy, immI8 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5478
  match(Set dummy (GetAndAddI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5479
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5480
  predicate(VM_Version::has_AtomicMemWithImmALUOps() && n->as_LoadStore()->result_not_used());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5481
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5482
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5483
  format %{ "ASI     [$mem],$src\t # GetAndAddI (atomic)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5484
  opcode(ASI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5485
  ins_encode(z_siyform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5486
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5487
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5488
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5489
// Fallback: direct memory arithmetic not available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5490
// Disadvantages: - CS-Loop required, very expensive.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5491
//                - more code generated (26 to xx bytes vs. 6 bytes)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5492
instruct addI_mem_imm16_atomic(memoryRSY mem, iRegI dst, immI16 src, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5493
  match(Set dst (GetAndAddI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5494
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5495
  ins_cost(MEMORY_REF_COST+100*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5496
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5497
            "  LGF     $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5498
            "  AHIK    $tmp,$dst,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5499
            "  CSY     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5500
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5501
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5502
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5503
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5504
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5505
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5506
    int      Isrc = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5507
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5508
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5509
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5510
    __ z_lgf(Rdst, $mem$$Address);    // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5511
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5512
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5513
      if (VM_Version::has_DistinctOpnds()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5514
        __ z_ahik(Rtmp, Rdst, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5515
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5516
        __ z_lr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5517
        __ z_ahi(Rtmp, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5518
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5519
      // Swap into memory location.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5520
      __ z_csy(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5521
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5522
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5523
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5524
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5525
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5526
instruct addI_mem_imm32_atomic(memoryRSY mem, iRegI dst, immI src, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5527
  match(Set dst (GetAndAddI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5528
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5529
  ins_cost(MEMORY_REF_COST+200*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5530
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5531
            "  LGF     $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5532
            "  LGR     $tmp,$dst\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5533
            "  AFI     $tmp,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5534
            "  CSY     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5535
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5536
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5537
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5538
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5539
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5540
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5541
    int      Isrc = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5542
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5543
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5544
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5545
    __ z_lgf(Rdst, $mem$$Address);    // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5546
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5547
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5548
      __ z_lr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5549
      __ z_afi(Rtmp, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5550
      // Swap into memory location.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5551
      __ z_csy(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5552
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5553
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5554
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5555
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5556
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5557
instruct addI_mem_reg_atomic(memoryRSY mem, iRegI dst, iRegI src, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5558
  match(Set dst (GetAndAddI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5559
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5560
  ins_cost(MEMORY_REF_COST+100*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5561
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5562
            "  LGF     $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5563
            "  ARK     $tmp,$dst,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5564
            "  CSY     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5565
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5566
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5567
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5568
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5569
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5570
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5571
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5572
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5573
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5574
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5575
    __ z_lgf(Rdst, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5576
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5577
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5578
      if (VM_Version::has_DistinctOpnds()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5579
        __ z_ark(Rtmp, Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5580
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5581
        __ z_lr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5582
        __ z_ar(Rtmp, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5583
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5584
      __ z_csy(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5585
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5586
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5587
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5588
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5589
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5590
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5591
// Exploit: direct memory arithmetic
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5592
// Prereqs: - instructions available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5593
//          - instructions guarantee atomicity
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5594
//          - immediate operand to be added
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5595
//          - immediate operand is small enough (8-bit signed).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5596
//          - result of instruction is not used
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5597
instruct addL_mem_imm8_atomic_no_res(memoryRSY mem, Universe dummy, immL8 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5598
  match(Set dummy (GetAndAddL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5599
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5600
  predicate(VM_Version::has_AtomicMemWithImmALUOps() && n->as_LoadStore()->result_not_used());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5601
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5602
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5603
  format %{ "AGSI    [$mem],$src\t # GetAndAddL (atomic)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5604
  opcode(AGSI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5605
  ins_encode(z_siyform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5606
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5607
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5608
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5609
// Fallback: direct memory arithmetic not available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5610
// Disadvantages: - CS-Loop required, very expensive.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5611
//                - more code generated (26 to xx bytes vs. 6 bytes)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5612
instruct addL_mem_imm16_atomic(memoryRSY mem, iRegL dst, immL16 src, iRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5613
  match(Set dst (GetAndAddL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5614
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5615
  ins_cost(MEMORY_REF_COST+100*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5616
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5617
            "  LG      $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5618
            "  AGHIK   $tmp,$dst,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5619
            "  CSG     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5620
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5621
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5622
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5623
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5624
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5625
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5626
    int      Isrc = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5627
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5628
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5629
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5630
    __ z_lg(Rdst, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5631
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5632
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5633
      if (VM_Version::has_DistinctOpnds()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5634
        __ z_aghik(Rtmp, Rdst, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5635
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5636
        __ z_lgr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5637
        __ z_aghi(Rtmp, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5638
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5639
      __ z_csg(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5640
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5641
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5642
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5643
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5644
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5645
instruct addL_mem_imm32_atomic(memoryRSY mem, iRegL dst, immL32 src, iRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5646
  match(Set dst (GetAndAddL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5647
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5648
  ins_cost(MEMORY_REF_COST+100*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5649
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5650
            "  LG      $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5651
            "  LGR     $tmp,$dst\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5652
            "  AGFI    $tmp,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5653
            "  CSG     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5654
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5655
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5656
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5657
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5658
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5659
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5660
    int      Isrc = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5661
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5662
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5663
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5664
    __ z_lg(Rdst, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5665
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5666
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5667
      __ z_lgr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5668
      __ z_agfi(Rtmp, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5669
      __ z_csg(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5670
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5671
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5672
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5673
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5674
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5675
instruct addL_mem_reg_atomic(memoryRSY mem, iRegL dst, iRegL src, iRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5676
  match(Set dst (GetAndAddL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5677
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5678
  ins_cost(MEMORY_REF_COST+100*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5679
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5680
            "  LG      $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5681
            "  AGRK    $tmp,$dst,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5682
            "  CSG     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5683
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5684
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5685
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5686
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5687
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5688
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5689
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5690
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5691
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5692
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5693
    __ z_lg(Rdst, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5694
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5695
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5696
      if (VM_Version::has_DistinctOpnds()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5697
        __ z_agrk(Rtmp, Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5698
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5699
        __ z_lgr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5700
        __ z_agr(Rtmp, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5701
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5702
      __ z_csg(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5703
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5704
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5705
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5706
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5707
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5708
// Increment value in memory, save old value in dst.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5709
instruct addI_mem_reg_atomic_z196(memoryRSY mem, iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5710
  match(Set dst (GetAndAddI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5711
  predicate(VM_Version::has_LoadAndALUAtomicV1());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5712
  ins_cost(MEMORY_REF_COST + DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5713
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5714
  format %{ "LAA     $dst,$src,[$mem]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5715
  ins_encode %{ __ z_laa($dst$$Register, $src$$Register, $mem$$Address); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5716
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5717
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5718
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5719
// Increment value in memory, save old value in dst.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5720
instruct addL_mem_reg_atomic_z196(memoryRSY mem, iRegL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5721
  match(Set dst (GetAndAddL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5722
  predicate(VM_Version::has_LoadAndALUAtomicV1());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5723
  ins_cost(MEMORY_REF_COST + DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5724
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5725
  format %{ "LAAG    $dst,$src,[$mem]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5726
  ins_encode %{ __ z_laag($dst$$Register, $src$$Register, $mem$$Address); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5727
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5728
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5729
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5730
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5731
instruct xchgI_reg_mem(memoryRSY mem, iRegI dst, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5732
  match(Set dst (GetAndSetI mem dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5733
  effect(KILL cr, TEMP tmp); // USE_DEF dst by match rule.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5734
  format %{ "XCHGI   $dst,[$mem]\t # EXCHANGE (int, atomic), temp $tmp" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5735
  ins_encode(z_enc_SwapI(mem, dst, tmp));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5736
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5737
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5738
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5739
instruct xchgL_reg_mem(memoryRSY mem, iRegL dst, iRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5740
  match(Set dst (GetAndSetL mem dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5741
  effect(KILL cr, TEMP tmp); // USE_DEF dst by match rule.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5742
  format %{ "XCHGL   $dst,[$mem]\t # EXCHANGE (long, atomic), temp $tmp" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5743
  ins_encode(z_enc_SwapL(mem, dst, tmp));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5744
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5745
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5746
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5747
instruct xchgN_reg_mem(memoryRSY mem, iRegN dst, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5748
  match(Set dst (GetAndSetN mem dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5749
  effect(KILL cr, TEMP tmp); // USE_DEF dst by match rule.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5750
  format %{ "XCHGN   $dst,[$mem]\t # EXCHANGE (coop, atomic), temp $tmp" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5751
  ins_encode(z_enc_SwapI(mem, dst, tmp));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5752
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5753
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5754
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5755
instruct xchgP_reg_mem(memoryRSY mem, iRegP dst, iRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5756
  match(Set dst (GetAndSetP mem dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5757
  effect(KILL cr, TEMP tmp); // USE_DEF dst by match rule.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5758
  format %{ "XCHGP   $dst,[$mem]\t # EXCHANGE (oop, atomic), temp $tmp" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5759
  ins_encode(z_enc_SwapL(mem, dst, tmp));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5760
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5761
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5762
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5763
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5764
//----------Arithmetic Instructions--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5765
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5766
// The rules are sorted by right operand type and operand length. Please keep
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5767
// it that way.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5768
// Left operand type is always reg. Left operand len is I, L, P
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5769
// Right operand type is reg, imm, mem. Right operand len is S, I, L, P
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5770
// Special instruction formats, e.g. multi-operand, are inserted at the end.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5771
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5772
// ADD
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5773
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5774
// REG = REG + REG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5775
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5776
// Register Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5777
instruct addI_reg_reg_CISC(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5778
  match(Set dst (AddI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5779
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5780
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5781
  format %{ "AR      $dst,$src\t # int  CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5782
  opcode(AR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5783
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5784
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5785
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5786
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5787
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5788
instruct addI_reg_reg_RISC(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5789
  match(Set dst (AddI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5790
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5791
  predicate(VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5792
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5793
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5794
  format %{ "ARK     $dst,$src1,$src2\t # int  RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5795
  opcode(ARK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5796
  ins_encode(z_rrfform(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5797
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5798
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5799
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5800
// REG = REG + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5801
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5802
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5803
// Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5804
instruct addI_reg_imm16_CISC(iRegI dst, immI16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5805
  match(Set dst (AddI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5806
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5807
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5808
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5809
  format %{ "AHI     $dst,$con\t # int  CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5810
  opcode(AHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5811
  ins_encode(z_riform_signed(dst, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5812
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5813
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5814
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5815
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5816
// Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5817
instruct addI_reg_imm16_RISC(iRegI dst, iRegI src, immI16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5818
  match(Set dst (AddI src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5819
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5820
  predicate( VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5821
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5822
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5823
  format %{ "AHIK    $dst,$src,$con\t # int  RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5824
  opcode(AHIK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5825
  ins_encode(z_rieform_d(dst, src, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5826
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5827
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5828
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5829
// Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5830
instruct addI_reg_imm32(iRegI dst, immI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5831
  match(Set dst (AddI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5832
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5833
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5834
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5835
  format %{ "AFI     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5836
  opcode(AFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5837
  ins_encode(z_rilform_signed(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5838
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5839
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5840
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5841
// Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5842
instruct addI_reg_imm12(iRegI dst, iRegI src, uimmI12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5843
  match(Set dst (AddI src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5844
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5845
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5846
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5847
  format %{ "LA      $dst,$con(,$src)\t # int d12(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5848
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5849
  ins_encode(z_rxform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5850
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5851
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5852
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5853
// Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5854
instruct addI_reg_imm20(iRegI dst, iRegI src, immI20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5855
  match(Set dst (AddI src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5856
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5857
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5858
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5859
  format %{ "LAY     $dst,$con(,$src)\t # int d20(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5860
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5861
  ins_encode(z_rxyform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5862
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5863
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5864
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5865
instruct addI_reg_reg_imm12(iRegI dst, iRegI src1, iRegI src2, uimmI12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5866
  match(Set dst (AddI (AddI src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5867
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5868
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5869
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5870
  format %{ "LA      $dst,$con($src1,$src2)\t # int d12(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5871
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5872
  ins_encode(z_rxform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5873
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5874
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5875
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5876
instruct addI_reg_reg_imm20(iRegI dst, iRegI src1, iRegI src2, immI20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5877
  match(Set dst (AddI (AddI src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5878
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5879
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5880
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5881
  format %{ "LAY     $dst,$con($src1,$src2)\t # int d20(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5882
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5883
  ins_encode(z_rxyform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5884
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5885
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5886
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5887
// REG = REG + MEM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5888
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5889
instruct addI_Reg_mem(iRegI dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5890
  match(Set dst (AddI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5891
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5892
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5893
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5894
  format %{ "A(Y)    $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5895
  opcode(AY_ZOPC, A_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5896
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5897
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5898
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5899
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5900
// MEM = MEM + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5901
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5902
// Add Immediate to 4-byte memory operand and result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5903
instruct addI_mem_imm(memoryRSY mem, immI8 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5904
  match(Set mem (StoreI mem (AddI (LoadI mem) src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5905
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5906
  predicate(VM_Version::has_MemWithImmALUOps());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5907
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5908
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5909
  format %{ "ASI     $mem,$src\t # direct mem add 4" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5910
  opcode(ASI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5911
  ins_encode(z_siyform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5912
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5913
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5914
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5915
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5916
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5917
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5918
// REG = REG + REG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5919
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5920
instruct addL_reg_regI(iRegL dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5921
  match(Set dst (AddL dst (ConvI2L src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5922
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5923
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5924
  format %{ "AGFR    $dst,$src\t # long<-int CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5925
  opcode(AGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5926
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5927
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5928
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5929
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5930
instruct addL_reg_reg_CISC(iRegL dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5931
  match(Set dst (AddL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5932
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5933
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5934
  format %{ "AGR     $dst, $src\t # long CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5935
  opcode(AGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5936
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5937
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5938
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5939
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5940
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5941
instruct addL_reg_reg_RISC(iRegL dst, iRegL src1, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5942
  match(Set dst (AddL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5943
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5944
  predicate(VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5945
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5946
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5947
  format %{ "AGRK    $dst,$src1,$src2\t # long RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5948
  opcode(AGRK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5949
  ins_encode(z_rrfform(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5950
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5951
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5952
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5953
// REG = REG + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5954
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5955
instruct addL_reg_imm12(iRegL dst, iRegL src, uimmL12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5956
  match(Set dst (AddL src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5957
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5958
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5959
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5960
  format %{ "LA      $dst,$con(,$src)\t # long d12(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5961
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5962
  ins_encode(z_rxform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5963
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5964
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5965
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5966
instruct addL_reg_imm20(iRegL dst, iRegL src, immL20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5967
  match(Set dst (AddL src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5968
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5969
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5970
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5971
  format %{ "LAY     $dst,$con(,$src)\t # long d20(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5972
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5973
  ins_encode(z_rxyform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5974
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5975
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5976
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5977
instruct addL_reg_imm32(iRegL dst, immL32 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5978
  match(Set dst (AddL dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5979
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5980
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5981
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5982
  format %{ "AGFI    $dst,$con\t # long CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5983
  opcode(AGFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5984
  ins_encode(z_rilform_signed(dst, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5985
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5986
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5987
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5988
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5989
instruct addL_reg_imm16_CISC(iRegL dst, immL16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5990
  match(Set dst (AddL dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5991
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5992
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5993
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5994
  format %{ "AGHI    $dst,$con\t # long CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5995
  opcode(AGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5996
  ins_encode(z_riform_signed(dst, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5997
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5998
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5999
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6000
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6001
instruct addL_reg_imm16_RISC(iRegL dst, iRegL src, immL16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6002
  match(Set dst (AddL src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6003
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6004
  predicate( VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6005
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6006
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6007
  format %{ "AGHIK   $dst,$src,$con\t # long RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6008
  opcode(AGHIK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6009
  ins_encode(z_rieform_d(dst, src, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6010
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6011
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6012
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6013
// REG = REG + MEM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6014
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6015
instruct addL_Reg_memI(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6016
  match(Set dst (AddL dst (ConvI2L (LoadI src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6017
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6018
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6019
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6020
  format %{ "AGF     $dst, $src\t # long/int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6021
  opcode(AGF_ZOPC, AGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6022
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6023
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6024
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6025
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6026
instruct addL_Reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6027
  match(Set dst (AddL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6028
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6029
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6030
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6031
  format %{ "AG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6032
  opcode(AG_ZOPC, AG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6033
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6034
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6035
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6036
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6037
instruct addL_reg_reg_imm12(iRegL dst, iRegL src1, iRegL src2, uimmL12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6038
  match(Set dst (AddL (AddL src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6039
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6040
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6041
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6042
  format %{ "LA     $dst,$con($src1,$src2)\t # long d12(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6043
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6044
  ins_encode(z_rxform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6045
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6046
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6047
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6048
instruct addL_reg_reg_imm20(iRegL dst, iRegL src1, iRegL src2, immL20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6049
  match(Set dst (AddL (AddL src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6050
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6051
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6052
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6053
  format %{ "LAY    $dst,$con($src1,$src2)\t # long d20(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6054
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6055
  ins_encode(z_rxyform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6056
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6057
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6058
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6059
// MEM = MEM + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6060
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6061
// Add Immediate to 8-byte memory operand and result.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6062
instruct addL_mem_imm(memoryRSY mem, immL8 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6063
  match(Set mem (StoreL mem (AddL (LoadL mem) src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6064
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6065
  predicate(VM_Version::has_MemWithImmALUOps());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6066
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6067
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6068
  format %{ "AGSI    $mem,$src\t # direct mem add 8" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6069
  opcode(AGSI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6070
  ins_encode(z_siyform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6071
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6072
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6073
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6074
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6075
// REG = REG + REG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6076
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6077
// Ptr Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6078
instruct addP_reg_reg_LA(iRegP dst, iRegP_N2P src1, iRegL src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6079
  match(Set dst (AddP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6080
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6081
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6082
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6083
  format %{ "LA      $dst,#0($src1,$src2)\t # ptr 0(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6084
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6085
  ins_encode(z_rxform_imm_reg_reg(dst, 0x0, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6086
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6087
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6088
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6089
// Ptr Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6090
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6091
instruct addP_reg_reg_CISC(iRegP dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6092
  match(Set dst (AddP dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6093
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6094
  predicate(!PreferLAoverADD && !VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6095
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6096
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6097
  format %{ "ALGR    $dst,$src\t # ptr CICS ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6098
  opcode(ALGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6099
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6100
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6101
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6102
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6103
// Ptr Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6104
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6105
instruct addP_reg_reg_RISC(iRegP dst, iRegP_N2P src1, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6106
  match(Set dst (AddP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6107
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6108
  predicate(!PreferLAoverADD && VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6109
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6110
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6111
  format %{ "ALGRK   $dst,$src1,$src2\t # ptr RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6112
  opcode(ALGRK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6113
  ins_encode(z_rrfform(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6114
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6115
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6116
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6117
// REG = REG + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6118
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6119
instruct addP_reg_imm12(iRegP dst, iRegP_N2P src, uimmL12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6120
  match(Set dst (AddP src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6121
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6122
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6123
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6124
  format %{ "LA      $dst,$con(,$src)\t # ptr d12(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6125
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6126
  ins_encode(z_rxform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6127
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6128
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6129
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6130
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6131
instruct addP_reg_imm16_CISC(iRegP dst, immL16 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6132
  match(Set dst (AddP dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6133
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6134
  predicate(!PreferLAoverADD && !VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6135
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6136
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6137
  format %{ "AGHI    $dst,$src\t # ptr CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6138
  opcode(AGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6139
  ins_encode(z_riform_signed(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6140
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6141
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6142
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6143
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6144
instruct addP_reg_imm16_RISC(iRegP dst, iRegP_N2P src, immL16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6145
  match(Set dst (AddP src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6146
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6147
  predicate(!PreferLAoverADD && VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6148
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6149
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6150
  format %{ "ALGHSIK $dst,$src,$con\t # ptr RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6151
  opcode(ALGHSIK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6152
  ins_encode(z_rieform_d(dst, src, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6153
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6154
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6155
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6156
instruct addP_reg_imm20(iRegP dst, memoryRegP src, immL20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6157
  match(Set dst (AddP src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6158
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6159
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6160
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6161
  format %{ "LAY     $dst,$con(,$src)\t # ptr d20(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6162
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6163
  ins_encode(z_rxyform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6164
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6165
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6166
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6167
// Pointer Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6168
instruct addP_reg_imm32(iRegP dst, immL32 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6169
  match(Set dst (AddP dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6170
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6171
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6172
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6173
  format %{ "AGFI    $dst,$src\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6174
  opcode(AGFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6175
  ins_encode(z_rilform_signed(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6176
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6177
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6178
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6179
// REG = REG1 + REG2 + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6180
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6181
instruct addP_reg_reg_imm12(iRegP dst, memoryRegP src1, iRegL src2, uimmL12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6182
  match(Set dst (AddP (AddP src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6183
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6184
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6185
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6186
  format %{ "LA      $dst,$con($src1,$src2)\t # ptr d12(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6187
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6188
  ins_encode(z_rxform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6189
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6190
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6191
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6192
instruct addP_regN_reg_imm12(iRegP dst, iRegP_N2P src1, iRegL src2, uimmL12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6193
  match(Set dst (AddP (AddP src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6194
  predicate( PreferLAoverADD && Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6195
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6196
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6197
  format %{ "LA      $dst,$con($src1,$src2)\t # ptr d12(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6198
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6199
  ins_encode(z_rxform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6200
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6201
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6202
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6203
instruct addP_reg_reg_imm20(iRegP dst, memoryRegP src1, iRegL src2, immL20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6204
  match(Set dst (AddP (AddP src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6205
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6206
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6207
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6208
  format %{ "LAY     $dst,$con($src1,$src2)\t # ptr d20(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6209
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6210
  ins_encode(z_rxyform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6211
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6212
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6213
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6214
instruct addP_regN_reg_imm20(iRegP dst, iRegP_N2P src1, iRegL src2, immL20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6215
  match(Set dst (AddP (AddP src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6216
  predicate( PreferLAoverADD && Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6217
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6218
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6219
  format %{ "LAY     $dst,$con($src1,$src2)\t # ptr d20(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6220
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6221
  ins_encode(z_rxyform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6222
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6223
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6224
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6225
// MEM = MEM + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6226
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6227
// Add Immediate to 8-byte memory operand and result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6228
instruct addP_mem_imm(memoryRSY mem, immL8 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6229
  match(Set mem (StoreP mem (AddP (LoadP mem) src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6230
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6231
  predicate(VM_Version::has_MemWithImmALUOps());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6232
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6233
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6234
  format %{ "AGSI    $mem,$src\t # direct mem add 8 (ptr)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6235
  opcode(AGSI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6236
  ins_encode(z_siyform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6237
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6238
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6239
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6240
// SUB
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6241
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6242
// Register Subtraction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6243
instruct subI_reg_reg_CISC(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6244
  match(Set dst (SubI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6245
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6246
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6247
  format %{ "SR      $dst,$src\t # int  CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6248
  opcode(SR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6249
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6250
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6251
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6252
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6253
instruct subI_reg_reg_RISC(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6254
  match(Set dst (SubI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6255
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6256
  predicate(VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6257
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6258
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6259
  format %{ "SRK     $dst,$src1,$src2\t # int  RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6260
  opcode(SRK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6261
  ins_encode(z_rrfform(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6262
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6263
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6264
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6265
instruct subI_Reg_mem(iRegI dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6266
  match(Set dst (SubI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6267
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6268
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6269
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6270
  format %{ "S(Y)    $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6271
  opcode(SY_ZOPC, S_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6272
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6273
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6274
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6275
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6276
instruct subI_zero_reg(iRegI dst, immI_0 zero, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6277
  match(Set dst (SubI zero src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6278
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6279
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6280
  format %{ "NEG     $dst, $src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6281
  ins_encode %{ __ z_lcr($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6282
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6283
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6284
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6285
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6286
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6287
// Long subtraction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6288
instruct subL_reg_reg_CISC(iRegL dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6289
  match(Set dst (SubL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6290
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6291
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6292
  format %{ "SGR     $dst,$src\t # int  CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6293
  opcode(SGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6294
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6295
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6296
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6297
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6298
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6299
instruct subL_reg_reg_RISC(iRegL dst, iRegL src1, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6300
  match(Set dst (SubL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6301
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6302
  predicate(VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6303
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6304
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6305
  format %{ "SGRK    $dst,$src1,$src2\t # int  RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6306
  opcode(SGRK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6307
  ins_encode(z_rrfform(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6308
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6309
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6310
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6311
instruct subL_reg_regI_CISC(iRegL dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6312
  match(Set dst (SubL dst (ConvI2L src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6313
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6314
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6315
  format %{ "SGFR    $dst, $src\t # int  CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6316
  opcode(SGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6317
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6318
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6319
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6320
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6321
instruct subL_Reg_memI(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6322
  match(Set dst (SubL dst (ConvI2L (LoadI src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6323
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6324
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6325
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6326
  format %{ "SGF     $dst, $src\t # long/int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6327
  opcode(SGF_ZOPC, SGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6328
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6329
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6330
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6331
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6332
instruct subL_Reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6333
  match(Set dst (SubL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6334
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6335
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6336
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6337
  format %{ "SG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6338
  opcode(SG_ZOPC, SG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6339
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6340
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6341
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6342
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6343
// Moved declaration of negL_reg_reg before encode nodes, where it is used.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6344
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6345
//  MUL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6346
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6347
// Register Multiplication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6348
instruct mulI_reg_reg(iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6349
  match(Set dst (MulI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6350
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6351
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6352
  format %{ "MSR     $dst, $src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6353
  opcode(MSR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6354
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6355
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6356
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6357
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6358
// Immediate Multiplication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6359
instruct mulI_reg_imm16(iRegI dst, immI16 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6360
  match(Set dst (MulI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6361
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6362
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6363
  format %{ "MHI     $dst,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6364
  opcode(MHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6365
  ins_encode(z_riform_signed(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6366
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6367
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6368
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6369
// Immediate (32bit) Multiplication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6370
instruct mulI_reg_imm32(iRegI dst, immI con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6371
  match(Set dst (MulI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6372
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6373
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6374
  format %{ "MSFI    $dst,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6375
  opcode(MSFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6376
  ins_encode(z_rilform_signed(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6377
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6378
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6379
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6380
instruct mulI_Reg_mem(iRegI dst, memory src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6381
  match(Set dst (MulI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6382
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6383
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6384
  format %{ "MS(Y)   $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6385
  opcode(MSY_ZOPC, MS_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6386
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6387
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6388
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6389
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6390
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6391
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6392
instruct mulL_reg_regI(iRegL dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6393
  match(Set dst (MulL dst (ConvI2L src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6394
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6395
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6396
  format %{ "MSGFR   $dst $src\t # long/int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6397
  opcode(MSGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6398
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6399
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6400
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6401
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6402
instruct mulL_reg_reg(iRegL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6403
  match(Set dst (MulL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6404
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6405
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6406
  format %{ "MSGR    $dst $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6407
  opcode(MSGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6408
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6409
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6410
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6411
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6412
// Immediate Multiplication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6413
instruct mulL_reg_imm16(iRegL dst, immL16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6414
  match(Set dst (MulL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6415
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6416
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6417
  format %{ "MGHI    $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6418
  opcode(MGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6419
  ins_encode(z_riform_signed(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6420
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6421
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6422
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6423
// Immediate (32bit) Multiplication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6424
instruct mulL_reg_imm32(iRegL dst, immL32 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6425
  match(Set dst (MulL dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6426
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6427
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6428
  format %{ "MSGFI   $dst,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6429
  opcode(MSGFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6430
  ins_encode(z_rilform_signed(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6431
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6432
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6433
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6434
instruct mulL_Reg_memI(iRegL dst, memory src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6435
  match(Set dst (MulL dst (ConvI2L (LoadI src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6436
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6437
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6438
  format %{ "MSGF    $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6439
  opcode(MSGF_ZOPC, MSGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6440
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6441
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6442
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6443
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6444
instruct mulL_Reg_mem(iRegL dst, memory src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6445
  match(Set dst (MulL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6446
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6447
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6448
  format %{ "MSG     $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6449
  opcode(MSG_ZOPC, MSG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6450
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6451
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6452
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6453
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6454
//  DIV
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6455
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6456
// Integer DIVMOD with Register, both quotient and mod results
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6457
instruct divModI_reg_divmod(roddRegI dst1src1, revenRegI dst2, noOdd_iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6458
  match(DivModI dst1src1 src2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6459
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6460
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6461
  size(VM_Version::has_CompareBranch() ? 24 : 26);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6462
  format %{ "DIVMODI ($dst1src1, $dst2) $src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6463
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6464
    Register d1s1 = $dst1src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6465
    Register d2   = $dst2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6466
    Register s2   = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6467
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6468
    assert_different_registers(d1s1, s2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6469
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6470
    Label do_div, done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6471
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6472
      __ z_cij(s2, -1, Assembler::bcondNotEqual, do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6473
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6474
      __ z_chi(s2, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6475
      __ z_brne(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6476
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6477
    __ z_lcr(d1s1, d1s1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6478
    __ clear_reg(d2, false, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6479
    __ z_bru(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6480
    __ bind(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6481
    __ z_lgfr(d1s1, d1s1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6482
    __ z_dsgfr(d2, s2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6483
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6484
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6485
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6486
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6487
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6488
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6489
// Register Division
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6490
instruct divI_reg_reg(roddRegI dst, iRegI src1, noOdd_iRegI src2, revenRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6491
  match(Set dst (DivI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6492
  effect(KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6493
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6494
  size(VM_Version::has_CompareBranch() ? 20 : 22);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6495
  format %{ "DIV_checked $dst, $src1,$src2\t # treats special case 0x80../-1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6496
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6497
    Register a = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6498
    Register b = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6499
    Register t = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6500
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6501
    assert_different_registers(t, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6502
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6503
    Label do_div, done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6504
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6505
      __ z_cij(b, -1, Assembler::bcondNotEqual, do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6506
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6507
      __ z_chi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6508
      __ z_brne(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6509
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6510
    __ z_lcr(t, a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6511
    __ z_bru(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6512
    __ bind(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6513
    __ z_lgfr(t, a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6514
    __ z_dsgfr(t->predecessor()/* t is odd part of a register pair. */, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6515
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6516
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6517
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6518
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6519
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6520
// Immediate Division
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6521
instruct divI_reg_imm16(roddRegI dst, iRegI src1, immI16 src2, revenRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6522
  match(Set dst (DivI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6523
  effect(KILL tmp, KILL cr);  // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6524
  ins_cost(2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6525
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6526
  format %{ "DIV_const  $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6527
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6528
    // No sign extension of Rdividend needed here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6529
    if ($src2$$constant != -1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6530
      __ z_lghi(Z_R0_scratch, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6531
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6532
      __ z_dsgfr($dst$$Register->predecessor()/* Dst is odd part of a register pair. */, Z_R0_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6533
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6534
      __ z_lcr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6535
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6536
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6537
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6538
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6539
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6540
// Long DIVMOD with Register, both quotient and mod results
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6541
instruct divModL_reg_divmod(roddRegL dst1src1, revenRegL dst2, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6542
  match(DivModL dst1src1 src2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6543
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6544
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6545
  size(VM_Version::has_CompareBranch() ? 22 : 24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6546
  format %{ "DIVMODL ($dst1src1, $dst2) $src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6547
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6548
    Register d1s1 = $dst1src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6549
    Register d2   = $dst2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6550
    Register s2   = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6551
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6552
    Label do_div, done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6553
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6554
      __ z_cgij(s2, -1, Assembler::bcondNotEqual, do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6555
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6556
      __ z_cghi(s2, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6557
      __ z_brne(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6558
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6559
    __ z_lcgr(d1s1, d1s1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6560
    // indicate unused result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6561
    (void) __ clear_reg(d2, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6562
    __ z_bru(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6563
    __ bind(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6564
    __ z_dsgr(d2, s2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6565
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6566
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6567
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6568
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6569
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6570
// Register Long Division
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6571
instruct divL_reg_reg(roddRegL dst, iRegL src, revenRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6572
  match(Set dst (DivL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6573
  effect(KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6574
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6575
  size(VM_Version::has_CompareBranch() ? 18 : 20);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6576
  format %{ "DIVG_checked  $dst, $src\t # long, treats special case 0x80../-1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6577
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6578
    Register b = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6579
    Register t = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6580
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6581
    Label done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6582
    __ z_lcgr(t, t);    // Does no harm. divisor is in other register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6583
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6584
      __ z_cgij(b, -1, Assembler::bcondEqual, done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6585
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6586
      __ z_cghi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6587
      __ z_bre(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6588
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6589
    __ z_lcgr(t, t);    // Restore sign.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6590
    __ z_dsgr(t->predecessor()/* t is odd part of a register pair. */, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6591
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6592
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6593
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6594
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6595
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6596
// Immediate Long Division
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6597
instruct divL_reg_imm16(roddRegL dst, iRegL src1, immL16 src2, revenRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6598
  match(Set dst (DivL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6599
  effect(KILL tmp, KILL cr);  // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6600
  ins_cost(2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6601
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6602
  format %{ "DIVG_const  $dst,$src1,$src2\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6603
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6604
    if ($src2$$constant != -1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6605
      __ z_lghi(Z_R0_scratch, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6606
      __ lgr_if_needed($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6607
      __ z_dsgr($dst$$Register->predecessor()/* Dst is odd part of a register pair. */, Z_R0_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6608
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6609
      __ z_lcgr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6610
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6611
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6612
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6613
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6614
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6615
// REM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6616
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6617
// Integer Remainder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6618
// Register Remainder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6619
instruct modI_reg_reg(revenRegI dst, iRegI src1, noOdd_iRegI src2, roddRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6620
  match(Set dst (ModI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6621
  effect(KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6622
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6623
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6624
  format %{ "MOD_checked   $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6625
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6626
    Register a = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6627
    Register b = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6628
    Register t = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6629
    assert_different_registers(t->successor(), b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6630
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6631
    Label do_div, done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6632
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6633
    if ((t->encoding() != b->encoding()) && (t->encoding() != a->encoding())) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6634
      (void) __ clear_reg(t, true, false);  // Does no harm. Operands are in other regs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6635
      if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6636
        __ z_cij(b, -1, Assembler::bcondEqual, done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6637
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6638
        __ z_chi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6639
        __ z_bre(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6640
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6641
      __ z_lgfr(t->successor(), a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6642
      __ z_dsgfr(t/* t is even part of a register pair. */, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6643
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6644
      if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6645
        __ z_cij(b, -1, Assembler::bcondNotEqual, do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6646
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6647
        __ z_chi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6648
        __ z_brne(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6649
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6650
      __ clear_reg(t, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6651
      __ z_bru(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6652
      __ bind(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6653
      __ z_lgfr(t->successor(), a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6654
      __ z_dsgfr(t/* t is even part of a register pair. */, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6655
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6656
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6657
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6658
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6659
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6660
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6661
// Immediate Remainder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6662
instruct modI_reg_imm16(revenRegI dst, iRegI src1, immI16 src2, roddRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6663
  match(Set dst (ModI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6664
  effect(KILL tmp, KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6665
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6666
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6667
  format %{ "MOD_const  $dst,src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6668
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6669
    assert_different_registers($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6670
    assert_different_registers($dst$$Register->successor(), $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6671
    int divisor = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6672
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6673
    if (divisor != -1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6674
      __ z_lghi(Z_R0_scratch, divisor);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6675
      __ z_lgfr($dst$$Register->successor(), $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6676
      __ z_dsgfr($dst$$Register/* Dst is even part of a register pair. */, Z_R0_scratch); // Instruction kills tmp.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6677
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6678
      __ clear_reg($dst$$Register, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6679
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6680
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6681
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6682
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6683
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6684
// Register Long Remainder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6685
instruct modL_reg_reg(revenRegL dst, roddRegL src1, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6686
  match(Set dst (ModL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6687
  effect(KILL src1, KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6688
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6689
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6690
  format %{ "MODG_checked   $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6691
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6692
    Register a = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6693
    Register b = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6694
    Register t = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6695
    assert(t->successor() == a, "(t,a) is an even-odd pair" );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6696
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6697
    Label do_div, done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6698
    if (t->encoding() != b->encoding()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6699
      (void) __ clear_reg(t, true, false); // Does no harm. Dividend is in successor.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6700
      if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6701
        __ z_cgij(b, -1, Assembler::bcondEqual, done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6702
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6703
        __ z_cghi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6704
        __ z_bre(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6705
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6706
      __ z_dsgr(t, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6707
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6708
      if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6709
        __ z_cgij(b, -1, Assembler::bcondNotEqual, do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6710
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6711
        __ z_cghi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6712
        __ z_brne(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6713
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6714
      __ clear_reg(t, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6715
      __ z_bru(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6716
      __ bind(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6717
      __ z_dsgr(t, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6718
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6719
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6720
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6721
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6722
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6723
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6724
// Register Long Remainder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6725
instruct modL_reg_imm16(revenRegL dst, iRegL src1, immL16 src2, roddRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6726
  match(Set dst (ModL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6727
  effect(KILL tmp, KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6728
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6729
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6730
  format %{ "MODG_const  $dst,src1,$src2\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6731
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6732
    int divisor = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6733
    if (divisor != -1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6734
      __ z_lghi(Z_R0_scratch, divisor);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6735
      __ z_lgr($dst$$Register->successor(), $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6736
      __ z_dsgr($dst$$Register /* Dst is even part of a register pair. */, Z_R0_scratch);  // Instruction kills tmp.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6737
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6738
      __ clear_reg($dst$$Register, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6739
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6740
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6741
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6742
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6743
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6744
// SHIFT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6745
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6746
// Shift left logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6747
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6748
// Register Shift Left variable
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6749
instruct sllI_reg_reg(iRegI dst, iRegI src, iRegI nbits, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6750
  match(Set dst (LShiftI src nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6751
  effect(KILL cr); // R1 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6752
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6753
  size(14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6754
  format %{ "SLL     $dst,$src,[$nbits] & 31\t# use RISC-like SLLG also for int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6755
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6756
    __ z_lgr(Z_R1_scratch, $nbits$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6757
    __ z_nill(Z_R1_scratch, BitsPerJavaInteger-1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6758
    __ z_sllg($dst$$Register, $src$$Register, 0, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6759
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6760
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6761
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6762
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6763
// Register Shift Left Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6764
// Constant shift count is masked in ideal graph already.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6765
instruct sllI_reg_imm(iRegI dst, iRegI src, immI nbits) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6766
  match(Set dst (LShiftI src nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6767
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6768
  format %{ "SLL     $dst,$src,$nbits\t# use RISC-like SLLG also for int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6769
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6770
    int Nbit = $nbits$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6771
    __ z_sllg($dst$$Register, $src$$Register, Nbit & (BitsPerJavaInteger - 1), Z_R0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6772
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6773
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6774
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6775
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6776
// Register Shift Left Immediate by 1bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6777
instruct sllI_reg_imm_1(iRegI dst, iRegI src, immI_1 nbits) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6778
  match(Set dst (LShiftI src nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6779
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6780
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6781
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6782
  format %{ "LA      $dst,#0($src,$src)\t # SLL by 1 (int)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6783
  ins_encode %{ __ z_la($dst$$Register, 0, $src$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6784
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6785
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6786
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6787
// Register Shift Left Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6788
instruct sllL_reg_reg(iRegL dst, iRegL src1, iRegI nbits) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6789
  match(Set dst (LShiftL src1 nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6790
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6791
  format %{ "SLLG    $dst,$src1,[$nbits]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6792
  opcode(SLLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6793
  ins_encode(z_rsyform_reg_reg(dst, src1, nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6794
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6795
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6796
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6797
// Register Shift Left Long Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6798
instruct sllL_reg_imm(iRegL dst, iRegL src1, immI nbits) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6799
  match(Set dst (LShiftL src1 nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6800
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6801
  format %{ "SLLG    $dst,$src1,$nbits" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6802
  opcode(SLLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6803
  ins_encode(z_rsyform_const(dst, src1, nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6804
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6805
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6806
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6807
// Register Shift Left Long Immediate by 1bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6808
instruct sllL_reg_imm_1(iRegL dst, iRegL src1, immI_1 nbits) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6809
  match(Set dst (LShiftL src1 nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6810
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6811
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6812
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6813
  format %{ "LA      $dst,#0($src1,$src1)\t # SLLG by 1 (long)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6814
  ins_encode %{ __ z_la($dst$$Register, 0, $src1$$Register, $src1$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6815
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6816
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6817
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6818
// Shift right arithmetic
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6819
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6820
// Register Arithmetic Shift Right
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6821
instruct sraI_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6822
  match(Set dst (RShiftI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6823
  effect(KILL cr); // R1 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6824
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6825
  size(12);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6826
  format %{ "SRA     $dst,[$src] & 31" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6827
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6828
    __ z_lgr(Z_R1_scratch, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6829
    __ z_nill(Z_R1_scratch, BitsPerJavaInteger-1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6830
    __ z_sra($dst$$Register, 0, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6831
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6832
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6833
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6834
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6835
// Register Arithmetic Shift Right Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6836
// Constant shift count is masked in ideal graph already.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6837
instruct sraI_reg_imm(iRegI dst, immI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6838
  match(Set dst (RShiftI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6839
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6840
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6841
  format %{ "SRA     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6842
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6843
    int Nbit = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6844
    __ z_sra($dst$$Register, Nbit & (BitsPerJavaInteger - 1), Z_R0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6845
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6846
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6847
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6848
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6849
// Register Arithmetic Shift Right Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6850
instruct sraL_reg_reg(iRegL dst, iRegL src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6851
  match(Set dst (RShiftL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6852
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6853
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6854
  format %{ "SRAG    $dst,$src1,[$src2]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6855
  opcode(SRAG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6856
  ins_encode(z_rsyform_reg_reg(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6857
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6858
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6859
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6860
// Register Arithmetic Shift Right Long Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6861
instruct sraL_reg_imm(iRegL dst, iRegL src1, immI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6862
  match(Set dst (RShiftL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6863
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6864
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6865
  format %{ "SRAG    $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6866
  opcode(SRAG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6867
  ins_encode(z_rsyform_const(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6868
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6869
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6870
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6871
//  Shift right logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6872
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6873
// Register Shift Right
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6874
instruct srlI_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6875
  match(Set dst (URShiftI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6876
  effect(KILL cr); // R1 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6877
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6878
  size(12);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6879
  format %{ "SRL     $dst,[$src] & 31" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6880
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6881
    __ z_lgr(Z_R1_scratch, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6882
    __ z_nill(Z_R1_scratch, BitsPerJavaInteger-1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6883
    __ z_srl($dst$$Register, 0, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6884
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6885
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6886
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6887
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6888
// Register Shift Right Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6889
// Constant shift count is masked in ideal graph already.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6890
instruct srlI_reg_imm(iRegI dst, immI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6891
  match(Set dst (URShiftI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6892
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6893
  format %{ "SRL     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6894
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6895
    int Nbit = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6896
    __ z_srl($dst$$Register, Nbit & (BitsPerJavaInteger - 1), Z_R0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6897
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6898
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6899
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6900
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6901
// Register Shift Right Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6902
instruct srlL_reg_reg(iRegL dst, iRegL src1, iRegI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6903
  match(Set dst (URShiftL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6904
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6905
  format %{ "SRLG    $dst,$src1,[$src2]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6906
  opcode(SRLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6907
  ins_encode(z_rsyform_reg_reg(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6908
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6909
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6910
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6911
// Register Shift Right Long Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6912
instruct srlL_reg_imm(iRegL dst, iRegL src1, immI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6913
  match(Set dst (URShiftL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6914
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6915
  format %{ "SRLG    $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6916
  opcode(SRLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6917
  ins_encode(z_rsyform_const(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6918
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6919
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6920
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6921
// Register Shift Right Immediate with a CastP2X
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6922
instruct srlP_reg_imm(iRegL dst, iRegP_N2P src1, immI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6923
  match(Set dst (URShiftL (CastP2X src1) src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6924
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6925
  format %{ "SRLG    $dst,$src1,$src2\t # Cast ptr $src1 to long and shift" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6926
  opcode(SRLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6927
  ins_encode(z_rsyform_const(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6928
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6929
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6930
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6931
//----------Rotate Instructions------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6932
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6933
// Rotate left 32bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6934
instruct rotlI_reg_immI8(iRegI dst, iRegI src, immI8 lshift, immI8 rshift) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6935
  match(Set dst (OrI (LShiftI src lshift) (URShiftI src rshift)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6936
  predicate(0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 0x1f));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6937
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6938
  format %{ "RLL     $dst,$src,$lshift\t # ROTL32" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6939
  opcode(RLL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6940
  ins_encode(z_rsyform_const(dst, src, lshift));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6941
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6942
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6943
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6944
// Rotate left 64bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6945
instruct rotlL_reg_immI8(iRegL dst, iRegL src, immI8 lshift, immI8 rshift) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6946
  match(Set dst (OrL (LShiftL src lshift) (URShiftL src rshift)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6947
  predicate(0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 0x3f));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6948
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6949
  format %{ "RLLG    $dst,$src,$lshift\t # ROTL64" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6950
  opcode(RLLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6951
  ins_encode(z_rsyform_const(dst, src, lshift));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6952
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6953
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6954
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6955
// Rotate right 32bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6956
instruct rotrI_reg_immI8(iRegI dst, iRegI src, immI8 rshift, immI8 lshift) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6957
  match(Set dst (OrI (URShiftI src rshift) (LShiftI src lshift)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6958
  predicate(0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 0x1f));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6959
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6960
  format %{ "RLL     $dst,$src,$rshift\t # ROTR32" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6961
  opcode(RLL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6962
  ins_encode(z_rsyform_const(dst, src, rshift));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6963
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6964
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6965
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6966
// Rotate right 64bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6967
instruct rotrL_reg_immI8(iRegL dst, iRegL src, immI8 rshift, immI8 lshift) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6968
  match(Set dst (OrL (URShiftL src rshift) (LShiftL src lshift)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6969
  predicate(0 == ((n->in(1)->in(2)->get_int() + n->in(2)->in(2)->get_int()) & 0x3f));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6970
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6971
  format %{ "RLLG    $dst,$src,$rshift\t # ROTR64" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6972
  opcode(RLLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6973
  ins_encode(z_rsyform_const(dst, src, rshift));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6974
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6975
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6976
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6977
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6978
//----------Overflow Math Instructions-----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6979
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6980
instruct overflowAddI_reg_reg(flagsReg cr, iRegI op1, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6981
  match(Set cr (OverflowAddI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6982
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6983
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6984
  format %{ "AR      $op1,$op2\t # overflow check int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6985
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6986
    __ z_lr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6987
    __ z_ar(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6988
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6989
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6990
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6991
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6992
instruct overflowAddI_reg_imm(flagsReg cr, iRegI op1, immI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6993
  match(Set cr (OverflowAddI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6994
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6995
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6996
  format %{ "AR      $op1,$op2\t # overflow check int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6997
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6998
    __ load_const_optimized(Z_R0_scratch, $op2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6999
    __ z_ar(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7000
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7001
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7002
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7003
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7004
instruct overflowAddL_reg_reg(flagsReg cr, iRegL op1, iRegL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7005
  match(Set cr (OverflowAddL op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7006
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7007
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7008
  format %{ "AGR     $op1,$op2\t # overflow check long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7009
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7010
    __ z_lgr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7011
    __ z_agr(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7012
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7013
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7014
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7015
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7016
instruct overflowAddL_reg_imm(flagsReg cr, iRegL op1, immL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7017
  match(Set cr (OverflowAddL op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7018
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7019
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7020
  format %{ "AGR     $op1,$op2\t # overflow check long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7021
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7022
    __ load_const_optimized(Z_R0_scratch, $op2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7023
    __ z_agr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7024
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7025
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7026
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7027
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7028
instruct overflowSubI_reg_reg(flagsReg cr, iRegI op1, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7029
  match(Set cr (OverflowSubI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7030
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7031
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7032
  format %{ "SR      $op1,$op2\t # overflow check int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7033
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7034
    __ z_lr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7035
    __ z_sr(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7036
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7037
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7038
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7039
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7040
instruct overflowSubI_reg_imm(flagsReg cr, iRegI op1, immI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7041
  match(Set cr (OverflowSubI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7042
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7043
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7044
  format %{ "SR      $op1,$op2\t # overflow check int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7045
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7046
    __ load_const_optimized(Z_R1_scratch, $op2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7047
    __ z_lr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7048
    __ z_sr(Z_R0_scratch, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7049
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7050
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7051
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7052
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7053
instruct overflowSubL_reg_reg(flagsReg cr, iRegL op1, iRegL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7054
  match(Set cr (OverflowSubL op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7055
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7056
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7057
  format %{ "SGR     $op1,$op2\t # overflow check long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7058
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7059
    __ z_lgr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7060
    __ z_sgr(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7061
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7062
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7063
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7064
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7065
instruct overflowSubL_reg_imm(flagsReg cr, iRegL op1, immL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7066
  match(Set cr (OverflowSubL op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7067
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7068
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7069
  format %{ "SGR     $op1,$op2\t # overflow check long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7070
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7071
    __ load_const_optimized(Z_R1_scratch, $op2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7072
    __ z_lgr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7073
    __ z_sgr(Z_R0_scratch, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7074
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7075
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7076
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7077
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7078
instruct overflowNegI_rReg(flagsReg cr, immI_0 zero, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7079
  match(Set cr (OverflowSubI zero op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7080
  effect(DEF cr, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7081
  format %{ "NEG    $op2\t# overflow check int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7082
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7083
    __ clear_reg(Z_R0_scratch, false, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7084
    __ z_sr(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7085
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7086
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7087
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7088
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7089
instruct overflowNegL_rReg(flagsReg cr, immL_0 zero, iRegL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7090
  match(Set cr (OverflowSubL zero op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7091
  effect(DEF cr, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7092
  format %{ "NEGG    $op2\t# overflow check long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7093
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7094
    __ clear_reg(Z_R0_scratch, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7095
    __ z_sgr(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7096
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7097
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7098
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7099
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7100
// No intrinsics for multiplication, since there is no easy way
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7101
// to check for overflow.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7102
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7103
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7104
//----------Floating Point Arithmetic Instructions-----------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7105
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7106
//  ADD
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7107
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7108
//  Add float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7109
instruct addF_reg_reg(regF dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7110
  match(Set dst (AddF dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7111
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7112
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7113
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7114
  format %{ "AEBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7115
  opcode(AEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7116
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7117
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7118
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7119
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7120
instruct addF_reg_mem(regF dst, memoryRX src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7121
  match(Set dst (AddF dst (LoadF src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7122
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7123
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7124
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7125
  format %{ "AEB      $dst,$src\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7126
  opcode(AEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7127
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7128
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7129
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7130
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7131
// Add float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7132
instruct addD_reg_reg(regD dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7133
  match(Set dst (AddD dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7134
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7135
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7136
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7137
  format %{ "ADBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7138
  opcode(ADBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7139
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7140
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7141
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7142
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7143
instruct addD_reg_mem(regD dst, memoryRX src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7144
  match(Set dst (AddD dst (LoadD src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7145
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7146
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7147
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7148
  format %{ "ADB      $dst,$src\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7149
  opcode(ADB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7150
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7151
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7152
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7153
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7154
// SUB
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7155
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7156
// Sub float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7157
instruct subF_reg_reg(regF dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7158
  match(Set dst (SubF dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7159
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7160
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7161
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7162
  format %{ "SEBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7163
  opcode(SEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7164
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7165
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7166
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7167
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7168
instruct subF_reg_mem(regF dst, memoryRX src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7169
  match(Set dst (SubF dst (LoadF src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7170
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7171
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7172
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7173
  format %{ "SEB      $dst,$src\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7174
  opcode(SEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7175
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7176
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7177
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7178
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7179
//  Sub float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7180
instruct subD_reg_reg(regD dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7181
  match(Set dst (SubD dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7182
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7183
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7184
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7185
  format %{ "SDBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7186
  opcode(SDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7187
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7188
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7189
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7190
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7191
instruct subD_reg_mem(regD dst, memoryRX src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7192
  match(Set dst (SubD dst (LoadD src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7193
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7194
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7195
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7196
  format %{ "SDB      $dst,$src\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7197
  opcode(SDB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7198
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7199
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7200
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7201
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7202
// MUL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7203
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7204
// Mul float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7205
instruct mulF_reg_reg(regF dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7206
  match(Set dst (MulF dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7207
  // CC unchanged by MUL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7208
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7209
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7210
  format %{ "MEEBR    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7211
  opcode(MEEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7212
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7213
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7214
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7215
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7216
instruct mulF_reg_mem(regF dst, memoryRX src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7217
  match(Set dst (MulF dst (LoadF src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7218
  // CC unchanged by MUL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7219
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7220
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7221
  format %{ "MEEB     $dst,$src\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7222
  opcode(MEEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7223
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7224
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7225
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7226
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7227
//  Mul float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7228
instruct mulD_reg_reg(regD dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7229
  match(Set dst (MulD dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7230
  // CC unchanged by MUL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7231
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7232
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7233
  format %{ "MDBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7234
  opcode(MDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7235
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7236
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7237
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7238
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7239
instruct mulD_reg_mem(regD dst, memoryRX src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7240
  match(Set dst (MulD dst (LoadD src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7241
  // CC unchanged by MUL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7242
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7243
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7244
  format %{ "MDB      $dst,$src\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7245
  opcode(MDB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7246
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7247
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7248
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7249
42897
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7250
// Multiply-Accumulate
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7251
// src1 * src2 + dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7252
instruct maddF_reg_reg(regF dst, regF src1, regF src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7253
  match(Set dst (FmaF dst (Binary src1 src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7254
  // CC unchanged by MUL-ADD.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7255
  ins_cost(ALU_REG_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7256
  size(4);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7257
  format %{ "MAEBR    $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7258
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7259
    __ z_maebr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7260
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7261
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7262
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7263
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7264
// src1 * src2 + dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7265
instruct maddD_reg_reg(regD dst, regD src1, regD src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7266
  match(Set dst (FmaD dst (Binary src1 src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7267
  // CC unchanged by MUL-ADD.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7268
  ins_cost(ALU_REG_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7269
  size(4);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7270
  format %{ "MADBR    $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7271
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7272
    __ z_madbr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7273
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7274
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7275
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7276
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7277
// src1 * src2 - dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7278
instruct msubF_reg_reg(regF dst, regF src1, regF src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7279
  match(Set dst (FmaF (NegF dst) (Binary src1 src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7280
  // CC unchanged by MUL-SUB.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7281
  ins_cost(ALU_REG_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7282
  size(4);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7283
  format %{ "MSEBR    $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7284
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7285
    __ z_msebr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7286
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7287
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7288
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7289
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7290
// src1 * src2 - dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7291
instruct msubD_reg_reg(regD dst, regD src1, regD src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7292
  match(Set dst (FmaD (NegD dst) (Binary src1 src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7293
  // CC unchanged by MUL-SUB.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7294
  ins_cost(ALU_REG_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7295
  size(4);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7296
  format %{ "MSDBR    $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7297
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7298
    __ z_msdbr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7299
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7300
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7301
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7302
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7303
// src1 * src2 + dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7304
instruct maddF_reg_mem(regF dst, regF src1, memoryRX src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7305
  match(Set dst (FmaF dst (Binary src1 (LoadF src2))));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7306
  // CC unchanged by MUL-ADD.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7307
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7308
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7309
  format %{ "MAEB     $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7310
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7311
    __ z_maeb($dst$$FloatRegister, $src1$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7312
              Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7313
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7314
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7315
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7316
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7317
// src1 * src2 + dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7318
instruct maddD_reg_mem(regD dst, regD src1, memoryRX src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7319
  match(Set dst (FmaD dst (Binary src1 (LoadD src2))));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7320
  // CC unchanged by MUL-ADD.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7321
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7322
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7323
  format %{ "MADB     $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7324
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7325
    __ z_madb($dst$$FloatRegister, $src1$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7326
              Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7327
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7328
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7329
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7330
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7331
// src1 * src2 - dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7332
instruct msubF_reg_mem(regF dst, regF src1, memoryRX src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7333
  match(Set dst (FmaF (NegF dst) (Binary src1 (LoadF src2))));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7334
  // CC unchanged by MUL-SUB.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7335
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7336
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7337
  format %{ "MSEB     $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7338
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7339
    __ z_mseb($dst$$FloatRegister, $src1$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7340
              Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7341
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7342
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7343
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7344
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7345
// src1 * src2 - dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7346
instruct msubD_reg_mem(regD dst, regD src1, memoryRX src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7347
  match(Set dst (FmaD (NegD dst) (Binary src1 (LoadD src2))));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7348
  // CC unchanged by MUL-SUB.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7349
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7350
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7351
  format %{ "MSDB    $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7352
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7353
    __ z_msdb($dst$$FloatRegister, $src1$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7354
              Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7355
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7356
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7357
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7358
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7359
// src1 * src2 + dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7360
instruct maddF_mem_reg(regF dst, memoryRX src1, regF src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7361
  match(Set dst (FmaF dst (Binary (LoadF src1) src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7362
  // CC unchanged by MUL-ADD.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7363
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7364
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7365
  format %{ "MAEB     $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7366
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7367
    __ z_maeb($dst$$FloatRegister, $src2$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7368
              Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7369
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7370
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7371
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7372
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7373
// src1 * src2 + dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7374
instruct maddD_mem_reg(regD dst, memoryRX src1, regD src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7375
  match(Set dst (FmaD dst (Binary (LoadD src1) src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7376
  // CC unchanged by MUL-ADD.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7377
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7378
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7379
  format %{ "MADB     $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7380
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7381
    __ z_madb($dst$$FloatRegister, $src2$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7382
              Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7383
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7384
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7385
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7386
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7387
// src1 * src2 - dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7388
instruct msubF_mem_reg(regF dst, memoryRX src1, regF src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7389
  match(Set dst (FmaF (NegF dst) (Binary (LoadF src1) src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7390
  // CC unchanged by MUL-SUB.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7391
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7392
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7393
  format %{ "MSEB     $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7394
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7395
    __ z_mseb($dst$$FloatRegister, $src2$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7396
              Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7397
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7398
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7399
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7400
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7401
// src1 * src2 - dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7402
instruct msubD_mem_reg(regD dst, memoryRX src1, regD src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7403
  match(Set dst (FmaD (NegD dst) (Binary (LoadD src1) src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7404
  // CC unchanged by MUL-SUB.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7405
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7406
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7407
  format %{ "MSDB    $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7408
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7409
    __ z_msdb($dst$$FloatRegister, $src2$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7410
              Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7411
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7412
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7413
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7414
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7415
//  DIV
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7416
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7417
//  Div float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7418
instruct divF_reg_reg(regF dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7419
  match(Set dst (DivF dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7420
  // CC unchanged by DIV.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7421
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7422
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7423
  format %{ "DEBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7424
  opcode(DEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7425
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7426
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7427
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7428
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7429
instruct divF_reg_mem(regF dst, memoryRX src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7430
  match(Set dst (DivF dst (LoadF src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7431
  // CC unchanged by DIV.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7432
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7433
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7434
  format %{ "DEB      $dst,$src\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7435
  opcode(DEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7436
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7437
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7438
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7439
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7440
//  Div float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7441
instruct divD_reg_reg(regD dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7442
  match(Set dst (DivD dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7443
  // CC unchanged by DIV.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7444
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7445
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7446
  format %{ "DDBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7447
  opcode(DDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7448
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7449
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7450
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7451
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7452
instruct divD_reg_mem(regD dst, memoryRX src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7453
  match(Set dst (DivD dst (LoadD src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7454
  // CC unchanged by DIV.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7455
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7456
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7457
  format %{ "DDB      $dst,$src\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7458
  opcode(DDB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7459
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7460
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7461
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7462
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7463
// ABS
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7464
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7465
// Absolute float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7466
instruct absF_reg(regF dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7467
  match(Set dst (AbsF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7468
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7469
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7470
  format %{ "LPEBR    $dst,$src\t float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7471
  opcode(LPEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7472
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7473
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7474
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7475
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7476
// Absolute float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7477
instruct absD_reg(regD dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7478
  match(Set dst (AbsD src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7479
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7480
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7481
  format %{ "LPDBR    $dst,$src\t double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7482
  opcode(LPDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7483
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7484
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7485
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7486
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7487
//  NEG(ABS)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7488
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7489
// Negative absolute float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7490
instruct nabsF_reg(regF dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7491
  match(Set dst (NegF (AbsF src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7492
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7493
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7494
  format %{ "LNEBR    $dst,$src\t float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7495
  opcode(LNEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7496
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7497
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7498
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7499
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7500
// Negative absolute float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7501
instruct nabsD_reg(regD dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7502
  match(Set dst (NegD (AbsD src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7503
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7504
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7505
  format %{ "LNDBR    $dst,$src\t double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7506
  opcode(LNDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7507
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7508
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7509
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7510
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7511
// NEG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7512
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7513
instruct negF_reg(regF dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7514
  match(Set dst (NegF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7515
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7516
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7517
  format %{ "NegF     $dst,$src\t float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7518
  ins_encode %{ __ z_lcebr($dst$$FloatRegister, $src$$FloatRegister); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7519
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7520
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7521
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7522
instruct negD_reg(regD dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7523
  match(Set dst (NegD src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7524
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7525
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7526
  format %{ "NegD     $dst,$src\t double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7527
  ins_encode %{ __ z_lcdbr($dst$$FloatRegister, $src$$FloatRegister); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7528
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7529
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7530
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7531
// SQRT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7532
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7533
// Sqrt float precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7534
instruct sqrtF_reg(regF dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7535
  match(Set dst (ConvD2F (SqrtD (ConvF2D src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7536
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7537
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7538
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7539
  format %{ "SQEBR    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7540
  opcode(SQEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7541
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7542
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7543
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7544
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7545
// Sqrt double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7546
instruct sqrtD_reg(regD dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7547
  match(Set dst (SqrtD src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7548
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7549
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7550
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7551
  format %{ "SQDBR    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7552
  opcode(SQDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7553
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7554
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7555
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7556
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7557
instruct sqrtF_mem(regF dst, memoryRX src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7558
  match(Set dst (ConvD2F (SqrtD (ConvF2D src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7559
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7560
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7561
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7562
  format %{ "SQEB     $dst,$src\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7563
  opcode(SQEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7564
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7565
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7566
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7567
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7568
instruct sqrtD_mem(regD dst, memoryRX src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7569
  match(Set dst (SqrtD src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7570
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7571
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7572
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7573
  format %{ "SQDB     $dst,$src\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7574
  opcode(SQDB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7575
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7576
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7577
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7578
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7579
//----------Logical Instructions-----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7580
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7581
// Register And
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7582
instruct andI_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7583
  match(Set dst (AndI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7584
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7585
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7586
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7587
  format %{ "NR      $dst,$src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7588
  opcode(NR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7589
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7590
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7591
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7592
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7593
instruct andI_Reg_mem(iRegI dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7594
  match(Set dst (AndI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7595
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7596
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7597
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7598
  format %{ "N(Y)    $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7599
  opcode(NY_ZOPC, N_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7600
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7601
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7602
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7603
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7604
// Immediate And
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7605
instruct andI_reg_uimm32(iRegI dst, uimmI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7606
  match(Set dst (AndI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7607
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7608
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7609
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7610
  format %{ "NILF    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7611
  opcode(NILF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7612
  ins_encode(z_rilform_unsigned(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7613
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7614
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7615
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7616
instruct andI_reg_uimmI_LH1(iRegI dst, uimmI_LH1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7617
  match(Set dst (AndI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7618
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7619
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7620
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7621
  format %{ "NILH    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7622
  ins_encode %{ __ z_nilh($dst$$Register, ($src$$constant >> 16) & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7623
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7624
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7625
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7626
instruct andI_reg_uimmI_LL1(iRegI dst, uimmI_LL1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7627
  match(Set dst (AndI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7628
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7629
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7630
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7631
  format %{ "NILL    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7632
  ins_encode %{ __ z_nill($dst$$Register, $src$$constant & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7633
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7634
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7635
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7636
// Register And Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7637
instruct andL_reg_reg(iRegL dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7638
  match(Set dst (AndL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7639
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7640
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7641
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7642
  format %{ "NGR     $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7643
  opcode(NGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7644
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7645
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7646
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7647
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7648
instruct andL_Reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7649
  match(Set dst (AndL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7650
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7651
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7652
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7653
  format %{ "NG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7654
  opcode(NG_ZOPC, NG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7655
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7656
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7657
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7658
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7659
instruct andL_reg_uimmL_LL1(iRegL dst, uimmL_LL1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7660
  match(Set dst (AndL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7661
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7662
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7663
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7664
  format %{ "NILL    $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7665
  ins_encode %{ __ z_nill($dst$$Register, $src$$constant & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7666
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7667
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7668
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7669
instruct andL_reg_uimmL_LH1(iRegL dst, uimmL_LH1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7670
  match(Set dst (AndL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7671
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7672
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7673
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7674
  format %{ "NILH    $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7675
  ins_encode %{ __ z_nilh($dst$$Register, ($src$$constant >> 16) & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7676
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7677
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7678
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7679
instruct andL_reg_uimmL_HL1(iRegL dst, uimmL_HL1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7680
  match(Set dst (AndL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7681
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7682
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7683
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7684
  format %{ "NIHL    $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7685
  ins_encode %{ __ z_nihl($dst$$Register, ($src$$constant >> 32) & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7686
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7687
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7688
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7689
instruct andL_reg_uimmL_HH1(iRegL dst, uimmL_HH1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7690
  match(Set dst (AndL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7691
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7692
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7693
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7694
  format %{ "NIHH    $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7695
  ins_encode %{ __ z_nihh($dst$$Register, ($src$$constant >> 48) & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7696
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7697
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7698
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7699
//  OR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7700
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7701
// Or Instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7702
// Register Or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7703
instruct orI_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7704
  match(Set dst (OrI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7705
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7706
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7707
  format %{ "OR      $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7708
  opcode(OR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7709
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7710
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7711
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7712
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7713
instruct orI_Reg_mem(iRegI dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7714
  match(Set dst (OrI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7715
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7716
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7717
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7718
  format %{ "O(Y)    $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7719
  opcode(OY_ZOPC, O_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7720
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7721
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7722
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7723
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7724
// Immediate Or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7725
instruct orI_reg_uimm16(iRegI dst, uimmI16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7726
  match(Set dst (OrI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7727
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7728
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7729
  format %{ "OILL    $dst,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7730
  opcode(OILL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7731
  ins_encode(z_riform_unsigned(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7732
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7733
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7734
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7735
instruct orI_reg_uimm32(iRegI dst, uimmI con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7736
  match(Set dst (OrI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7737
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7738
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7739
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7740
  format %{ "OILF    $dst,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7741
  opcode(OILF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7742
  ins_encode(z_rilform_unsigned(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7743
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7744
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7745
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7746
// Register Or Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7747
instruct orL_reg_reg(iRegL dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7748
  match(Set dst (OrL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7749
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7750
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7751
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7752
  format %{ "OGR      $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7753
  opcode(OGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7754
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7755
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7756
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7757
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7758
instruct orL_Reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7759
  match(Set dst (OrL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7760
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7761
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7762
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7763
  format %{ "OG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7764
  opcode(OG_ZOPC, OG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7765
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7766
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7767
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7768
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7769
// Immediate Or long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7770
instruct orL_reg_uimm16(iRegL dst, uimmL16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7771
  match(Set dst (OrL dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7772
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7773
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7774
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7775
  format %{ "OILL    $dst,$con\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7776
  opcode(OILL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7777
  ins_encode(z_riform_unsigned(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7778
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7779
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7780
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7781
instruct orL_reg_uimm32(iRegI dst, uimmL32 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7782
  match(Set dst (OrI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7783
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7784
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7785
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7786
  format %{ "OILF    $dst,$con\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7787
  opcode(OILF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7788
  ins_encode(z_rilform_unsigned(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7789
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7790
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7791
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7792
// XOR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7793
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7794
// Register Xor
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7795
instruct xorI_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7796
  match(Set dst (XorI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7797
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7798
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7799
  format %{ "XR      $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7800
  opcode(XR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7801
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7802
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7803
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7804
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7805
instruct xorI_Reg_mem(iRegI dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7806
  match(Set dst (XorI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7807
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7808
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7809
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7810
  format %{ "X(Y)    $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7811
  opcode(XY_ZOPC, X_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7812
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7813
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7814
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7815
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7816
// Immediate Xor
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7817
instruct xorI_reg_uimm32(iRegI dst, uimmI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7818
  match(Set dst (XorI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7819
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7820
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7821
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7822
  format %{ "XILF    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7823
  opcode(XILF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7824
  ins_encode(z_rilform_unsigned(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7825
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7826
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7827
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7828
// Register Xor Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7829
instruct xorL_reg_reg(iRegL dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7830
  match(Set dst (XorL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7831
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7832
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7833
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7834
  format %{ "XGR     $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7835
  opcode(XGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7836
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7837
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7838
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7839
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7840
instruct xorL_Reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7841
  match(Set dst (XorL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7842
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7843
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7844
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7845
  format %{ "XG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7846
  opcode(XG_ZOPC, XG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7847
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7848
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7849
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7850
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7851
// Immediate Xor Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7852
instruct xorL_reg_uimm32(iRegL dst, uimmL32 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7853
  match(Set dst (XorL dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7854
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7855
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7856
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7857
  format %{ "XILF    $dst,$con\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7858
  opcode(XILF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7859
  ins_encode(z_rilform_unsigned(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7860
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7861
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7862
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7863
//----------Convert to Boolean-------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7864
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7865
// Convert integer to boolean.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7866
instruct convI2B(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7867
  match(Set dst (Conv2B src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7868
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7869
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7870
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7871
  format %{ "convI2B $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7872
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7873
    __ z_lnr($dst$$Register, $src$$Register);  // Rdst := -|Rsrc|, i.e. Rdst == 0 <=> Rsrc == 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7874
    __ z_srl($dst$$Register, 31);              // Rdst := sign(Rdest)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7875
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7876
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7877
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7878
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7879
instruct convP2B(iRegI dst, iRegP_N2P src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7880
  match(Set dst (Conv2B src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7881
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7882
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7883
  size(10);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7884
  format %{ "convP2B $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7885
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7886
    __ z_lngr($dst$$Register, $src$$Register);     // Rdst := -|Rsrc| i.e. Rdst == 0 <=> Rsrc == 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7887
    __ z_srlg($dst$$Register, $dst$$Register, 63); // Rdst := sign(Rdest)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7888
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7889
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7890
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7891
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7892
instruct cmpLTMask_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7893
  match(Set dst (CmpLTMask dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7894
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7895
  ins_cost(2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7896
  size(18);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7897
  format %{ "Set $dst CmpLTMask $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7898
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7899
    // Avoid signed 32 bit overflow: Do sign extend and sub 64 bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7900
    __ z_lgfr(Z_R0_scratch, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7901
    __ z_lgfr($dst$$Register, $dst$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7902
    __ z_sgr($dst$$Register, Z_R0_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7903
    __ z_srag($dst$$Register, $dst$$Register, 63);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7904
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7905
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7906
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7907
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7908
instruct cmpLTMask_reg_zero(iRegI dst, immI_0 zero, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7909
  match(Set dst (CmpLTMask dst zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7910
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7911
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7912
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7913
  format %{ "Set $dst CmpLTMask $dst,$zero" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7914
  ins_encode %{ __ z_sra($dst$$Register, 31); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7915
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7916
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7917
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7918
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7919
//----------Arithmetic Conversion Instructions---------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7920
// The conversions operations are all Alpha sorted. Please keep it that way!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7921
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7922
instruct convD2F_reg(regF dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7923
  match(Set dst (ConvD2F src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7924
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7925
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7926
  format %{ "LEDBR   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7927
  opcode(LEDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7928
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7929
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7930
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7931
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7932
instruct convF2I_reg(iRegI dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7933
  match(Set dst (ConvF2I src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7934
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7935
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7936
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7937
  format %{ "convF2I  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7938
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7939
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7940
    __ clear_reg($dst$$Register, false, false);  // Initialize with result for unordered: 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7941
    __ z_cebr($src$$FloatRegister, $src$$FloatRegister);   // Round.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7942
    __ z_brno(done);                             // Result is zero if unordered argument.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7943
    __ z_cfebr($dst$$Register, $src$$FloatRegister, Assembler::to_zero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7944
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7945
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7946
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7947
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7948
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7949
instruct convD2I_reg(iRegI dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7950
  match(Set dst (ConvD2I src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7951
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7952
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7953
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7954
  format %{ "convD2I  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7955
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7956
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7957
    __ clear_reg($dst$$Register, false, false);  // Initialize with result for unordered: 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7958
    __ z_cdbr($src$$FloatRegister, $src$$FloatRegister);   // Round.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7959
    __ z_brno(done);                             // Result is zero if unordered argument.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7960
    __ z_cfdbr($dst$$Register, $src$$FloatRegister, Assembler::to_zero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7961
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7962
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7963
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7964
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7965
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7966
instruct convF2L_reg(iRegL dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7967
  match(Set dst (ConvF2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7968
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7969
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7970
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7971
  format %{ "convF2L  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7972
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7973
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7974
    __ clear_reg($dst$$Register, true, false);  // Initialize with result for unordered: 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7975
    __ z_cebr($src$$FloatRegister, $src$$FloatRegister);   // Round.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7976
    __ z_brno(done);                             // Result is zero if unordered argument.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7977
    __ z_cgebr($dst$$Register, $src$$FloatRegister, Assembler::to_zero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7978
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7979
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7980
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7981
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7982
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7983
instruct convD2L_reg(iRegL dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7984
  match(Set dst (ConvD2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7985
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7986
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7987
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7988
  format %{ "convD2L  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7989
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7990
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7991
    __ clear_reg($dst$$Register, true, false);  // Initialize with result for unordered: 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7992
    __ z_cdbr($src$$FloatRegister, $src$$FloatRegister);   // Round.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7993
    __ z_brno(done);                             // Result is zero if unordered argument.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7994
    __ z_cgdbr($dst$$Register, $src$$FloatRegister, Assembler::to_zero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7995
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7996
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7997
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7998
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7999
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8000
instruct convF2D_reg(regD dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8001
  match(Set dst (ConvF2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8002
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8003
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8004
  format %{ "LDEBR   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8005
  opcode(LDEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8006
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8007
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8008
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8009
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8010
instruct convF2D_mem(regD dst, memoryRX src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8011
  match(Set dst (ConvF2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8012
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8013
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8014
  format %{ "LDEB    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8015
  opcode(LDEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8016
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8017
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8018
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8019
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8020
instruct convI2D_reg(regD dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8021
  match(Set dst (ConvI2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8022
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8023
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8024
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8025
  format %{ "CDFBR   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8026
  opcode(CDFBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8027
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8028
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8029
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8030
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8031
// Optimization that saves up to two memory operations for each conversion.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8032
instruct convI2F_ireg(regF dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8033
  match(Set dst (ConvI2F src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8034
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8035
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8036
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8037
  format %{ "CEFBR   $dst,$src\t # convert int to float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8038
  opcode(CEFBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8039
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8040
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8041
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8042
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8043
instruct convI2L_reg(iRegL dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8044
  match(Set dst (ConvI2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8045
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8046
  format %{ "LGFR    $dst,$src\t # int->long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8047
  opcode(LGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8048
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8049
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8050
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8051
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8052
// Zero-extend convert int to long.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8053
instruct convI2L_reg_zex(iRegL dst, iRegI src, immL_32bits mask) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8054
  match(Set dst (AndL (ConvI2L src) mask));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8055
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8056
  format %{ "LLGFR   $dst, $src \t # zero-extend int to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8057
  ins_encode %{ __ z_llgfr($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8058
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8059
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8060
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8061
// Zero-extend convert int to long.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8062
instruct convI2L_mem_zex(iRegL dst, memory src, immL_32bits mask) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8063
  match(Set dst (AndL (ConvI2L (LoadI src)) mask));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8064
  // Uses load_const_optmized, so size can vary.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8065
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8066
  format %{ "LLGF    $dst, $src \t # zero-extend int to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8067
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8068
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8069
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8070
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8071
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8072
// Zero-extend long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8073
instruct zeroExtend_long(iRegL dst, iRegL src, immL_32bits mask) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8074
  match(Set dst (AndL src mask));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8075
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8076
  format %{ "LLGFR   $dst, $src \t # zero-extend long to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8077
  ins_encode %{ __ z_llgfr($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8078
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8079
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8080
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8081
instruct rShiftI16_lShiftI16_reg(iRegI dst, iRegI src, immI_16 amount) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8082
  match(Set dst (RShiftI (LShiftI src amount) amount));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8083
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8084
  format %{ "LHR     $dst,$src\t short->int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8085
  opcode(LHR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8086
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8087
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8088
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8089
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8090
instruct rShiftI24_lShiftI24_reg(iRegI dst, iRegI src, immI_24 amount) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8091
  match(Set dst (RShiftI (LShiftI src amount) amount));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8092
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8093
  format %{ "LBR     $dst,$src\t byte->int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8094
  opcode(LBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8095
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8096
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8097
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8098
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8099
instruct MoveF2I_stack_reg(iRegI dst, stackSlotF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8100
  match(Set dst (MoveF2I src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8101
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8102
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8103
  format %{ "L       $dst,$src\t # MoveF2I" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8104
  opcode(L_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8105
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8106
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8107
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8108
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8109
// javax.imageio.stream.ImageInputStreamImpl.toFloats([B[FII)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8110
instruct MoveI2F_stack_reg(regF dst, stackSlotI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8111
  match(Set dst (MoveI2F src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8112
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8113
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8114
  format %{ "LE      $dst,$src\t # MoveI2F" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8115
  opcode(LE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8116
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8117
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8118
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8119
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8120
instruct MoveD2L_stack_reg(iRegL dst, stackSlotD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8121
  match(Set dst (MoveD2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8122
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8123
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8124
  format %{ "LG      $src,$dst\t # MoveD2L" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8125
  opcode(LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8126
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8127
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8128
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8129
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8130
instruct MoveL2D_stack_reg(regD dst, stackSlotL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8131
  match(Set dst (MoveL2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8132
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8133
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8134
  format %{ "LD      $dst,$src\t # MoveL2D" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8135
  opcode(LD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8136
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8137
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8138
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8139
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8140
instruct MoveI2F_reg_stack(stackSlotF dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8141
  match(Set dst (MoveI2F src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8142
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8143
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8144
  format %{ "ST      $src,$dst\t # MoveI2F" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8145
  opcode(ST_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8146
  ins_encode(z_form_rt_mem(src, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8147
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8148
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8149
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8150
instruct MoveD2L_reg_stack(stackSlotL dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8151
  match(Set dst (MoveD2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8152
  effect(DEF dst, USE src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8153
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8154
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8155
  format %{ "STD     $src,$dst\t # MoveD2L" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8156
  opcode(STD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8157
  ins_encode(z_form_rt_mem(src,dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8158
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8159
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8160
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8161
instruct MoveL2D_reg_stack(stackSlotD dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8162
  match(Set dst (MoveL2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8163
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8164
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8165
  format %{ "STG     $src,$dst\t # MoveL2D" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8166
  opcode(STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8167
  ins_encode(z_form_rt_mem(src,dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8168
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8169
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8170
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8171
instruct convL2F_reg(regF dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8172
  match(Set dst (ConvL2F src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8173
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8174
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8175
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8176
  format %{ "CEGBR   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8177
  opcode(CEGBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8178
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8179
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8180
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8181
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8182
instruct convL2D_reg(regD dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8183
  match(Set dst (ConvL2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8184
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8185
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8186
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8187
  format %{ "CDGBR   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8188
  opcode(CDGBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8189
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8190
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8191
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8192
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8193
instruct convL2I_reg(iRegI dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8194
  match(Set dst (ConvL2I src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8195
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8196
  format %{ "LR      $dst,$src\t # long->int (if needed)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8197
  ins_encode %{ __ lr_if_needed($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8198
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8199
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8200
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8201
// Register Shift Right Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8202
instruct shrL_reg_imm6_L2I(iRegI dst, iRegL src, immI_32_63 cnt, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8203
  match(Set dst (ConvL2I (RShiftL src cnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8204
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8205
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8206
  format %{ "SRAG    $dst,$src,$cnt" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8207
  opcode(SRAG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8208
  ins_encode(z_rsyform_const(dst, src, cnt));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8209
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8210
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8211
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8212
//----------TRAP based zero checks and range checks----------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8213
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8214
// SIGTRAP based implicit range checks in compiled code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8215
// A range check in the ideal world has one of the following shapes:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8216
//   - (If le (CmpU length index)), (IfTrue  throw exception)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8217
//   - (If lt (CmpU index length)), (IfFalse throw exception)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8218
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8219
// Match range check 'If le (CmpU length index)'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8220
instruct rangeCheck_iReg_uimmI16(cmpOpT cmp, iRegI length, uimmI16 index, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8221
  match(If cmp (CmpU length index));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8222
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8223
  predicate(TrapBasedRangeChecks &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8224
            _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8225
            PROB_UNLIKELY(_leaf->as_If ()->_prob) >= PROB_ALWAYS &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8226
            Matcher::branches_to_uncommon_trap(_leaf));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8227
  ins_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8228
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8229
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8230
  ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8231
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8232
  format %{ "RangeCheck len=$length cmp=$cmp idx=$index => trap $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8233
  ins_encode %{ __ z_clfit($length$$Register, $index$$constant, $cmp$$cmpcode); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8234
  ins_pipe(pipe_class_trap);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8235
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8236
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8237
// Match range check 'If lt (CmpU index length)'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8238
instruct rangeCheck_iReg_iReg(cmpOpT cmp, iRegI index, iRegI length, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8239
  match(If cmp (CmpU index length));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8240
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8241
  predicate(TrapBasedRangeChecks &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8242
            _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8243
            _leaf->as_If ()->_prob >= PROB_ALWAYS &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8244
            Matcher::branches_to_uncommon_trap(_leaf));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8245
  ins_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8246
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8247
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8248
  ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8249
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8250
  format %{ "RangeCheck idx=$index cmp=$cmp len=$length => trap $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8251
  ins_encode %{ __ z_clrt($index$$Register, $length$$Register, $cmp$$cmpcode); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8252
  ins_pipe(pipe_class_trap);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8253
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8254
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8255
// Match range check 'If lt (CmpU index length)'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8256
instruct rangeCheck_uimmI16_iReg(cmpOpT cmp, iRegI index, uimmI16 length, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8257
  match(If cmp (CmpU index length));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8258
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8259
  predicate(TrapBasedRangeChecks &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8260
            _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8261
            _leaf->as_If ()->_prob >= PROB_ALWAYS &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8262
            Matcher::branches_to_uncommon_trap(_leaf));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8263
  ins_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8264
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8265
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8266
  ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8267
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8268
  format %{ "RangeCheck idx=$index cmp=$cmp len= $length => trap $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8269
  ins_encode %{ __ z_clfit($index$$Register, $length$$constant, $cmp$$cmpcode); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8270
  ins_pipe(pipe_class_trap);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8271
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8272
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8273
// Implicit zero checks (more implicit null checks).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8274
instruct zeroCheckP_iReg_imm0(cmpOpT cmp, iRegP_N2P value, immP0 zero, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8275
  match(If cmp (CmpP value zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8276
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8277
  predicate(TrapBasedNullChecks &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8278
            _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8279
            _leaf->as_If ()->_prob >= PROB_LIKELY_MAG(4) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8280
            Matcher::branches_to_uncommon_trap(_leaf));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8281
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8282
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8283
  ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8284
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8285
  format %{ "ZeroCheckP value=$value cmp=$cmp zero=$zero => trap $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8286
  ins_encode %{ __ z_cgit($value$$Register, 0, $cmp$$cmpcode); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8287
  ins_pipe(pipe_class_trap);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8288
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8289
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8290
// Implicit zero checks (more implicit null checks).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8291
instruct zeroCheckN_iReg_imm0(cmpOpT cmp, iRegN_P2N value, immN0 zero, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8292
  match(If cmp (CmpN value zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8293
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8294
  predicate(TrapBasedNullChecks &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8295
            _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8296
            _leaf->as_If ()->_prob >= PROB_LIKELY_MAG(4) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8297
            Matcher::branches_to_uncommon_trap(_leaf));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8298
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8299
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8300
  ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8301
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8302
  format %{ "ZeroCheckN value=$value cmp=$cmp zero=$zero => trap $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8303
  ins_encode %{ __ z_cit($value$$Register, 0, $cmp$$cmpcode); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8304
  ins_pipe(pipe_class_trap);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8305
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8306
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8307
//----------Compare instructions-----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8308
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8309
// INT signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8310
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8311
// Compare Integers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8312
instruct compI_reg_reg(flagsReg cr, iRegI op1, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8313
  match(Set cr (CmpI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8314
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8315
  format %{ "CR      $op1,$op2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8316
  opcode(CR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8317
  ins_encode(z_rrform(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8318
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8319
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8320
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8321
instruct compI_reg_imm(flagsReg cr, iRegI op1, immI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8322
  match(Set cr (CmpI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8323
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8324
  format %{ "CFI     $op1,$op2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8325
  opcode(CFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8326
  ins_encode(z_rilform_signed(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8327
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8328
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8329
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8330
instruct compI_reg_imm16(flagsReg cr, iRegI op1, immI16 op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8331
  match(Set cr (CmpI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8332
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8333
  format %{ "CHI     $op1,$op2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8334
  opcode(CHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8335
  ins_encode(z_riform_signed(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8336
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8337
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8338
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8339
instruct compI_reg_imm0(flagsReg cr, iRegI op1, immI_0 zero) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8340
  match(Set cr (CmpI op1 zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8341
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8342
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8343
  format %{ "LTR     $op1,$op1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8344
  opcode(LTR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8345
  ins_encode(z_rrform(op1, op1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8346
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8347
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8348
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8349
instruct compI_reg_mem(flagsReg cr, iRegI op1, memory op2)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8350
  match(Set cr (CmpI op1 (LoadI op2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8351
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8352
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8353
  format %{ "C(Y)    $op1, $op2\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8354
  opcode(CY_ZOPC, C_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8355
  ins_encode(z_form_rt_mem_opt(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8356
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8357
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8358
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8359
// INT unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8360
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8361
instruct compU_reg_reg(flagsReg cr, iRegI op1, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8362
  match(Set cr (CmpU op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8363
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8364
  format %{ "CLR     $op1,$op2\t # unsigned" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8365
  opcode(CLR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8366
  ins_encode(z_rrform(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8367
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8368
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8369
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8370
instruct compU_reg_uimm(flagsReg cr, iRegI op1, uimmI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8371
  match(Set cr (CmpU op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8372
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8373
  format %{ "CLFI    $op1,$op2\t # unsigned" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8374
  opcode(CLFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8375
  ins_encode(z_rilform_unsigned(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8376
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8377
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8378
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8379
instruct compU_reg_imm0(flagsReg cr, iRegI op1, immI_0 zero) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8380
  match(Set cr (CmpU op1 zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8381
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8382
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8383
  format %{ "LTR     $op1,$op1\t # unsigned" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8384
  opcode(LTR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8385
  ins_encode(z_rrform(op1, op1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8386
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8387
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8388
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8389
instruct compU_reg_mem(flagsReg cr, iRegI op1, memory op2)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8390
  match(Set cr (CmpU op1 (LoadI op2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8391
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8392
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8393
  format %{ "CL(Y)   $op1, $op2\t # unsigned" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8394
  opcode(CLY_ZOPC, CL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8395
  ins_encode(z_form_rt_mem_opt(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8396
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8397
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8398
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8399
// LONG signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8400
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8401
instruct compL_reg_reg(flagsReg cr, iRegL op1, iRegL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8402
  match(Set cr (CmpL op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8403
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8404
  format %{ "CGR     $op1,$op2\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8405
  opcode(CGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8406
  ins_encode(z_rreform(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8407
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8408
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8409
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8410
instruct compL_reg_regI(flagsReg cr, iRegL op1, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8411
  match(Set cr (CmpL op1 (ConvI2L op2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8412
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8413
  format %{ "CGFR    $op1,$op2\t # long/int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8414
  opcode(CGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8415
  ins_encode(z_rreform(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8416
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8417
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8418
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8419
instruct compL_reg_imm32(flagsReg cr, iRegL op1, immL32 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8420
  match(Set cr (CmpL op1 con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8421
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8422
  format %{ "CGFI    $op1,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8423
  opcode(CGFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8424
  ins_encode(z_rilform_signed(op1, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8425
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8426
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8427
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8428
instruct compL_reg_imm16(flagsReg cr, iRegL op1, immL16 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8429
  match(Set cr (CmpL op1 con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8430
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8431
  format %{ "CGHI    $op1,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8432
  opcode(CGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8433
  ins_encode(z_riform_signed(op1, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8434
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8435
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8436
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8437
instruct compL_reg_imm0(flagsReg cr, iRegL op1, immL_0 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8438
  match(Set cr (CmpL op1 con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8439
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8440
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8441
  format %{ "LTGR    $op1,$op1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8442
  opcode(LTGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8443
  ins_encode(z_rreform(op1, op1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8444
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8445
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8446
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8447
instruct compL_conv_reg_imm0(flagsReg cr, iRegI op1, immL_0 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8448
  match(Set cr (CmpL (ConvI2L op1) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8449
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8450
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8451
  format %{ "LTGFR    $op1,$op1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8452
  opcode(LTGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8453
  ins_encode(z_rreform(op1, op1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8454
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8455
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8456
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8457
instruct compL_reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8458
  match(Set cr (CmpL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8459
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8460
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8461
  format %{ "CG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8462
  opcode(CG_ZOPC, CG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8463
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8464
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8465
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8466
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8467
instruct compL_reg_memI(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8468
  match(Set cr (CmpL dst (ConvI2L (LoadI src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8469
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8470
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8471
  format %{ "CGF     $dst, $src\t # long/int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8472
  opcode(CGF_ZOPC, CGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8473
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8474
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8475
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8476
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8477
//  LONG unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8478
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8479
//  PTR unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8480
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8481
instruct compP_reg_reg(flagsReg cr, iRegP_N2P op1, iRegP_N2P op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8482
  match(Set cr (CmpP op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8483
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8484
  format %{ "CLGR    $op1,$op2\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8485
  opcode(CLGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8486
  ins_encode(z_rreform(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8487
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8488
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8489
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8490
instruct compP_reg_imm0(flagsReg cr, iRegP_N2P op1, immP0 op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8491
  match(Set cr (CmpP op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8492
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8493
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8494
  format %{ "LTGR    $op1, $op1\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8495
  opcode(LTGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8496
  ins_encode(z_rreform(op1, op1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8497
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8498
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8499
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8500
// Don't use LTGFR which performs sign extend.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8501
instruct compP_decode_reg_imm0(flagsReg cr, iRegN op1, immP0 op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8502
  match(Set cr (CmpP (DecodeN op1) op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8503
  predicate(Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8504
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8505
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8506
  format %{ "LTR    $op1, $op1\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8507
  opcode(LTR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8508
  ins_encode(z_rrform(op1, op1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8509
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8510
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8511
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8512
instruct compP_reg_mem(iRegP dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8513
  match(Set cr (CmpP dst (LoadP src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8514
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8515
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8516
  format %{ "CLG     $dst, $src\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8517
  opcode(CLG_ZOPC, CLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8518
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8519
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8520
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8521
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8522
//----------Max and Min--------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8523
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8524
// Max Register with Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8525
instruct z196_minI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8526
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8527
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8528
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8529
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8530
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8531
  format %{ "MinI $dst $src1,$src2\t MinI (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8532
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8533
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8534
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8535
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8536
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8537
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8538
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8539
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8540
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8541
    } else if (Rdst == Rsrc1) {   // Rdst preset with src1.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8542
      __ z_cr(Rsrc1, Rsrc2);      // Move src2 only if src1 is NotLow.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8543
      __ z_locr(Rdst, Rsrc2, Assembler::bcondNotLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8544
    } else if (Rdst == Rsrc2) {   // Rdst preset with src2.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8545
      __ z_cr(Rsrc2, Rsrc1);      // Move src1 only if src2 is NotLow.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8546
      __ z_locr(Rdst, Rsrc1, Assembler::bcondNotLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8547
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8548
      // Rdst is disjoint from operands, move in either case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8549
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8550
      __ z_locr(Rdst, Rsrc2, Assembler::bcondNotLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8551
      __ z_locr(Rdst, Rsrc1, Assembler::bcondLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8552
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8553
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8554
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8555
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8556
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8557
// Min Register with Register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8558
instruct z10_minI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8559
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8560
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8561
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8562
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8563
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8564
  format %{ "MinI $dst $src1,$src2\t MinI (z10 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8565
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8566
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8567
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8568
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8569
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8570
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8571
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8572
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8573
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8574
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8575
    } else if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8576
      __ z_crj(Rsrc1, Rsrc2, Assembler::bcondLow, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8577
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8578
    } else if (Rdst == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8579
      __ z_crj(Rsrc2, Rsrc1, Assembler::bcondLow, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8580
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8581
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8582
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8583
      __ z_crj(Rsrc1, Rsrc2, Assembler::bcondLow, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8584
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8585
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8586
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8587
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8588
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8589
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8590
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8591
instruct minI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8592
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8593
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8594
  predicate(!VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8595
  ins_cost(3 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8596
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8597
  format %{ "MinI $dst $src1,$src2\t MinI" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8598
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8599
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8600
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8601
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8602
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8603
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8604
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8605
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8606
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8607
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8608
    } else if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8609
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8610
      __ z_brl(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8611
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8612
    } else if (Rdst == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8613
      __ z_cr(Rsrc2, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8614
      __ z_brl(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8615
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8616
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8617
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8618
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8619
      __ z_brl(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8620
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8621
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8622
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8623
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8624
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8625
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8626
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8627
instruct z196_minI_reg_imm32(iRegI dst, iRegI src1, immI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8628
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8629
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8630
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8631
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8632
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8633
  format %{ "MinI $dst $src1,$src2\t MinI const32 (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8634
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8635
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8636
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8637
    int      Isrc2 = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8638
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8639
    if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8640
      __ load_const_optimized(Z_R0_scratch, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8641
      __ z_cfi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8642
      __ z_locr(Rdst, Z_R0_scratch, Assembler::bcondNotLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8643
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8644
      __ load_const_optimized(Rdst, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8645
      __ z_cfi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8646
      __ z_locr(Rdst, Rsrc1, Assembler::bcondLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8647
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8648
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8649
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8650
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8651
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8652
instruct minI_reg_imm32(iRegI dst, iRegI src1, immI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8653
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8654
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8655
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8656
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8657
  format %{ "MinI $dst $src1,$src2\t MinI const32" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8658
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8659
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8660
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8661
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8662
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8663
    __ z_cfi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8664
    __ z_brl(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8665
    __ z_lgfi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8666
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8667
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8668
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8669
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8670
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8671
instruct z196_minI_reg_imm16(iRegI dst, iRegI src1, immI16 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8672
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8673
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8674
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8675
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8676
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8677
  format %{ "MinI $dst $src1,$src2\t MinI const16 (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8678
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8679
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8680
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8681
    int      Isrc2 = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8682
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8683
    if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8684
      __ load_const_optimized(Z_R0_scratch, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8685
      __ z_chi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8686
      __ z_locr(Rdst, Z_R0_scratch, Assembler::bcondNotLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8687
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8688
      __ load_const_optimized(Rdst, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8689
      __ z_chi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8690
      __ z_locr(Rdst, Rsrc1, Assembler::bcondLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8691
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8692
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8693
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8694
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8695
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8696
instruct minI_reg_imm16(iRegI dst, iRegI src1, immI16 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8697
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8698
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8699
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8700
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8701
  format %{ "MinI $dst $src1,$src2\t MinI const16" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8702
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8703
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8704
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8705
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8706
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8707
    __ z_chi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8708
    __ z_brl(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8709
    __ z_lghi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8710
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8711
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8712
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8713
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8714
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8715
instruct z10_minI_reg_imm8(iRegI dst, iRegI src1, immI8 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8716
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8717
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8718
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8719
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8720
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8721
  format %{ "MinI $dst $src1,$src2\t MinI const8 (z10 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8722
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8723
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8724
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8725
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8726
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8727
    __ z_cij($src1$$Register, $src2$$constant, Assembler::bcondLow, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8728
    __ z_lghi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8729
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8730
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8731
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8732
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8733
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8734
// Max Register with Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8735
instruct z196_maxI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8736
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8737
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8738
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8739
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8740
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8741
  format %{ "MaxI $dst $src1,$src2\t MaxI (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8742
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8743
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8744
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8745
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8746
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8747
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8748
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8749
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8750
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8751
    } else if (Rdst == Rsrc1) { // Rdst preset with src1.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8752
      __ z_cr(Rsrc1, Rsrc2);    // Move src2 only if src1 is NotHigh.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8753
      __ z_locr(Rdst, Rsrc2, Assembler::bcondNotHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8754
    } else if (Rdst == Rsrc2) { // Rdst preset with src2.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8755
      __ z_cr(Rsrc2, Rsrc1);    // Move src1 only if src2 is NotHigh.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8756
      __ z_locr(Rdst, Rsrc1, Assembler::bcondNotHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8757
    } else {                    // Rdst is disjoint from operands, move in either case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8758
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8759
      __ z_locr(Rdst, Rsrc2, Assembler::bcondNotHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8760
      __ z_locr(Rdst, Rsrc1, Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8761
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8762
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8763
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8764
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8765
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8766
// Max Register with Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8767
instruct z10_maxI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8768
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8769
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8770
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8771
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8772
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8773
  format %{ "MaxI $dst $src1,$src2\t MaxI (z10 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8774
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8775
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8776
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8777
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8778
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8779
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8780
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8781
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8782
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8783
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8784
    } else if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8785
      __ z_crj(Rsrc1, Rsrc2, Assembler::bcondHigh, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8786
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8787
    } else if (Rdst == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8788
      __ z_crj(Rsrc2, Rsrc1, Assembler::bcondHigh, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8789
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8790
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8791
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8792
      __ z_crj(Rsrc1, Rsrc2, Assembler::bcondHigh, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8793
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8794
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8795
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8796
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8797
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8798
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8799
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8800
instruct maxI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8801
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8802
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8803
  predicate(!VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8804
  ins_cost(3 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8805
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8806
  format %{ "MaxI $dst $src1,$src2\t MaxI" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8807
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8808
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8809
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8810
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8811
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8812
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8813
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8814
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8815
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8816
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8817
    } else if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8818
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8819
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8820
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8821
    } else if (Rdst == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8822
      __ z_cr(Rsrc2, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8823
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8824
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8825
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8826
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8827
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8828
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8829
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8830
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8831
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8832
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8833
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8834
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8835
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8836
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8837
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8838
instruct z196_maxI_reg_imm32(iRegI dst, iRegI src1, immI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8839
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8840
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8841
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8842
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8843
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8844
  format %{ "MaxI $dst $src1,$src2\t MaxI const32 (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8845
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8846
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8847
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8848
    int      Isrc2 = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8849
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8850
    if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8851
      __ load_const_optimized(Z_R0_scratch, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8852
      __ z_cfi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8853
      __ z_locr(Rdst, Z_R0_scratch, Assembler::bcondNotHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8854
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8855
      __ load_const_optimized(Rdst, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8856
      __ z_cfi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8857
      __ z_locr(Rdst, Rsrc1, Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8858
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8859
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8860
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8861
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8862
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8863
instruct maxI_reg_imm32(iRegI dst, iRegI src1, immI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8864
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8865
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8866
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8867
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8868
  format %{ "MaxI $dst $src1,$src2\t MaxI const32" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8869
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8870
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8871
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8872
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8873
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8874
    __ z_cfi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8875
    __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8876
    __ z_lgfi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8877
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8878
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8879
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8880
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8881
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8882
instruct z196_maxI_reg_imm16(iRegI dst, iRegI src1, immI16 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8883
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8884
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8885
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8886
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8887
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8888
  format %{ "MaxI $dst $src1,$src2\t MaxI const16 (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8889
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8890
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8891
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8892
    int      Isrc2 = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8893
    if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8894
      __ load_const_optimized(Z_R0_scratch, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8895
      __ z_chi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8896
      __ z_locr(Rdst, Z_R0_scratch, Assembler::bcondNotHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8897
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8898
      __ load_const_optimized(Rdst, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8899
      __ z_chi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8900
      __ z_locr(Rdst, Rsrc1, Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8901
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8902
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8903
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8904
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8905
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8906
instruct maxI_reg_imm16(iRegI dst, iRegI src1, immI16 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8907
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8908
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8909
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8910
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8911
  format %{ "MaxI $dst $src1,$src2\t MaxI const16" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8912
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8913
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8914
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8915
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8916
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8917
    __ z_chi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8918
    __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8919
    __ z_lghi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8920
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8921
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8922
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8923
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8924
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8925
instruct z10_maxI_reg_imm8(iRegI dst, iRegI src1, immI8 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8926
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8927
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8928
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8929
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8930
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8931
  format %{ "MaxI $dst $src1,$src2\t MaxI const8" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8932
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8933
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8934
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8935
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8936
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8937
    __ z_cij($src1$$Register, $src2$$constant, Assembler::bcondHigh, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8938
    __ z_lghi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8939
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8940
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8941
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8942
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8943
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8944
//----------Abs---------------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8945
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8946
instruct absI_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8947
  match(Set dst (AbsI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8948
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8949
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8950
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8951
  format %{ "LPR     $dst, $src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8952
  opcode(LPR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8953
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8954
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8955
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8956
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8957
instruct negabsI_reg(iRegI dst, iRegI src, immI_0 zero, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8958
  match(Set dst (SubI zero (AbsI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8959
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8960
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8961
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8962
  format %{ "LNR     $dst, $src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8963
  opcode(LNR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8964
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8965
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8966
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8967
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8968
//----------Float Compares----------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8969
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8970
// Compare floating, generate condition code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8971
instruct cmpF_cc(flagsReg cr, regF src1, regF src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8972
  match(Set cr (CmpF src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8973
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8974
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8975
  format %{ "FCMPcc   $src1,$src2\t # float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8976
  ins_encode %{ __ z_cebr($src1$$FloatRegister, $src2$$FloatRegister); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8977
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8978
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8979
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8980
instruct cmpD_cc(flagsReg cr, regD src1, regD src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8981
  match(Set cr (CmpD src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8982
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8983
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8984
  format %{ "FCMPcc   $src1,$src2 \t # double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8985
  ins_encode %{ __ z_cdbr($src1$$FloatRegister, $src2$$FloatRegister); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8986
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8987
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8988
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8989
instruct cmpF_cc_mem(flagsReg cr, regF src1, memoryRX src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8990
  match(Set cr (CmpF src1 (LoadF src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8991
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8992
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8993
  format %{ "FCMPcc_mem $src1,$src2\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8994
  opcode(CEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8995
  ins_encode(z_form_rt_memFP(src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8996
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8997
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8998
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8999
instruct cmpD_cc_mem(flagsReg cr, regD src1, memoryRX src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9000
  match(Set cr (CmpD src1 (LoadD src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9001
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9002
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9003
  format %{ "DCMPcc_mem $src1,$src2\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9004
  opcode(CDB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9005
  ins_encode(z_form_rt_memFP(src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9006
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9007
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9008
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9009
// Compare floating, generate condition code
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9010
instruct cmpF0_cc(flagsReg cr, regF src1, immFpm0 src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9011
  match(Set cr (CmpF src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9012
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9013
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9014
  format %{ "LTEBR    $src1,$src1\t # float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9015
  opcode(LTEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9016
  ins_encode(z_rreform(src1, src1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9017
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9018
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9019
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9020
instruct cmpD0_cc(flagsReg cr, regD src1, immDpm0 src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9021
  match(Set cr (CmpD src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9022
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9023
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9024
  format %{ "LTDBR    $src1,$src1 \t # double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9025
  opcode(LTDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9026
  ins_encode(z_rreform(src1, src1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9027
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9028
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9029
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9030
// Compare floating, generate -1,0,1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9031
instruct cmpF_reg(iRegI dst, regF src1, regF src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9032
  match(Set dst (CmpF3 src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9033
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9034
  ins_cost(DEFAULT_COST * 5 + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9035
  size(24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9036
  format %{ "CmpF3    $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9037
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9038
    // compare registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9039
    __ z_cebr($src1$$FloatRegister, $src2$$FloatRegister);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9040
    // Convert condition code into -1,0,1, where
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9041
    // -1 means unordered or less
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9042
    //  0 means equal
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9043
    //  1 means greater.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9044
    if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9045
      Register one       = Z_R0_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9046
      Register minus_one = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9047
      __ z_lghi(minus_one, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9048
      __ z_lghi(one, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9049
      __ z_lghi( $dst$$Register, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9050
      __ z_locgr($dst$$Register, one,       Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9051
      __ z_locgr($dst$$Register, minus_one, Assembler::bcondLowOrNotOrdered);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9052
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9053
      Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9054
      __ clear_reg($dst$$Register, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9055
      __ z_bre(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9056
      __ z_lhi($dst$$Register, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9057
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9058
      __ z_lhi($dst$$Register, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9059
      __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9060
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9061
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9062
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9063
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9064
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9065
instruct cmpD_reg(iRegI dst, regD src1, regD src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9066
  match(Set dst (CmpD3 src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9067
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9068
  ins_cost(DEFAULT_COST * 5 + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9069
  size(24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9070
  format %{ "CmpD3    $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9071
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9072
    // compare registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9073
    __ z_cdbr($src1$$FloatRegister, $src2$$FloatRegister);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9074
    // Convert condition code into -1,0,1, where
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9075
    // -1 means unordered or less
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9076
    //  0 means equal
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9077
    //  1 means greater.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9078
    if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9079
      Register one       = Z_R0_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9080
      Register minus_one = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9081
      __ z_lghi(minus_one, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9082
      __ z_lghi(one, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9083
      __ z_lghi( $dst$$Register, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9084
      __ z_locgr($dst$$Register, one,       Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9085
      __ z_locgr($dst$$Register, minus_one, Assembler::bcondLowOrNotOrdered);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9086
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9087
      Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9088
      // indicate unused result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9089
      (void) __ clear_reg($dst$$Register, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9090
      __ z_bre(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9091
      __ z_lhi($dst$$Register, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9092
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9093
      __ z_lhi($dst$$Register, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9094
      __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9095
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9096
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9097
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9098
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9099
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9100
//----------Branches---------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9101
// Jump
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9102
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9103
// Direct Branch.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9104
instruct branch(label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9105
  match(Goto);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9106
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9107
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9108
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9109
  format %{ "BRU     $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9110
  ins_encode(z_enc_bru(labl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9111
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9112
  // If set to 1 this indicates that the current instruction is a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9113
  // short variant of a long branch. This avoids using this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9114
  // instruction in first-pass matching. It will then only be used in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9115
  // the `Shorten_branches' pass.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9116
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9117
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9118
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9119
// Direct Branch.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9120
instruct branchFar(label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9121
  match(Goto);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9122
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9123
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9124
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9125
  format %{ "BRUL   $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9126
  ins_encode(z_enc_brul(labl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9127
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9128
  // This is not a short variant of a branch, but the long variant.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9129
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9130
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9131
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9132
// Conditional Near Branch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9133
instruct branchCon(cmpOp cmp, flagsReg cr, label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9134
  // Same match rule as `branchConFar'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9135
  match(If cmp cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9136
  effect(USE lbl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9137
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9138
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9139
  format %{ "branch_con_short,$cmp   $cr, $lbl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9140
  ins_encode(z_enc_branch_con_short(cmp, lbl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9141
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9142
  // If set to 1 this indicates that the current instruction is a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9143
  // short variant of a long branch. This avoids using this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9144
  // instruction in first-pass matching. It will then only be used in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9145
  // the `Shorten_branches' pass.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9146
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9147
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9148
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9149
// This is for cases when the z/Architecture conditional branch instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9150
// does not reach far enough. So we emit a far branch here, which is
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9151
// more expensive.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9152
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9153
// Conditional Far Branch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9154
instruct branchConFar(cmpOp cmp, flagsReg cr, label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9155
  // Same match rule as `branchCon'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9156
  match(If cmp cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9157
  effect(USE cr, USE lbl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9158
  // Make more expensive to prefer compare_and_branch over separate instructions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9159
  ins_cost(2 * BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9160
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9161
  format %{ "branch_con_far,$cmp   $cr, $lbl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9162
  ins_encode(z_enc_branch_con_far(cmp, lbl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9163
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9164
  // This is not a short variant of a branch, but the long variant..
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9165
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9166
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9167
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9168
instruct branchLoopEnd(cmpOp cmp, flagsReg cr, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9169
  match(CountedLoopEnd cmp cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9170
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9171
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9172
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9173
  format %{ "branch_con_short,$cmp   $labl\t # counted loop end" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9174
  ins_encode(z_enc_branch_con_short(cmp, labl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9175
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9176
  // If set to 1 this indicates that the current instruction is a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9177
  // short variant of a long branch. This avoids using this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9178
  // instruction in first-pass matching. It will then only be used in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9179
  // the `Shorten_branches' pass.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9180
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9181
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9182
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9183
instruct branchLoopEndFar(cmpOp cmp, flagsReg cr, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9184
  match(CountedLoopEnd cmp cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9185
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9186
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9187
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9188
  format %{ "branch_con_far,$cmp   $labl\t # counted loop end" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9189
  ins_encode(z_enc_branch_con_far(cmp, labl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9190
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9191
  // This is not a short variant of a branch, but the long variant.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9192
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9193
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9194
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9195
//----------Compare and Branch (short distance)------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9197
// INT REG operands for loop counter processing.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9198
instruct testAndBranchLoopEnd_Reg(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9199
  match(CountedLoopEnd boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9200
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9201
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9202
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9203
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9204
  format %{ "test_and_branch_loop_end,$boolnode  $src1,$src2,$labl\t # counted loop end SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9205
  opcode(CRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9206
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9207
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9208
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9209
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9210
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9211
// INT REG operands.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9212
instruct cmpb_RegI(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9213
  match(If boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9214
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9215
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9216
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9217
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9218
  format %{ "CRJ,$boolnode  $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9219
  opcode(CRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9220
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9221
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9222
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9223
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9224
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9225
// Unsigned INT REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9226
instruct cmpbU_RegI(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9227
  match(If boolnode (CmpU src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9228
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9229
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9230
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9231
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9232
  format %{ "CLRJ,$boolnode  $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9233
  opcode(CLRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9234
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9235
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9236
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9237
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9238
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9239
// LONG REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9240
instruct cmpb_RegL(cmpOpT boolnode, iRegL src1, iRegL src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9241
  match(If boolnode (CmpL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9242
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9243
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9244
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9245
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9246
  format %{ "CGRJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9247
  opcode(CGRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9248
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9249
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9250
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9251
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9252
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9253
//  PTR REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9254
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9255
// Separate rules for regular and narrow oops.  ADLC can't recognize
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9256
// rules with polymorphic operands to be sisters -> shorten_branches
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9257
// will not shorten.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9258
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9259
instruct cmpb_RegPP(cmpOpT boolnode, iRegP src1, iRegP src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9260
  match(If boolnode (CmpP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9261
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9262
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9263
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9264
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9265
  format %{ "CLGRJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9266
  opcode(CLGRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9267
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9268
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9269
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9270
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9271
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9272
instruct cmpb_RegNN(cmpOpT boolnode, iRegN src1, iRegN src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9273
  match(If boolnode (CmpP (DecodeN src1) (DecodeN src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9274
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9275
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9276
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9277
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9278
  format %{ "CLGRJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9279
  opcode(CLGRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9280
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9281
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9282
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9283
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9284
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9285
// INT REG/IMM operands for loop counter processing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9286
instruct testAndBranchLoopEnd_Imm(cmpOpT boolnode, iRegI src1, immI8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9287
  match(CountedLoopEnd boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9288
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9289
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9290
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9291
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9292
  format %{ "test_and_branch_loop_end,$boolnode  $src1,$src2,$labl\t # counted loop end SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9293
  opcode(CIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9294
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9295
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9296
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9297
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9298
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9299
// INT REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9300
instruct cmpb_RegI_imm(cmpOpT boolnode, iRegI src1, immI8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9301
  match(If boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9302
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9303
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9304
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9305
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9306
  format %{ "CIJ,$boolnode  $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9307
  opcode(CIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9308
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9309
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9310
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9311
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9312
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9313
// INT REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9314
instruct cmpbU_RegI_imm(cmpOpT boolnode, iRegI src1, uimmI8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9315
  match(If boolnode (CmpU src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9316
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9317
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9318
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9319
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9320
  format %{ "CLIJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9321
  opcode(CLIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9322
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9323
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9324
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9325
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9326
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9327
// LONG REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9328
instruct cmpb_RegL_imm(cmpOpT boolnode, iRegL src1, immL8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9329
  match(If boolnode (CmpL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9330
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9331
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9332
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9333
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9334
  format %{ "CGIJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9335
  opcode(CGIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9336
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9337
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9338
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9339
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9340
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9341
// PTR REG-imm operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9342
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9343
// Separate rules for regular and narrow oops. ADLC can't recognize
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9344
// rules with polymorphic operands to be sisters -> shorten_branches
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9345
// will not shorten.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9346
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9347
instruct cmpb_RegP_immP(cmpOpT boolnode, iRegP src1, immP8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9348
  match(If boolnode (CmpP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9349
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9350
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9351
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9352
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9353
  format %{ "CLGIJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9354
  opcode(CLGIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9355
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9356
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9357
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9358
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9359
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9360
// Compare against zero only, do not mix N and P oops (encode/decode required).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9361
instruct cmpb_RegN_immP0(cmpOpT boolnode, iRegN src1, immP0 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9362
  match(If boolnode (CmpP (DecodeN src1) src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9363
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9364
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9365
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9366
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9367
  format %{ "CLGIJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9368
  opcode(CLGIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9369
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9370
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9371
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9372
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9373
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9374
instruct cmpb_RegN_imm(cmpOpT boolnode, iRegN src1, immN8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9375
  match(If boolnode (CmpP (DecodeN src1) (DecodeN src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9376
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9377
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9378
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9379
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9380
  format %{ "CLGIJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9381
  opcode(CLGIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9382
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9383
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9384
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9385
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9386
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9387
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9388
//----------Compare and Branch (far distance)------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9389
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9390
// INT REG operands for loop counter processing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9391
instruct testAndBranchLoopEnd_RegFar(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9392
  match(CountedLoopEnd boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9393
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9394
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9395
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9396
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9397
  format %{ "test_and_branch_loop_end,$boolnode  $src1,$src2,$labl\t # counted loop end FAR" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9398
  opcode(CR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9399
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9400
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9401
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9402
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9403
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9404
// INT REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9405
instruct cmpb_RegI_Far(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9406
  match(If boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9407
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9408
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9409
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9410
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9411
  format %{ "CRJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9412
  opcode(CR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9413
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9414
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9415
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9416
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9417
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9418
// INT REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9419
instruct cmpbU_RegI_Far(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9420
  match(If boolnode (CmpU src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9421
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9422
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9423
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9424
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9425
  format %{ "CLRJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9426
  opcode(CLR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9427
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9428
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9429
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9430
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9431
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9432
// LONG REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9433
instruct cmpb_RegL_Far(cmpOpT boolnode, iRegL src1, iRegL src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9434
  match(If boolnode (CmpL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9435
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9436
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9437
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9438
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9439
  format %{ "CGRJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9440
  opcode(CGR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9441
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9442
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9443
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9444
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9445
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9446
// PTR REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9447
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9448
// Separate rules for regular and narrow oops. ADLC can't recognize
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9449
// rules with polymorphic operands to be sisters -> shorten_branches
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9450
// will not shorten.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9451
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9452
instruct cmpb_RegPP_Far(cmpOpT boolnode, iRegP src1, iRegP src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9453
  match(If boolnode (CmpP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9454
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9455
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9456
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9457
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9458
  format %{ "CLGRJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9459
  opcode(CLGR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9460
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9461
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9462
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9463
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9464
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9465
instruct cmpb_RegNN_Far(cmpOpT boolnode, iRegN src1, iRegN src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9466
  match(If boolnode (CmpP (DecodeN src1) (DecodeN src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9467
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9468
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9469
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9470
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9471
  format %{ "CLGRJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9472
  opcode(CLGR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9473
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9474
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9475
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9476
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9477
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9478
// INT REG/IMM operands for loop counter processing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9479
instruct testAndBranchLoopEnd_ImmFar(cmpOpT boolnode, iRegI src1, immI8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9480
  match(CountedLoopEnd boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9481
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9482
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9483
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9484
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9485
  format %{ "test_and_branch_loop_end,$boolnode  $src1,$src2,$labl\t # counted loop end FAR" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9486
  opcode(CHI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9487
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9488
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9489
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9490
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9491
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9492
// INT REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9493
instruct cmpb_RegI_imm_Far(cmpOpT boolnode, iRegI src1, immI8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9494
  match(If boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9495
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9496
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9497
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9498
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9499
  format %{ "CIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9500
  opcode(CHI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9501
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9502
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9503
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9504
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9505
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9506
// INT REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9507
instruct cmpbU_RegI_imm_Far(cmpOpT boolnode, iRegI src1, uimmI8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9508
  match(If boolnode (CmpU src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9509
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9510
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9511
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9512
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9513
  format %{ "CLIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9514
  opcode(CLFI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9515
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9516
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9517
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9518
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9519
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9520
// LONG REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9521
instruct cmpb_RegL_imm_Far(cmpOpT boolnode, iRegL src1, immL8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9522
  match(If boolnode (CmpL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9523
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9524
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9525
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9526
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9527
  format %{ "CGIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9528
  opcode(CGHI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9529
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9530
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9531
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9532
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9533
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9534
// PTR REG-imm operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9535
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9536
// Separate rules for regular and narrow oops. ADLC can't recognize
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9537
// rules with polymorphic operands to be sisters -> shorten_branches
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9538
// will not shorten.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9539
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9540
instruct cmpb_RegP_immP_Far(cmpOpT boolnode, iRegP src1, immP8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9541
  match(If boolnode (CmpP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9542
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9543
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9544
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9545
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9546
  format %{ "CLGIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9547
  opcode(CLGFI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9548
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9549
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9550
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9551
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9552
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9553
// Compare against zero only, do not mix N and P oops (encode/decode required).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9554
instruct cmpb_RegN_immP0_Far(cmpOpT boolnode, iRegN src1, immP0 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9555
  match(If boolnode (CmpP (DecodeN src1) src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9556
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9557
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9558
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9559
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9560
  format %{ "CLGIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9561
  opcode(CLGFI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9562
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9563
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9564
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9565
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9566
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9567
instruct cmpb_RegN_immN_Far(cmpOpT boolnode, iRegN src1, immN8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9568
  match(If boolnode (CmpP (DecodeN src1) (DecodeN src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9569
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9570
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9571
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9572
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9573
  format %{ "CLGIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9574
  opcode(CLGFI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9575
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9576
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9577
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9578
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9579
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9580
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9581
// Long Compare
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9582
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9583
// Due to a shortcoming in the ADLC, it mixes up expressions like:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9584
// (foo (CmpI (CmpL X Y) 0)) and (bar (CmpI (CmpL X 0L) 0)). Note the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9585
// difference between 'Y' and '0L'. The tree-matches for the CmpI sections
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9586
// are collapsed internally in the ADLC's dfa-gen code. The match for
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9587
// (CmpI (CmpL X Y) 0) is silently replaced with (CmpI (CmpL X 0L) 0) and the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9588
// foo match ends up with the wrong leaf. One fix is to not match both
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9589
// reg-reg and reg-zero forms of long-compare. This is unfortunate because
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9590
// both forms beat the trinary form of long-compare and both are very useful
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9591
// on platforms which have few registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9592
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9593
// Manifest a CmpL3 result in an integer register. Very painful.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9594
// This is the test to avoid.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9595
instruct cmpL3_reg_reg(iRegI dst, iRegL src1, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9596
  match(Set dst (CmpL3 src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9597
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9598
  ins_cost(DEFAULT_COST * 5 + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9599
  size(24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9600
  format %{ "CmpL3 $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9601
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9602
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9603
    // compare registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9604
    __ z_cgr($src1$$Register, $src2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9605
    // Convert condition code into -1,0,1, where
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9606
    // -1 means less
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9607
    //  0 means equal
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9608
    //  1 means greater.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9609
    if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9610
      Register one       = Z_R0_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9611
      Register minus_one = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9612
      __ z_lghi(minus_one, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9613
      __ z_lghi(one, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9614
      __ z_lghi( $dst$$Register, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9615
      __ z_locgr($dst$$Register, one,       Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9616
      __ z_locgr($dst$$Register, minus_one, Assembler::bcondLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9617
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9618
      __ clear_reg($dst$$Register, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9619
      __ z_bre(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9620
      __ z_lhi($dst$$Register, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9621
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9622
      __ z_lhi($dst$$Register, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9623
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9624
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9625
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9626
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9627
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9628
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9629
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9630
// Safepoint Instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9631
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9632
instruct safePoint() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9633
  match(SafePoint);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9634
  predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9635
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9636
  format %{ "UNIMPLEMENTED Safepoint_ " %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9637
  ins_encode(enc_unimplemented());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9638
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9639
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9640
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9641
instruct safePoint_poll(iRegP poll, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9642
  match(SafePoint poll);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9643
  effect(USE poll, KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9644
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9645
  format %{ "TM      #0[,$poll],#111\t # Safepoint: poll for GC" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9646
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9647
    // Mark the code position where the load from the safepoint
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9648
    // polling page was emitted as relocInfo::poll_type.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9649
    __ relocate(relocInfo::poll_type);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9650
    __ load_from_polling_page($poll$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9651
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9652
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9653
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9654
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9655
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9656
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9657
// Call Instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9658
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9659
// Call Java Static Instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9660
instruct CallStaticJavaDirect_dynTOC(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9661
  match(CallStaticJava);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9662
  effect(USE meth);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9663
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9664
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9665
  format %{ "CALL,static dynTOC $meth; ==> " %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9666
  ins_encode( z_enc_java_static_call(meth) );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9667
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9668
  ins_alignment(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9669
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9670
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9671
// Call Java Dynamic Instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9672
instruct CallDynamicJavaDirect_dynTOC(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9673
  match(CallDynamicJava);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9674
  effect(USE meth);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9675
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9676
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9677
  format %{ "CALL,dynamic dynTOC $meth; ==> " %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9678
  ins_encode(z_enc_java_dynamic_call(meth));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9679
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9680
  ins_alignment(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9681
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9682
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9683
// Call Runtime Instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9684
instruct CallRuntimeDirect(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9685
  match(CallRuntime);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9686
  effect(USE meth);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9687
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9688
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9689
  ins_num_consts(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9690
  ins_alignment(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9691
  format %{ "CALL,runtime" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9692
  ins_encode( z_enc_java_to_runtime_call(meth) );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9693
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9694
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9695
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9696
// Call runtime without safepoint - same as CallRuntime
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9697
instruct CallLeafDirect(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9698
  match(CallLeaf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9699
  effect(USE meth);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9700
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9701
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9702
  ins_num_consts(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9703
  ins_alignment(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9704
  format %{ "CALL,runtime leaf $meth" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9705
  ins_encode( z_enc_java_to_runtime_call(meth) );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9706
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9707
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9708
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9709
// Call runtime without safepoint - same as CallLeaf
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9710
instruct CallLeafNoFPDirect(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9711
  match(CallLeafNoFP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9712
  effect(USE meth);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9713
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9714
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9715
  ins_num_consts(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9716
  format %{ "CALL,runtime leaf nofp $meth" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9717
  ins_encode( z_enc_java_to_runtime_call(meth) );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9718
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9719
  ins_alignment(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9720
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9721
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9722
// Tail Call; Jump from runtime stub to Java code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9723
// Also known as an 'interprocedural jump'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9724
// Target of jump will eventually return to caller.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9725
// TailJump below removes the return address.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9726
instruct TailCalljmpInd(iRegP jump_target, inline_cache_regP method_oop) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9727
  match(TailCall jump_target method_oop);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9728
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9729
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9730
  format %{ "Jmp     $jump_target\t# $method_oop holds method oop" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9731
  ins_encode %{ __ z_br($jump_target$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9732
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9733
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9734
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9735
// Return Instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9736
instruct Ret() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9737
  match(Return);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9738
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9739
  format %{ "BR(Z_R14) // branch to link register" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9740
  ins_encode %{ __ z_br(Z_R14); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9741
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9742
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9743
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9744
// Tail Jump; remove the return address; jump to target.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9745
// TailCall above leaves the return address around.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9746
// TailJump is used in only one place, the rethrow_Java stub (fancy_jump=2).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9747
// ex_oop (Exception Oop) is needed in %o0 at the jump. As there would be a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9748
// "restore" before this instruction (in Epilogue), we need to materialize it
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9749
// in %i0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9750
instruct tailjmpInd(iRegP jump_target, rarg1RegP ex_oop) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9751
  match(TailJump jump_target ex_oop);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9752
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9753
  size(8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9754
  format %{ "TailJump $jump_target" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9755
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9756
    __ z_lg(Z_ARG2/* issuing pc */, _z_abi(return_pc), Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9757
    __ z_br($jump_target$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9758
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9759
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9760
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9761
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9762
// Create exception oop: created by stack-crawling runtime code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9763
// Created exception is now available to this handler, and is setup
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9764
// just prior to jumping to this handler. No code emitted.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9765
instruct CreateException(rarg1RegP ex_oop) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9766
  match(Set ex_oop (CreateEx));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9767
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9768
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9769
  format %{ "# exception oop; no code emitted" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9770
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9771
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9772
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9773
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9774
// Rethrow exception: The exception oop will come in the first
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9775
// argument position. Then JUMP (not call) to the rethrow stub code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9776
instruct RethrowException() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9777
  match(Rethrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9778
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9779
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9780
  format %{ "Jmp    rethrow_stub" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9781
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9782
    cbuf.set_insts_mark();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9783
    __ load_const_optimized(Z_R1_scratch, (address)OptoRuntime::rethrow_stub());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9784
    __ z_br(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9785
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9786
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9787
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9788
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9789
// Die now.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9790
instruct ShouldNotReachHere() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9791
  match(Halt);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9792
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9793
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9794
  format %{ "ILLTRAP; ShouldNotReachHere" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9795
  ins_encode %{ __ z_illtrap(); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9796
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9797
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9798
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9799
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9800
// The 2nd slow-half of a subtype check. Scan the subklass's 2ndary superklass
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9801
// array for an instance of the superklass. Set a hidden internal cache on a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9802
// hit (cache is checked with exposed code in gen_subtype_check()). Return
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9803
// not zero for a miss or zero for a hit. The encoding ALSO sets flags.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9804
instruct partialSubtypeCheck(rarg1RegP index, rarg2RegP sub, rarg3RegP super, flagsReg pcc,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9805
                             rarg4RegP scratch1, rarg5RegP scratch2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9806
  match(Set index (PartialSubtypeCheck sub super));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9807
  effect(KILL pcc, KILL scratch1, KILL scratch2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9808
  ins_cost(10 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9809
  size(12);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9810
  format %{ "  CALL   PartialSubtypeCheck\n" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9811
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9812
    AddressLiteral stub_address(StubRoutines::zarch::partial_subtype_check());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9813
    __ load_const_optimized(Z_ARG4, stub_address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9814
    __ z_basr(Z_R14, Z_ARG4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9815
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9816
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9817
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9818
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9819
instruct partialSubtypeCheck_vs_zero(flagsReg pcc, rarg2RegP sub, rarg3RegP super, immP0 zero,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9820
                                     rarg1RegP index, rarg4RegP scratch1, rarg5RegP scratch2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9821
  match(Set pcc (CmpI (PartialSubtypeCheck sub super) zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9822
  effect(KILL scratch1, KILL scratch2, KILL index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9823
  ins_cost(10 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9824
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9825
  format %{ "CALL   PartialSubtypeCheck_vs_zero\n" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9826
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9827
    AddressLiteral stub_address(StubRoutines::zarch::partial_subtype_check());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9828
    __ load_const_optimized(Z_ARG4, stub_address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9829
    __ z_basr(Z_R14, Z_ARG4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9830
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9831
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9832
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9833
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9834
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9835
// inlined locking and unlocking
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9836
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9837
instruct cmpFastLock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9838
  match(Set pcc (FastLock oop box));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9839
  effect(TEMP tmp1, TEMP tmp2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9840
  ins_cost(100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9841
  // TODO: s390 port size(VARIABLE_SIZE); // Uses load_const_optimized.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9842
  format %{ "FASTLOCK  $oop, $box; KILL Z_ARG4, Z_ARG5" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9843
  ins_encode %{ __ compiler_fast_lock_object($oop$$Register, $box$$Register, $tmp1$$Register, $tmp2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9844
                                             UseBiasedLocking && !UseOptoBiasInlining); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9845
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9846
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9847
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9848
instruct cmpFastUnlock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9849
  match(Set pcc (FastUnlock oop box));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9850
  effect(TEMP tmp1, TEMP tmp2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9851
  ins_cost(100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9852
  // TODO: s390 port size(FIXED_SIZE);  // emitted code depends on UseBiasedLocking being on/off.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9853
  format %{ "FASTUNLOCK  $oop, $box; KILL Z_ARG4, Z_ARG5" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9854
  ins_encode %{ __ compiler_fast_unlock_object($oop$$Register, $box$$Register, $tmp1$$Register, $tmp2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9855
                                               UseBiasedLocking && !UseOptoBiasInlining); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9856
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9857
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9858
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9859
instruct inlineCallClearArrayConst(SSlenDW cnt, iRegP_N2P base, Universe dummy, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9860
  match(Set dummy (ClearArray cnt base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9861
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9862
  ins_cost(100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9863
  // TODO: s390 port size(VARIABLE_SIZE);       // Variable in size due to varying #instructions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9864
  format %{ "ClearArrayConst $cnt,$base" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9865
  ins_encode %{ __ Clear_Array_Const($cnt$$constant, $base$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9866
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9867
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9868
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9869
instruct inlineCallClearArrayConstBig(immL cnt, iRegP_N2P base, Universe dummy, revenRegL srcA, roddRegL srcL, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9870
  match(Set dummy (ClearArray cnt base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9871
  effect(TEMP srcA, TEMP srcL, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9872
  ins_cost(200);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9873
  // TODO: s390 port size(VARIABLE_SIZE);       // Variable in size due to optimized constant loader.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9874
  format %{ "ClearArrayConstBig $cnt,$base" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9875
  ins_encode %{ __ Clear_Array_Const_Big($cnt$$constant, $base$$Register, $srcA$$Register, $srcL$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9876
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9877
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9878
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9879
instruct inlineCallClearArray(iRegL cnt, iRegP_N2P base, Universe dummy, revenRegL srcA, roddRegL srcL, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9880
  match(Set dummy (ClearArray cnt base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9881
  effect(TEMP srcA, TEMP srcL, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9882
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9883
  // TODO: s390 port size(FIXED_SIZE);  // z/Architecture: emitted code depends on PreferLAoverADD being on/off.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9884
  format %{ "ClearArrayVar $cnt,$base" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9885
  ins_encode %{ __ Clear_Array($cnt$$Register, $base$$Register, $srcA$$Register, $srcL$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9886
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9887
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9888
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9889
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9890
// CompactStrings
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9891
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9892
// String equals
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9893
instruct string_equalsL(iRegP str1, iRegP str2, iRegI cnt, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9894
  match(Set result (StrEquals (Binary str1 str2) cnt));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9895
  effect(TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9896
  predicate(((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9897
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9898
  format %{ "String Equals byte[] $str1,$str2,$cnt -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9899
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9900
    __ array_equals(false, $str1$$Register, $str2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9901
                    $cnt$$Register, $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9902
                    $result$$Register, true /* byte */);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9903
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9904
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9905
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9906
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9907
instruct string_equalsU(iRegP str1, iRegP str2, iRegI cnt, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9908
  match(Set result (StrEquals (Binary str1 str2) cnt));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9909
  effect(TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9910
  predicate(((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::UU || ((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9911
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9912
  format %{ "String Equals char[] $str1,$str2,$cnt -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9913
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9914
    __ array_equals(false, $str1$$Register, $str2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9915
                    $cnt$$Register, $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9916
                    $result$$Register, false /* byte */);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9917
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9918
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9919
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9920
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9921
instruct string_equals_imm(iRegP str1, iRegP str2, uimmI8 cnt, iRegI result, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9922
  match(Set result (StrEquals (Binary str1 str2) cnt));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9923
  effect(KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9924
  predicate(((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::LL || ((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::UU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9925
  ins_cost(100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9926
  format %{ "String Equals byte[] $str1,$str2,$cnt -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9927
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9928
    const int cnt_imm = $cnt$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9929
    if (cnt_imm) { __ z_clc(0, cnt_imm - 1, $str1$$Register, 0, $str2$$Register); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9930
    __ z_lhi($result$$Register, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9931
    if (cnt_imm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9932
      if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9933
        __ z_lhi(Z_R0_scratch, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9934
        __ z_locr($result$$Register, Z_R0_scratch, Assembler::bcondNotEqual);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9935
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9936
        Label Lskip;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9937
        __ z_bre(Lskip);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9938
        __ clear_reg($result$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9939
        __ bind(Lskip);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9940
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9941
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9942
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9943
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9944
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9945
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9946
instruct string_equalsC_imm(iRegP str1, iRegP str2, immI8 cnt, iRegI result, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9947
  match(Set result (StrEquals (Binary str1 str2) cnt));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9948
  effect(KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9949
  predicate(((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9950
  ins_cost(100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9951
  format %{ "String Equals $str1,$str2,$cnt -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9952
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9953
    const int cnt_imm = $cnt$$constant; // positive immI8 (7 bits used)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9954
    if (cnt_imm) { __ z_clc(0, (cnt_imm << 1) - 1, $str1$$Register, 0, $str2$$Register); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9955
    __ z_lhi($result$$Register, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9956
    if (cnt_imm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9957
      if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9958
        __ z_lhi(Z_R0_scratch, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9959
        __ z_locr($result$$Register, Z_R0_scratch, Assembler::bcondNotEqual);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9960
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9961
        Label Lskip;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9962
        __ z_bre(Lskip);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9963
        __ clear_reg($result$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9964
        __ bind(Lskip);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9965
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9966
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9967
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9968
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9969
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9970
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9971
// Array equals
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9972
instruct array_equalsB(iRegP ary1, iRegP ary2, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9973
  match(Set result (AryEq ary1 ary2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9974
  effect(TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9975
  predicate(((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9976
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9977
  format %{ "Array Equals $ary1,$ary2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9978
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9979
    __ array_equals(true, $ary1$$Register, $ary2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9980
                    noreg, $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9981
                    $result$$Register, true /* byte */);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9982
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9983
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9984
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9985
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9986
instruct array_equalsC(iRegP ary1, iRegP ary2, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9987
  match(Set result (AryEq ary1 ary2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9988
  effect(TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9989
  predicate(((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9990
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9991
  format %{ "Array Equals $ary1,$ary2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9992
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9993
    __ array_equals(true, $ary1$$Register, $ary2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9994
                    noreg, $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9995
                    $result$$Register, false /* byte */);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9996
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9997
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9998
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9999
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10000
// String CompareTo
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10001
instruct string_compareL(iRegP str1, iRegP str2, rarg2RegI cnt1, rarg5RegI cnt2, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10002
  match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10003
  effect(TEMP_DEF result, USE_KILL cnt1, USE_KILL cnt2, TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10004
  predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10005
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10006
  format %{ "String Compare byte[] $str1,$cnt1,$str2,$cnt2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10007
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10008
    __ string_compare($str1$$Register, $str2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10009
                      $cnt1$$Register, $cnt2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10010
                      $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10011
                      $result$$Register, StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10012
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10013
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10014
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10015
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10016
instruct string_compareU(iRegP str1, iRegP str2, rarg2RegI cnt1, rarg5RegI cnt2, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10017
  match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10018
  effect(TEMP_DEF result, USE_KILL cnt1, USE_KILL cnt2, TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10019
  predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU || ((StrCompNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10020
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10021
  format %{ "String Compare char[] $str1,$cnt1,$str2,$cnt2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10022
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10023
    __ string_compare($str1$$Register, $str2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10024
                      $cnt1$$Register, $cnt2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10025
                      $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10026
                      $result$$Register, StrIntrinsicNode::UU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10027
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10028
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10029
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10030
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10031
instruct string_compareLU(iRegP str1, iRegP str2, rarg2RegI cnt1, rarg5RegI cnt2, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10032
  match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10033
  effect(TEMP_DEF result, USE_KILL cnt1, USE_KILL cnt2, TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10034
  predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10035
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10036
  format %{ "String Compare byte[],char[] $str1,$cnt1,$str2,$cnt2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10037
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10038
    __ string_compare($str1$$Register, $str2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10039
                      $cnt1$$Register, $cnt2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10040
                      $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10041
                      $result$$Register, StrIntrinsicNode::LU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10042
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10043
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10044
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10045
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10046
instruct string_compareUL(iRegP str1, iRegP str2, rarg2RegI cnt1, rarg5RegI cnt2, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10047
  match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10048
  effect(TEMP_DEF result, USE_KILL cnt1, USE_KILL cnt2, TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10049
  predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10050
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10051
  format %{ "String Compare char[],byte[] $str1,$cnt1,$str2,$cnt2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10052
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10053
    __ string_compare($str2$$Register, $str1$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10054
                      $cnt2$$Register, $cnt1$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10055
                      $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10056
                      $result$$Register, StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10057
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10058
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10059
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10060
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10061
// String IndexOfChar
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10062
instruct indexOfChar_U(iRegP haystack, iRegI haycnt, iRegI ch, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10063
  match(Set result (StrIndexOfChar (Binary haystack haycnt) ch));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10064
  effect(TEMP_DEF result, TEMP evenReg, TEMP oddReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10065
  ins_cost(200);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10066
  format %{ "String IndexOfChar [0..$haycnt]($haystack), $ch -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10067
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10068
    __ string_indexof_char($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10069
                           $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10070
                           $ch$$Register, 0 /* unused, ch is in register */,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10071
                           $oddReg$$Register, $evenReg$$Register, false /*is_byte*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10072
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10073
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10074
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10075
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10076
instruct indexOf_imm1_U(iRegP haystack, iRegI haycnt, immP needle, immI_1 needlecnt, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10077
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10078
  effect(TEMP_DEF result, TEMP evenReg, TEMP oddReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10079
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU || ((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10080
  ins_cost(200);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10081
  format %{ "String IndexOf UL [0..$haycnt]($haystack), [0]($needle) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10082
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10083
    immPOper *needleOper = (immPOper *)$needle;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10084
    const TypeOopPtr *t = needleOper->type()->isa_oopptr();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10085
    ciTypeArray* needle_values = t->const_oop()->as_type_array();  // Pointer to live char *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10086
    jchar chr;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10087
#ifdef VM_LITTLE_ENDIAN
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10088
    Unimplemented();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10089
#else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10090
    chr = (((jchar)(unsigned char)needle_values->element_value(0).as_byte()) << 8) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10091
           ((jchar)(unsigned char)needle_values->element_value(1).as_byte());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10092
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10093
    __ string_indexof_char($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10094
                           $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10095
                           noreg, chr,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10096
                           $oddReg$$Register, $evenReg$$Register, false /*is_byte*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10097
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10098
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10099
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10100
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10101
instruct indexOf_imm1_L(iRegP haystack, iRegI haycnt, immP needle, immI_1 needlecnt, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10102
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10103
  effect(TEMP_DEF result, TEMP evenReg, TEMP oddReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10104
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10105
  ins_cost(200);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10106
  format %{ "String IndexOf L [0..$haycnt]($haystack), [0]($needle) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10107
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10108
    immPOper *needleOper = (immPOper *)$needle;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10109
    const TypeOopPtr *t = needleOper->type()->isa_oopptr();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10110
    ciTypeArray* needle_values = t->const_oop()->as_type_array();  // Pointer to live char *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10111
    jchar chr = (jchar)needle_values->element_value(0).as_byte();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10112
    __ string_indexof_char($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10113
                           $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10114
                           noreg, chr,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10115
                           $oddReg$$Register, $evenReg$$Register, true /*is_byte*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10116
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10117
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10118
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10119
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10120
instruct indexOf_imm1_UL(iRegP haystack, iRegI haycnt, immP needle, immI_1 needlecnt, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10121
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10122
  effect(TEMP_DEF result, TEMP evenReg, TEMP oddReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10123
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10124
  ins_cost(200);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10125
  format %{ "String IndexOf UL [0..$haycnt]($haystack), [0]($needle) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10126
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10127
    immPOper *needleOper = (immPOper *)$needle;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10128
    const TypeOopPtr *t = needleOper->type()->isa_oopptr();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10129
    ciTypeArray* needle_values = t->const_oop()->as_type_array();  // Pointer to live char *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10130
    jchar chr = (jchar)needle_values->element_value(0).as_byte();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10131
    __ string_indexof_char($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10132
                           $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10133
                           noreg, chr,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10134
                           $oddReg$$Register, $evenReg$$Register, false /*is_byte*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10135
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10136
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10137
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10138
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10139
// String IndexOf
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10140
instruct indexOf_imm_U(iRegP haystack, rarg2RegI haycnt, iRegP needle, immI16 needlecntImm, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10141
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecntImm)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10142
  effect(TEMP_DEF result, USE_KILL haycnt, TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10143
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU || ((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10144
  ins_cost(250);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10145
  format %{ "String IndexOf U [0..$needlecntImm]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10146
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10147
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10148
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10149
                      $needle$$Register, noreg, $needlecntImm$$constant,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10150
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::UU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10151
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10152
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10153
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10154
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10155
instruct indexOf_imm_L(iRegP haystack, rarg2RegI haycnt, iRegP needle, immI16 needlecntImm, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10156
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecntImm)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10157
  effect(TEMP_DEF result, USE_KILL haycnt, TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10158
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10159
  ins_cost(250);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10160
  format %{ "String IndexOf L [0..$needlecntImm]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10161
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10162
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10163
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10164
                      $needle$$Register, noreg, $needlecntImm$$constant,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10165
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10166
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10167
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10168
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10169
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10170
instruct indexOf_imm_UL(iRegP haystack, rarg2RegI haycnt, iRegP needle, immI16 needlecntImm, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10171
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecntImm)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10172
  effect(TEMP_DEF result, USE_KILL haycnt, TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10173
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10174
  ins_cost(250);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10175
  format %{ "String IndexOf UL [0..$needlecntImm]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10176
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10177
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10178
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10179
                      $needle$$Register, noreg, $needlecntImm$$constant,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10180
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10181
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10182
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10183
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10184
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10185
instruct indexOf_U(iRegP haystack, rarg2RegI haycnt, iRegP needle, rarg5RegI needlecnt, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10186
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10187
  effect(TEMP_DEF result, USE_KILL haycnt, USE_KILL needlecnt, TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10188
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU || ((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10189
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10190
  format %{ "String IndexOf U [0..$needlecnt]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10191
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10192
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10193
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10194
                      $needle$$Register, $needlecnt$$Register, 0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10195
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::UU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10196
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10197
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10198
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10199
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10200
instruct indexOf_L(iRegP haystack, rarg2RegI haycnt, iRegP needle, rarg5RegI needlecnt, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10201
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10202
  effect(TEMP_DEF result, USE_KILL haycnt, USE_KILL needlecnt, TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10203
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10204
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10205
  format %{ "String IndexOf L [0..$needlecnt]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10206
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10207
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10208
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10209
                      $needle$$Register, $needlecnt$$Register, 0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10210
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10211
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10212
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10213
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10214
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10215
instruct indexOf_UL(iRegP haystack, rarg2RegI haycnt, iRegP needle, rarg5RegI needlecnt, iRegI result, roddRegL oddReg, revenRegL evenReg, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10216
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10217
  effect(TEMP_DEF result, USE_KILL haycnt, USE_KILL needlecnt, TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10218
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10219
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10220
  format %{ "String IndexOf UL [0..$needlecnt]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10221
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10222
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10223
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10224
                      $needle$$Register, $needlecnt$$Register, 0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10225
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10226
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10227
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10228
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10229
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10230
// char[] to byte[] compression
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10231
instruct string_compress(iRegP src, rarg5RegP dst, iRegI result, roddRegI len, revenRegI evenReg, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10232
  match(Set result (StrCompressedCopy src (Binary dst len)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10233
  effect(TEMP_DEF result, USE_KILL dst, USE_KILL len, TEMP evenReg, TEMP tmp, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10234
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10235
  format %{ "String Compress $src->$dst($len) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10236
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10237
    __ string_compress($result$$Register, $src$$Register, $dst$$Register, $len$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10238
                       $evenReg$$Register, $tmp$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10239
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10240
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10241
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10242
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10243
// byte[] to char[] inflation. trot implementation is shorter, but slower than the unrolled icm(h) loop.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10244
//instruct string_inflate_trot(Universe dummy, iRegP src, revenRegP dst, roddRegI len, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10245
//  match(Set dummy (StrInflatedCopy src (Binary dst len)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10246
//  effect(USE_KILL dst, USE_KILL len, TEMP tmp, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10247
//  predicate(VM_Version::has_ETF2Enhancements());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10248
//  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10249
//  format %{ "String Inflate (trot) $dst,$src($len)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10250
//  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10251
//    __ string_inflate_trot($src$$Register, $dst$$Register, $len$$Register, $tmp$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10252
//  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10253
//  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10254
//%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10255
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10256
// byte[] to char[] inflation
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10257
instruct string_inflate(Universe dummy, rarg5RegP src, iRegP dst, roddRegI len, revenRegI evenReg, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10258
  match(Set dummy (StrInflatedCopy src (Binary dst len)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10259
  effect(USE_KILL src, USE_KILL len, TEMP evenReg, TEMP tmp, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10260
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10261
  format %{ "String Inflate $src->$dst($len)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10262
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10263
    __ string_inflate($src$$Register, $dst$$Register, $len$$Register, $evenReg$$Register, $tmp$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10264
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10265
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10266
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10267
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10268
// StringCoding.java intrinsics
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10269
instruct has_negatives(rarg5RegP ary1, iRegI len, iRegI result, roddRegI oddReg, revenRegI evenReg, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10270
  match(Set result (HasNegatives ary1 len));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10271
  effect(TEMP_DEF result, USE_KILL ary1, TEMP oddReg, TEMP evenReg, TEMP tmp, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10272
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10273
  format %{ "has negatives byte[] $ary1($len) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10274
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10275
    __ has_negatives($result$$Register, $ary1$$Register, $len$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10276
                     $oddReg$$Register, $evenReg$$Register, $tmp$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10277
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10278
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10279
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10280
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10281
// encode char[] to byte[] in ISO_8859_1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10282
instruct encode_iso_array(rarg5RegP src, iRegP dst, iRegI result, roddRegI len, revenRegI evenReg, iRegI tmp, iRegI tmp2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10283
  match(Set result (EncodeISOArray src (Binary dst len)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10284
  effect(TEMP_DEF result, USE_KILL src, USE_KILL len, TEMP evenReg, TEMP tmp, TEMP tmp2, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10285
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10286
  format %{ "Encode array $src->$dst($len) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10287
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10288
    __ string_compress($result$$Register, $src$$Register, $dst$$Register, $len$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10289
                       $evenReg$$Register, $tmp$$Register, $tmp2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10290
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10291
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10292
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10293
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10294
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10295
//----------PEEPHOLE RULES-----------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10296
// These must follow all instruction definitions as they use the names
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10297
// defined in the instructions definitions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10298
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10299
// peepmatch (root_instr_name [preceeding_instruction]*);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10300
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10301
// peepconstraint %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10302
// (instruction_number.operand_name relational_op instruction_number.operand_name
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10303
//  [, ...]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10304
// // instruction numbers are zero-based using left to right order in peepmatch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10305
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10306
// peepreplace (instr_name([instruction_number.operand_name]*));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10307
// // provide an instruction_number.operand_name for each operand that appears
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10308
// // in the replacement instruction's match rule
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10309
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10310
// ---------VM FLAGS---------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10311
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10312
// All peephole optimizations can be turned off using -XX:-OptoPeephole
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10313
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10314
// Each peephole rule is given an identifying number starting with zero and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10315
// increasing by one in the order seen by the parser. An individual peephole
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10316
// can be enabled, and all others disabled, by using -XX:OptoPeepholeAt=#
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10317
// on the command-line.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10318
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10319
// ---------CURRENT LIMITATIONS----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10320
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10321
// Only match adjacent instructions in same basic block
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10322
// Only equality constraints
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10323
// Only constraints between operands, not (0.dest_reg == EAX_enc)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10324
// Only one replacement instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10325
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10326
// ---------EXAMPLE----------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10327
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10328
// // pertinent parts of existing instructions in architecture description
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10329
// instruct movI(eRegI dst, eRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10330
//   match(Set dst (CopyI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10331
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10332
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10333
// instruct incI_eReg(eRegI dst, immI1 src, eFlagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10334
//   match(Set dst (AddI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10335
//   effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10336
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10337
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10338
// // Change (inc mov) to lea
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10339
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10340
//   // increment preceeded by register-register move
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10341
//   peepmatch (incI_eReg movI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10342
//   // require that the destination register of the increment
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10343
//   // match the destination register of the move
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10344
//   peepconstraint (0.dst == 1.dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10345
//   // construct a replacement instruction that sets
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10346
//   // the destination to (move's source register + one)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10347
//   peepreplace (leaI_eReg_immI(0.dst 1.src 0.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10348
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10349
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10350
// Implementation no longer uses movX instructions since
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10351
// machine-independent system no longer uses CopyX nodes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10352
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10353
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10354
//   peepmatch (incI_eReg movI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10355
//   peepconstraint (0.dst == 1.dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10356
//   peepreplace (leaI_eReg_immI(0.dst 1.src 0.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10357
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10358
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10359
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10360
//   peepmatch (decI_eReg movI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10361
//   peepconstraint (0.dst == 1.dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10362
//   peepreplace (leaI_eReg_immI(0.dst 1.src 0.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10363
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10364
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10365
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10366
//   peepmatch (addI_eReg_imm movI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10367
//   peepconstraint (0.dst == 1.dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10368
//   peepreplace (leaI_eReg_immI(0.dst 1.src 0.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10369
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10370
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10371
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10372
//   peepmatch (addP_eReg_imm movP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10373
//   peepconstraint (0.dst == 1.dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10374
//   peepreplace (leaP_eReg_immI(0.dst 1.src 0.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10375
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10376
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10377
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10378
//  This peephole rule does not work, probably because ADLC can't handle two effects:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10379
//  Effect 1 is defining 0.op1 and effect 2 is setting CC
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10380
// condense a load from memory and subsequent test for zero
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10381
// into a single, more efficient ICM instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10382
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10383
//   peepmatch (compI_iReg_imm0 loadI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10384
//   peepconstraint (1.dst == 0.op1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10385
//   peepreplace (loadtest15_iReg_mem(0.op1 0.op1 1.mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10386
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10387
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10388
// // Change load of spilled value to only a spill
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10389
// instruct storeI(memory mem, eRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10390
//   match(Set mem (StoreI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10391
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10392
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10393
// instruct loadI(eRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10394
//   match(Set dst (LoadI mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10395
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10396
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10397
peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10398
  peepmatch (loadI storeI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10399
  peepconstraint (1.src == 0.dst, 1.mem == 0.mem);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10400
  peepreplace (storeI(1.mem 1.mem 1.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10401
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10402
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10403
peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10404
  peepmatch (loadL storeL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10405
  peepconstraint (1.src == 0.dst, 1.mem == 0.mem);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10406
  peepreplace (storeL(1.mem 1.mem 1.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10407
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10408
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10409
peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10410
  peepmatch (loadP storeP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10411
  peepconstraint (1.src == 0.dst, 1.dst == 0.mem);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10412
  peepreplace (storeP(1.dst 1.dst 1.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10413
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10414
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10415
//----------SUPERWORD RULES---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10416
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10417
//  Expand rules for special cases
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10418
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10419
instruct expand_storeF(stackSlotF mem, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10420
  // No match rule, false predicate, for expand only.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10421
  effect(DEF mem, USE src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10422
  predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10423
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10424
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10425
  format %{ "STE      $src,$mem\t # replicate(float2stack)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10426
  opcode(STE_ZOPC, STE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10427
  ins_encode(z_form_rt_mem(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10428
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10429
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10430
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10431
instruct expand_LoadLogical_I2L(iRegL dst, stackSlotF mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10432
  // No match rule, false predicate, for expand only.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10433
  effect(DEF dst, USE mem);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10434
  predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10435
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10436
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10437
  format %{ "LLGF     $dst,$mem\t # replicate(stack2reg(unsigned))" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10438
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10439
  ins_encode(z_form_rt_mem(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10440
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10441
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10442
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10443
// Replicate scalar int to packed int values (8 Bytes)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10444
instruct expand_Repl2I_reg(iRegL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10445
  // Dummy match rule, false predicate, for expand only.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10446
  match(Set dst (ConvI2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10447
  predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10448
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10449
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10450
  format %{ "REPLIC2F $dst,$src\t # replicate(pack2F)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10451
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10452
    if ($dst$$Register == $src$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10453
      __ z_sllg(Z_R0_scratch, $src$$Register, 64-32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10454
      __ z_ogr($dst$$Register, Z_R0_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10455
    }  else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10456
      __ z_sllg($dst$$Register, $src$$Register, 64-32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10457
      __ z_ogr( $dst$$Register, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10458
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10459
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10460
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10461
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10462
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10463
// Replication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10464
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10465
// Exploit rotate_then_insert, if available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10466
// Replicate scalar byte to packed byte values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10467
instruct Repl8B_reg_risbg(iRegL dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10468
  match(Set dst (ReplicateB src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10469
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10470
  predicate((n->as_Vector()->length() == 8));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10471
  format %{ "REPLIC8B $dst,$src\t # pack8B" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10472
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10473
    if ($dst$$Register != $src$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10474
      __ z_lgr($dst$$Register, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10475
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10476
    __ rotate_then_insert($dst$$Register, $dst$$Register, 48, 55,  8, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10477
    __ rotate_then_insert($dst$$Register, $dst$$Register, 32, 47, 16, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10478
    __ rotate_then_insert($dst$$Register, $dst$$Register,  0, 31, 32, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10479
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10480
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10481
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10482
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10483
// Replicate scalar byte to packed byte values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10484
instruct Repl8B_imm(iRegL dst, immB_n0m1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10485
  match(Set dst (ReplicateB src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10486
  predicate(n->as_Vector()->length() == 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10487
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10488
  format %{ "REPLIC8B $dst,$src\t # pack8B imm" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10489
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10490
    int64_t  Isrc8 = $src$$constant & 0x000000ff;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10491
    int64_t Isrc16 =  Isrc8 <<  8 |  Isrc8;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10492
    int64_t Isrc32 = Isrc16 << 16 | Isrc16;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10493
    assert(Isrc8 != 0x000000ff && Isrc8 != 0, "should be handled by other match rules.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10494
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10495
    __ z_llilf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10496
    __ z_iihf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10497
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10498
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10499
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10500
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10501
// Replicate scalar byte to packed byte values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10502
instruct Repl8B_imm0(iRegL dst, immI_0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10503
  match(Set dst (ReplicateB src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10504
  predicate(n->as_Vector()->length() == 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10505
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10506
  format %{ "REPLIC8B $dst,$src\t # pack8B imm0" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10507
  ins_encode %{ __ z_laz($dst$$Register, 0, Z_R0); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10508
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10509
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10510
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10511
// Replicate scalar byte to packed byte values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10512
instruct Repl8B_immm1(iRegL dst, immB_minus1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10513
  match(Set dst (ReplicateB src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10514
  predicate(n->as_Vector()->length() == 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10515
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10516
  format %{ "REPLIC8B $dst,$src\t # pack8B immm1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10517
  ins_encode %{ __ z_lghi($dst$$Register, -1); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10518
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10519
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10520
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10521
// Exploit rotate_then_insert, if available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10522
// Replicate scalar short to packed short values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10523
instruct Repl4S_reg_risbg(iRegL dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10524
  match(Set dst (ReplicateS src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10525
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10526
  predicate((n->as_Vector()->length() == 4));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10527
  format %{ "REPLIC4S $dst,$src\t # pack4S" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10528
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10529
    if ($dst$$Register != $src$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10530
      __ z_lgr($dst$$Register, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10531
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10532
    __ rotate_then_insert($dst$$Register, $dst$$Register, 32, 47, 16, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10533
    __ rotate_then_insert($dst$$Register, $dst$$Register,  0, 31, 32, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10534
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10535
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10536
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10537
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10538
// Replicate scalar short to packed short values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10539
instruct Repl4S_imm(iRegL dst, immS_n0m1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10540
  match(Set dst (ReplicateS src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10541
  predicate(n->as_Vector()->length() == 4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10542
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10543
  format %{ "REPLIC4S $dst,$src\t # pack4S imm" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10544
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10545
    int64_t Isrc16 = $src$$constant & 0x0000ffff;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10546
    int64_t Isrc32 = Isrc16 << 16 | Isrc16;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10547
    assert(Isrc16 != 0x0000ffff && Isrc16 != 0, "Repl4S_imm: (src == " INT64_FORMAT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10548
           ") should be handled by other match rules.", $src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10549
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10550
    __ z_llilf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10551
    __ z_iihf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10552
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10553
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10554
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10555
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10556
// Replicate scalar short to packed short values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10557
instruct Repl4S_imm0(iRegL dst, immI_0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10558
  match(Set dst (ReplicateS src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10559
  predicate(n->as_Vector()->length() == 4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10560
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10561
  format %{ "REPLIC4S $dst,$src\t # pack4S imm0" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10562
  ins_encode %{ __ z_laz($dst$$Register, 0, Z_R0); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10563
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10564
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10565
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10566
// Replicate scalar short to packed short values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10567
instruct Repl4S_immm1(iRegL dst, immS_minus1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10568
  match(Set dst (ReplicateS src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10569
  predicate(n->as_Vector()->length() == 4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10570
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10571
  format %{ "REPLIC4S $dst,$src\t # pack4S immm1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10572
  ins_encode %{ __ z_lghi($dst$$Register, -1); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10573
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10574
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10575
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10576
// Exploit rotate_then_insert, if available.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10577
// Replicate scalar int to packed int values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10578
instruct Repl2I_reg_risbg(iRegL dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10579
  match(Set dst (ReplicateI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10580
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10581
  predicate((n->as_Vector()->length() == 2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10582
  format %{ "REPLIC2I $dst,$src\t # pack2I" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10583
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10584
    if ($dst$$Register != $src$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10585
      __ z_lgr($dst$$Register, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10586
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10587
    __ rotate_then_insert($dst$$Register, $dst$$Register, 0, 31, 32, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10588
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10589
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10590
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10591
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10592
// Replicate scalar int to packed int values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10593
instruct Repl2I_imm(iRegL dst, immI_n0m1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10594
  match(Set dst (ReplicateI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10595
  predicate(n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10596
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10597
  format %{ "REPLIC2I $dst,$src\t # pack2I imm" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10598
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10599
    int64_t Isrc32 = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10600
    assert(Isrc32 != -1 && Isrc32 != 0, "should be handled by other match rules.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10601
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10602
    __ z_llilf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10603
    __ z_iihf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10604
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10605
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10606
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10607
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10608
// Replicate scalar int to packed int values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10609
instruct Repl2I_imm0(iRegL dst, immI_0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10610
  match(Set dst (ReplicateI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10611
  predicate(n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10612
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10613
  format %{ "REPLIC2I $dst,$src\t # pack2I imm0" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10614
  ins_encode %{ __ z_laz($dst$$Register, 0, Z_R0); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10615
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10616
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10617
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10618
// Replicate scalar int to packed int values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10619
instruct Repl2I_immm1(iRegL dst, immI_minus1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10620
  match(Set dst (ReplicateI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10621
  predicate(n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10622
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10623
  format %{ "REPLIC2I $dst,$src\t # pack2I immm1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10624
  ins_encode %{ __ z_lghi($dst$$Register, -1); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10625
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10626
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10627
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10628
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10629
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10630
instruct Repl2F_reg_indirect(iRegL dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10631
  match(Set dst (ReplicateF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10632
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10633
  predicate(!VM_Version::has_FPSupportEnhancements() && n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10634
  format %{ "REPLIC2F $dst,$src\t # pack2F indirect" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10635
  expand %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10636
    stackSlotF tmp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10637
    iRegL      tmp2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10638
    expand_storeF(tmp, src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10639
    expand_LoadLogical_I2L(tmp2, tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10640
    expand_Repl2I_reg(dst, tmp2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10641
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10642
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10643
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10644
// Replicate scalar float to packed float values in GREG (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10645
instruct Repl2F_reg_direct(iRegL dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10646
  match(Set dst (ReplicateF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10647
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10648
  predicate(VM_Version::has_FPSupportEnhancements() && n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10649
  format %{ "REPLIC2F $dst,$src\t # pack2F direct" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10650
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10651
    assert(VM_Version::has_FPSupportEnhancements(), "encoder should never be called on old H/W");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10652
    __ z_lgdr($dst$$Register, $src$$FloatRegister);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10653
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10654
    __ z_srlg(Z_R0_scratch, $dst$$Register, 32);  // Floats are left-justified in 64bit reg.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10655
    __ z_iilf($dst$$Register, 0);                 // Save a "result not ready" stall.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10656
    __ z_ogr($dst$$Register, Z_R0_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10657
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10658
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10659
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10660
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10661
// Replicate scalar float immediate to packed float values in GREG (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10662
instruct Repl2F_imm(iRegL dst, immF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10663
  match(Set dst (ReplicateF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10664
  predicate(n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10665
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10666
  format %{ "REPLIC2F $dst,$src\t # pack2F imm" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10667
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10668
    union {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10669
      int   Isrc32;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10670
      float Fsrc32;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10671
    };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10672
    Fsrc32 = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10673
    __ z_llilf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10674
    __ z_iihf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10675
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10676
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10677
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10678
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10679
// Replicate scalar float immediate zeroes to packed float values in GREG (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10680
// Do this only for 'real' zeroes, especially don't loose sign of negative zeroes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10681
instruct Repl2F_imm0(iRegL dst, immFp0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10682
  match(Set dst (ReplicateF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10683
  predicate(n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10684
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10685
  format %{ "REPLIC2F $dst,$src\t # pack2F imm0" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10686
  ins_encode %{ __ z_laz($dst$$Register, 0, Z_R0); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10687
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10688
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10689
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10690
// Store
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10691
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10692
// Store Aligned Packed Byte register to memory (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10693
instruct storeA8B(memory mem, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10694
  match(Set mem (StoreVector mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10695
  predicate(n->as_StoreVector()->memory_size() == 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10696
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10697
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10698
  format %{ "STG     $src,$mem\t # ST(packed8B)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10699
  opcode(STG_ZOPC, STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10700
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10701
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10702
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10703
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10704
// Load
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10705
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10706
instruct loadV8(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10707
  match(Set dst (LoadVector mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10708
  predicate(n->as_LoadVector()->memory_size() == 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10709
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10710
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10711
  format %{ "LG      $dst,$mem\t # L(packed8B)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10712
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10713
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10714
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10715
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10716
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10717
//----------POPULATION COUNT RULES--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10718
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10719
// Byte reverse
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10720
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10721
instruct bytes_reverse_int(iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10722
  match(Set dst (ReverseBytesI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10723
  predicate(UseByteReverseInstruction);  // See Matcher::match_rule_supported
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10724
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10725
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10726
  format %{ "LRVR    $dst,$src\t# byte reverse int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10727
  opcode(LRVR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10728
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10729
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10730
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10731
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10732
instruct bytes_reverse_long(iRegL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10733
  match(Set dst (ReverseBytesL src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10734
  predicate(UseByteReverseInstruction);  // See Matcher::match_rule_supported
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10735
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10736
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10737
  format %{ "LRVGR   $dst,$src\t# byte reverse long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10738
  opcode(LRVGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10739
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10740
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10741
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10742
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10743
// Leading zeroes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10744
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10745
// The instruction FLOGR (Find Leftmost One in Grande (64bit) Register)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10746
// returns the bit position of the leftmost 1 in the 64bit source register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10747
// As the bits are numbered from left to right (0..63), the returned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10748
// position index is equivalent to the number of leading zeroes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10749
// If no 1-bit is found (i.e. the regsiter contains zero), the instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10750
// returns position 64. That's exactly what we need.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10751
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10752
instruct countLeadingZerosI(revenRegI dst, iRegI src, roddRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10753
  match(Set dst (CountLeadingZerosI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10754
  effect(KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10755
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10756
  size(14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10757
  format %{ "SLLG    $dst,$src,32\t# no need to always count 32 zeroes first\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10758
            "IILH    $dst,0x8000 \t# insert \"stop bit\" to force result 32 for zero src.\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10759
            "FLOGR   $dst,$dst"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10760
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10761
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10762
    // Performance experiments indicate that "FLOGR" is using some kind of
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10763
    // iteration to find the leftmost "1" bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10764
    //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10765
    // The prior implementation zero-extended the 32-bit argument to 64 bit,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10766
    // thus forcing "FLOGR" to count 32 bits of which we know they are zero.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10767
    // We could gain measurable speedup in micro benchmark:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10768
    //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10769
    //               leading   trailing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10770
    //   z10:   int     2.04       1.68
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10771
    //         long     1.00       1.02
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10772
    //   z196:  int     0.99       1.23
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10773
    //         long     1.00       1.11
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10774
    //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10775
    // By shifting the argument into the high-word instead of zero-extending it.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10776
    // The add'l branch on condition (taken for a zero argument, very infrequent,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10777
    // good prediction) is well compensated for by the savings.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10778
    //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10779
    // We leave the previous implementation in for some time in the future when
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10780
    // the "FLOGR" instruction may become less iterative.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10781
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10782
    // Version 2: shows 62%(z9), 204%(z10), -1%(z196) improvement over original
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10783
    __ z_sllg($dst$$Register, $src$$Register, 32); // No need to always count 32 zeroes first.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10784
    __ z_iilh($dst$$Register, 0x8000);   // Insert "stop bit" to force result 32 for zero src.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10785
    __ z_flogr($dst$$Register, $dst$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10786
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10787
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10788
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10789
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10790
instruct countLeadingZerosL(revenRegI dst, iRegL src, roddRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10791
  match(Set dst (CountLeadingZerosL src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10792
  effect(KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10793
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10794
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10795
  format %{ "FLOGR   $dst,$src \t# count leading zeros (long)\n\t" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10796
  ins_encode %{ __ z_flogr($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10797
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10798
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10799
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10800
// trailing zeroes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10801
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10802
// We transform the trailing zeroes problem to a leading zeroes problem
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10803
// such that can use the FLOGR instruction to our advantage.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10804
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10805
// With
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10806
//   tmp1 = src - 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10807
// we flip all trailing zeroes to ones and the rightmost one to zero.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10808
// All other bits remain unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10809
// With the complement
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10810
//   tmp2 = ~src
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10811
// we get all ones in the trailing zeroes positions. Thus,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10812
//   tmp3 = tmp1 & tmp2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10813
// yields ones in the trailing zeroes positions and zeroes elsewhere.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10814
// Now we can apply FLOGR and get 64-(trailing zeroes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10815
instruct countTrailingZerosI(revenRegI dst, iRegI src, roddRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10816
  match(Set dst (CountTrailingZerosI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10817
  effect(TEMP_DEF dst, TEMP tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10818
  ins_cost(8 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10819
  // TODO: s390 port size(FIXED_SIZE);  // Emitted code depends on PreferLAoverADD being on/off.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10820
  format %{ "LLGFR   $dst,$src  \t# clear upper 32 bits (we are dealing with int)\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10821
            "LCGFR   $tmp,$src  \t# load 2's complement (32->64 bit)\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10822
            "AGHI    $dst,-1    \t# tmp1 = src-1\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10823
            "AGHI    $tmp,-1    \t# tmp2 = -src-1 = ~src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10824
            "NGR     $dst,$tmp  \t# tmp3 = tmp1&tmp2\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10825
            "FLOGR   $dst,$dst  \t# count trailing zeros (int)\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10826
            "AHI     $dst,-64   \t# tmp4 = 64-(trailing zeroes)-64\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10827
            "LCR     $dst,$dst  \t# res = -tmp4"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10828
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10829
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10830
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10831
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10832
    // Rtmp only needed for for zero-argument shortcut. With kill effect in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10833
    // match rule Rsrc = roddReg would be possible, saving one register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10834
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10835
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10836
    assert_different_registers(Rdst, Rsrc, Rtmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10837
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10838
    // Algorithm:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10839
    // - Isolate the least significant (rightmost) set bit using (src & (-src)).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10840
    //   All other bits in the result are zero.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10841
    // - Find the "leftmost one" bit position in the single-bit result from previous step.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10842
    // - 63-("leftmost one" bit position) gives the # of trailing zeros.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10843
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10844
    // Version 2: shows 79%(z9), 68%(z10), 23%(z196) improvement over original.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10845
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10846
    __ load_const_optimized(Rdst, 32); // Prepare for shortcut (zero argument), result will be 32.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10847
    __ z_lcgfr(Rtmp, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10848
    __ z_bre(done);                    // Taken very infrequently, good prediction, no BHT entry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10849
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10850
    __ z_nr(Rtmp, Rsrc);               // (src) & (-src) leaves nothing but least significant bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10851
    __ z_ahi(Rtmp,  -1);               // Subtract one to fill all trailing zero positions with ones.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10852
                                       // Use 32bit op to prevent borrow propagation (case Rdst = 0x80000000)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10853
                                       // into upper half of reg. Not relevant with sllg below.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10854
    __ z_sllg(Rdst, Rtmp, 32);         // Shift interesting contents to upper half of register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10855
    __ z_bre(done);                    // Shortcut for argument = 1, result will be 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10856
                                       // Depends on CC set by ahi above.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10857
                                       // Taken very infrequently, good prediction, no BHT entry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10858
                                       // Branch delayed to have Rdst set correctly (Rtmp == 0(32bit)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10859
                                       // after SLLG Rdst == 0(64bit)).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10860
    __ z_flogr(Rdst, Rdst);            // Kills tmp which is the oddReg for dst.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10861
    __ add2reg(Rdst,  -32);            // 32-pos(leftmost1) is #trailing zeros
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10862
    __ z_lcgfr(Rdst, Rdst);            // Provide 64bit result at no cost.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10863
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10864
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10865
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10866
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10867
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10868
instruct countTrailingZerosL(revenRegI dst, iRegL src, roddRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10869
  match(Set dst (CountTrailingZerosL src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10870
  effect(TEMP_DEF dst, KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10871
  ins_cost(8 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10872
  // TODO: s390 port size(FIXED_SIZE);  // Emitted code depends on PreferLAoverADD being on/off.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10873
  format %{ "LCGR    $dst,$src  \t# preserve src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10874
            "NGR     $dst,$src  \t#"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10875
            "AGHI    $dst,-1    \t# tmp1 = src-1\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10876
            "FLOGR   $dst,$dst  \t# count trailing zeros (long), kill $tmp\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10877
            "AHI     $dst,-64   \t# tmp4 = 64-(trailing zeroes)-64\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10878
            "LCR     $dst,$dst  \t#"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10879
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10880
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10881
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10882
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10883
    assert_different_registers(Rdst, Rsrc); // Rtmp == Rsrc allowed.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10884
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10885
    // New version: shows 5%(z9), 2%(z10), 11%(z196) improvement over original.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10886
    __ z_lcgr(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10887
    __ z_ngr(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10888
    __ add2reg(Rdst,   -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10889
    __ z_flogr(Rdst, Rdst); // Kills tmp which is the oddReg for dst.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10890
    __ add2reg(Rdst,  -64);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10891
    __ z_lcgfr(Rdst, Rdst); // Provide 64bit result at no cost.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10892
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10893
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10894
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10895
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10896
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10897
// bit count
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10898
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10899
instruct popCountI(iRegI dst, iRegI src, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10900
  match(Set dst (PopCountI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10901
  effect(TEMP_DEF dst, TEMP tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10902
  predicate(UsePopCountInstruction && VM_Version::has_PopCount());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10903
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10904
  size(24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10905
  format %{ "POPCNT  $dst,$src\t# pop count int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10906
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10907
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10908
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10909
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10910
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10911
    // Prefer compile-time assertion over run-time SIGILL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10912
    assert(VM_Version::has_PopCount(), "bad predicate for countLeadingZerosI");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10913
    assert_different_registers(Rdst, Rtmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10914
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10915
    // Version 2: shows 10%(z196) improvement over original.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10916
    __ z_popcnt(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10917
    __ z_srlg(Rtmp, Rdst, 16); // calc  byte4+byte6 and byte5+byte7
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10918
    __ z_alr(Rdst, Rtmp);      //   into byte6 and byte7
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10919
    __ z_srlg(Rtmp, Rdst,  8); // calc (byte4+byte6) + (byte5+byte7)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10920
    __ z_alr(Rdst, Rtmp);      //   into byte7
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10921
    __ z_llgcr(Rdst, Rdst);    // zero-extend sum
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10922
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10923
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10924
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10925
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10926
instruct popCountL(iRegI dst, iRegL src, iRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10927
  match(Set dst (PopCountL src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10928
  effect(TEMP_DEF dst, TEMP tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10929
  predicate(UsePopCountInstruction && VM_Version::has_PopCount());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10930
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10931
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10932
  format %{ "POPCNT  $dst,$src\t# pop count long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10933
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10934
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10935
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10936
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10937
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10938
    // Prefer compile-time assertion over run-time SIGILL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10939
    assert(VM_Version::has_PopCount(), "bad predicate for countLeadingZerosI");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10940
    assert_different_registers(Rdst, Rtmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10941
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10942
    // Original version. Using LA instead of algr seems to be a really bad idea (-35%).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10943
    __ z_popcnt(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10944
    __ z_ahhlr(Rdst, Rdst, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10945
    __ z_sllg(Rtmp, Rdst, 16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10946
    __ z_algr(Rdst, Rtmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10947
    __ z_sllg(Rtmp, Rdst,  8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10948
    __ z_algr(Rdst, Rtmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10949
    __ z_srlg(Rdst, Rdst, 56);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10950
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10951
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10952
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10953
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10954
//----------SMARTSPILL RULES---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10955
// These must follow all instruction definitions as they use the names
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10956
// defined in the instructions definitions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10957
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10958
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10959
// TYPE PROFILING RULES
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10960