hotspot/src/cpu/s390/vm/s390.ad
author goetz
Mon, 07 Nov 2016 12:37:28 +0100
changeset 42556 c03d98321ad1
parent 42065 6032b31e3719
child 42897 57e7b1c75d17
permissions -rw-r--r--
8169317: [s390] Various minor bug fixes and adaptions. 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
  // Touch the polling page.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   913
  // Part 1: get the page's address.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   914
  if (need_polling) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   915
    AddressLiteral pp(os::get_polling_page());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   916
    __ load_const_optimized(Z_R1_scratch, pp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   917
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   918
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   919
  // Pop frame, restore return_pc, and all stuff needed by interpreter.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   920
  // Pop frame by add insted of load (a penny saved is a penny got :-).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   921
  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
   922
  int retPC_offset        = frame_size_in_bytes + _z_abi16(return_pc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   923
  if (Displacement::is_validDisp(retPC_offset)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   924
    __ z_lg(Z_R14, retPC_offset, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   925
    __ add2reg(Z_SP, frame_size_in_bytes);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   926
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   927
    __ add2reg(Z_SP, frame_size_in_bytes);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   928
    __ restore_return_pc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   929
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   930
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   931
  // Touch the polling page,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   932
  // part 2: touch the page now.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   933
  if (need_polling) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   934
    // We need to mark the code position where the load from the safepoint
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   935
    // polling page was emitted as relocInfo::poll_return_type here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   936
    __ relocate(relocInfo::poll_return_type);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   937
    __ load_from_polling_page(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   938
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   939
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   940
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   941
uint MachEpilogNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   942
  // variable size. determine dynamically.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   943
  return MachNode::size(ra_);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   944
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   945
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   946
int MachEpilogNode::reloc() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   947
  // Return number of relocatable values contained in this instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   948
  return 1; // One for load_from_polling_page.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   949
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   950
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   951
const Pipeline * MachEpilogNode::pipeline() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   952
  return MachNode::pipeline_class();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   953
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   954
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   955
int MachEpilogNode::safepoint_offset() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   956
  assert(do_polling(), "no return for this epilog node");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   957
  return 0;
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
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   961
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   962
// Figure out which register class each belongs in: rc_int, rc_float, rc_stack.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   963
enum RC { rc_bad, rc_int, rc_float, rc_stack };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   964
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   965
static enum RC rc_class(OptoReg::Name reg) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   966
  // Return the register class for the given register. The given register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   967
  // reg is a <register>_num value, which is an index into the MachRegisterNumbers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   968
  // enumeration in adGlobals_s390.hpp.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   969
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   970
  if (reg == OptoReg::Bad) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   971
    return rc_bad;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   972
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   973
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   974
  // We have 32 integer register halves, starting at index 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   975
  if (reg < 32) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   976
    return rc_int;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   977
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   978
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   979
  // We have 32 floating-point register halves, starting at index 32.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   980
  if (reg < 32+32) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   981
    return rc_float;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   982
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   983
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   984
  // Between float regs & stack are the flags regs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   985
  assert(reg >= OptoReg::stack0(), "blow up if spilling flags");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   986
  return rc_stack;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   987
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   988
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   989
// Returns size as obtained from z_emit_instr.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   990
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
   991
                                   int reg, int offset, bool do_print, outputStream *os) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   992
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   993
  if (cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   994
    if (opcode > (1L<<32)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   995
      return z_emit_inst(*cbuf, opcode | Assembler::reg(Matcher::_regEncode[reg], 8, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   996
                         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
   997
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   998
      return z_emit_inst(*cbuf, opcode | Assembler::reg(Matcher::_regEncode[reg], 8, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   999
                         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
  1000
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1001
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1002
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1003
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1004
  if (do_print) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1005
    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
  1006
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1007
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1008
  return (opcode > (1L << 32)) ? 6 : 4;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1009
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1010
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1011
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
  1012
  if (cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1013
    MacroAssembler _masm(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1014
    __ z_mvc(dst_off, len-1, Z_SP, src_off, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1015
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1016
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1017
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1018
  else if (do_print) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1019
    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
  1020
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1021
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1022
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1023
  return 6;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1024
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1025
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1026
uint MachSpillCopyNode::implementation(CodeBuffer *cbuf, PhaseRegAlloc *ra_, bool do_size, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1027
  // Get registers to move.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1028
  OptoReg::Name src_hi = ra_->get_reg_second(in(1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1029
  OptoReg::Name src_lo = ra_->get_reg_first(in(1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1030
  OptoReg::Name dst_hi = ra_->get_reg_second(this);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1031
  OptoReg::Name dst_lo = ra_->get_reg_first(this);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1032
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1033
  enum RC src_hi_rc = rc_class(src_hi);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1034
  enum RC src_lo_rc = rc_class(src_lo);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1035
  enum RC dst_hi_rc = rc_class(dst_hi);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1036
  enum RC dst_lo_rc = rc_class(dst_lo);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1037
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1038
  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
  1039
  bool is64 = (src_hi_rc != rc_bad);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1040
  assert(!is64 ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1041
         ((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
  1042
         "expected aligned-adjacent pairs");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1043
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1044
  // Generate spill code!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1045
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1046
  if (src_lo == dst_lo && src_hi == dst_hi) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1047
    return 0;            // Self copy, no move.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1048
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1049
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1050
  int  src_offset = ra_->reg2offset(src_lo);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1051
  int  dst_offset = ra_->reg2offset(dst_lo);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1052
  bool print = !do_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1053
  bool src12 = Immediate::is_uimm12(src_offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1054
  bool dst12 = Immediate::is_uimm12(dst_offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1055
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1056
  const char   *mnemo = NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1057
  unsigned long opc = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1058
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1059
  // Memory->Memory Spill. Use Z_R0 to hold the value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1060
  if (src_lo_rc == rc_stack && dst_lo_rc == rc_stack) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1061
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1062
    assert(!is64 || (src_hi_rc==rc_stack && dst_hi_rc==rc_stack),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1063
           "expected same type of move for high parts");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1064
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1065
    if (src12 && dst12) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1066
      return z_mvc_helper(cbuf, is64 ? 8 : 4, dst_offset, src_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1067
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1068
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1069
    int r0 = Z_R0_num;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1070
    if (is64) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1071
      return z_ld_st_helper(cbuf, "LG  ", LG_ZOPC, r0, src_offset, print, os) +
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1072
             z_ld_st_helper(cbuf, "STG ", STG_ZOPC, r0, dst_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1073
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1074
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1075
    return z_ld_st_helper(cbuf, "LY   ", LY_ZOPC, r0, src_offset, print, os) +
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1076
           z_ld_st_helper(cbuf, "STY  ", STY_ZOPC, r0, dst_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1077
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1078
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1079
  // Check for float->int copy. Requires a trip through memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1080
  if (src_lo_rc == rc_float && dst_lo_rc == rc_int) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1081
    Unimplemented();  // Unsafe, do not remove!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1082
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1083
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1084
  // Check for integer reg-reg copy.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1085
  if (src_lo_rc == rc_int && dst_lo_rc == rc_int) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1086
    if (cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1087
      MacroAssembler _masm(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1088
      Register Rsrc = as_Register(Matcher::_regEncode[src_lo]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1089
      Register Rdst = as_Register(Matcher::_regEncode[dst_lo]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1090
      __ z_lgr(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1091
      return 4;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1092
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1093
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1094
    // else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1095
    if (print) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1096
      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
  1097
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1098
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1099
    return 4;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1100
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1101
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1102
  // Check for integer store.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1103
  if (src_lo_rc == rc_int && dst_lo_rc == rc_stack) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1104
    assert(!is64 || (src_hi_rc==rc_int && dst_hi_rc==rc_stack),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1105
           "expected same type of move for high parts");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1106
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1107
    if (is64) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1108
      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
  1109
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1110
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1111
    // else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1112
    mnemo = dst12 ? "ST  " : "STY ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1113
    opc = dst12 ? ST_ZOPC : STY_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1114
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1115
    return z_ld_st_helper(cbuf, mnemo, opc, src_lo, dst_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1116
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1117
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1118
  // Check for integer load
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1119
  // Always load cOops zero-extended. That doesn't hurt int loads.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1120
  if (dst_lo_rc == rc_int && src_lo_rc == rc_stack) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1121
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1122
    assert(!is64 || (dst_hi_rc==rc_int && src_hi_rc==rc_stack),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1123
           "expected same type of move for high parts");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1124
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1125
    mnemo = is64 ? "LG  " : "LLGF";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1126
    opc = is64 ? LG_ZOPC : LLGF_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1127
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1128
    return z_ld_st_helper(cbuf, mnemo, opc, dst_lo, src_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1129
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1130
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1131
  // Check for float reg-reg copy.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1132
  if (src_lo_rc == rc_float && dst_lo_rc == rc_float) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1133
    if (cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1134
      MacroAssembler _masm(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1135
      FloatRegister Rsrc = as_FloatRegister(Matcher::_regEncode[src_lo]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1136
      FloatRegister Rdst = as_FloatRegister(Matcher::_regEncode[dst_lo]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1137
      __ z_ldr(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1138
      return 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1139
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1140
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1141
    // else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1142
    if (print) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1143
      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
  1144
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1145
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1146
    return 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1147
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1148
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1149
  // Check for float store.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1150
  if (src_lo_rc == rc_float && dst_lo_rc == rc_stack) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1151
    assert(!is64 || (src_hi_rc==rc_float && dst_hi_rc==rc_stack),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1152
           "expected same type of move for high parts");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1153
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1154
    if (is64) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1155
      mnemo = dst12 ? "STD  " : "STDY ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1156
      opc = dst12 ? STD_ZOPC : STDY_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1157
      return z_ld_st_helper(cbuf, mnemo, opc, src_lo, dst_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1158
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1159
    // else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1160
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1161
    mnemo = dst12 ? "STE  " : "STEY ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1162
    opc = dst12 ? STE_ZOPC : STEY_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1163
    return z_ld_st_helper(cbuf, mnemo, opc, src_lo, dst_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1164
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1165
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1166
  // Check for float load.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1167
  if (dst_lo_rc == rc_float && src_lo_rc == rc_stack) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1168
    assert(!is64 || (dst_hi_rc==rc_float && src_hi_rc==rc_stack),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1169
           "expected same type of move for high parts");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1170
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1171
    if (is64) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1172
      mnemo = src12 ? "LD   " : "LDY  ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1173
      opc = src12 ? LD_ZOPC : LDY_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1174
      return z_ld_st_helper(cbuf, mnemo, opc, dst_lo, src_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1175
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1176
    // else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1177
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1178
    mnemo = src12 ? "LE   " : "LEY  ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1179
    opc = src12 ? LE_ZOPC : LEY_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1180
    return z_ld_st_helper(cbuf, mnemo, opc, dst_lo, src_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1181
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1182
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1183
  // --------------------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1184
  // Check for hi bits still needing moving. Only happens for misaligned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1185
  // arguments to native calls.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1186
  if (src_hi == dst_hi) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1187
    return 0;               // Self copy, no move.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1188
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1189
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1190
  assert(is64 && dst_hi_rc != rc_bad, "src_hi & dst_hi cannot be Bad");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1191
  Unimplemented();  // Unsafe, do not remove!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1192
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1193
  return 0; // never reached, but make the compiler shut up!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1194
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1195
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1196
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1197
void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1198
  if (ra_ && ra_->node_regs_max_index() > 0) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1199
    implementation(NULL, ra_, false, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1200
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1201
    if (req() == 2 && in(1)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1202
      os->print("N%d = N%d\n", _idx, in(1)->_idx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1203
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1204
      const char *c = "(";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1205
      os->print("N%d = ", _idx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1206
      for (uint i = 1; i < req(); ++i) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1207
        os->print("%sN%d", c, in(i)->_idx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1208
        c = ", ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1209
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1210
      os->print(")");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1211
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1212
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1213
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1214
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1215
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1216
void MachSpillCopyNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1217
  implementation(&cbuf, ra_, false, NULL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1218
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1219
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1220
uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1221
  return implementation(NULL, ra_, true, NULL);
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
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1225
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1226
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1227
void MachNopNode::format(PhaseRegAlloc *, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1228
  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
  1229
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1230
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1231
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1232
void MachNopNode::emit(CodeBuffer &cbuf, PhaseRegAlloc * ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1233
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1234
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1235
  int rem_space = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1236
  if (!(ra_->C->in_scratch_emit_size())) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1237
    rem_space = cbuf.insts()->remaining();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1238
    if (rem_space <= _count*2 + 8) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1239
      tty->print("NopNode: _count = %3.3d, remaining space before = %d", _count, rem_space);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1240
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1241
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1242
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1243
  for (int i = 0; i < _count; i++) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1244
    __ z_nop();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1245
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1246
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1247
  if (!(ra_->C->in_scratch_emit_size())) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1248
    if (rem_space <= _count*2 + 8) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1249
      int rem_space2 = cbuf.insts()->remaining();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1250
      tty->print_cr(", after = %d", rem_space2);
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
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1254
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1255
uint MachNopNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1256
   return 2 * _count;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1257
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1258
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1259
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1260
void BoxLockNode::format(PhaseRegAlloc *ra_, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1261
  int offset = ra_->reg2offset(in_RegMask(0).find_first_elem());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1262
  if (ra_ && ra_->node_regs_max_index() > 0) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1263
    int reg = ra_->get_reg_first(this);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1264
    os->print("ADDHI  %s, SP, %d\t//box node", Matcher::regName[reg], offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1265
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1266
    os->print("ADDHI  N%d = SP + %d\t// box node", _idx, offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1267
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1268
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1269
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1270
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1271
// Take care of the size function, if you make changes here!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1272
void BoxLockNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1273
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1274
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1275
  int offset = ra_->reg2offset(in_RegMask(0).find_first_elem());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1276
  int reg = ra_->get_encode(this);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1277
  __ z_lay(as_Register(reg), offset, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1278
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1279
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1280
uint BoxLockNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1281
  // BoxLockNode is not a MachNode, so we can't just call MachNode::size(ra_)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1282
  return 6;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1283
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1284
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1285
 %} // end source section
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1286
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1287
//----------SOURCE BLOCK-------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1288
// This is a block of C++ code which provides values, functions, and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1289
// definitions necessary in the rest of the architecture description
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1290
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1291
source_hpp %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1292
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1293
// Header information of the source block.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1294
// Method declarations/definitions which are used outside
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1295
// the ad-scope can conveniently be defined here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1296
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1297
// To keep related declarations/definitions/uses close together,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1298
// we switch between source %{ }% and source_hpp %{ }% freely as needed.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1299
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1300
//--------------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1301
// Used for optimization in Compile::Shorten_branches
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1302
//--------------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1303
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1304
class CallStubImpl {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1305
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1306
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1307
  // call trampolines
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1308
  // Size of call trampoline stub. For add'l comments, see size_java_to_interp().
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1309
  static uint size_call_trampoline() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1310
    return 0; // no call trampolines on this platform
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1311
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1312
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1313
  // call trampolines
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1314
  // Number of relocations needed by a call trampoline stub.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1315
  static uint reloc_call_trampoline() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1316
    return 0; // No call trampolines on this platform.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1317
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1318
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1319
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1320
%} // end source_hpp section
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1321
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1322
source %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1323
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1324
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1325
void MachUEPNode::format(PhaseRegAlloc *ra_, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1326
  os->print_cr("---- MachUEPNode ----");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1327
  os->print_cr("\tTA");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1328
  os->print_cr("\tload_const Z_R1, SharedRuntime::get_ic_miss_stub()");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1329
  os->print_cr("\tBR(Z_R1)");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1330
  os->print_cr("\tTA  # pad with illtraps");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1331
  os->print_cr("\t...");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1332
  os->print_cr("\tTA");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1333
  os->print_cr("\tLTGR    Z_R2, Z_R2");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1334
  os->print_cr("\tBRU     ic_miss");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1335
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1336
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1337
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1338
void MachUEPNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1339
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1340
  const int ic_miss_offset = 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1341
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1342
  // Inline_cache contains a klass.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1343
  Register ic_klass = as_Register(Matcher::inline_cache_reg_encode());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1344
  // ARG1 is the receiver oop.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1345
  Register R2_receiver = Z_ARG1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1346
  int      klass_offset = oopDesc::klass_offset_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1347
  AddressLiteral icmiss(SharedRuntime::get_ic_miss_stub());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1348
  Register R1_ic_miss_stub_addr = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1349
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1350
  // Null check of receiver.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1351
  // This is the null check of the receiver that actually should be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1352
  // done in the caller. It's here because in case of implicit null
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1353
  // checks we get it for free.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1354
  assert(!MacroAssembler::needs_explicit_null_check(oopDesc::klass_offset_in_bytes()),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1355
         "second word in oop should not require explicit null check.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1356
  if (!ImplicitNullChecks) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1357
    Label valid;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1358
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1359
      __ z_cgij(R2_receiver, 0, Assembler::bcondNotEqual, valid);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1360
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1361
      __ z_ltgr(R2_receiver, R2_receiver);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1362
      __ z_bre(valid);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1363
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1364
    // The ic_miss_stub will handle the null pointer exception.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1365
    __ load_const_optimized(R1_ic_miss_stub_addr, icmiss);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1366
    __ z_br(R1_ic_miss_stub_addr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1367
    __ bind(valid);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1368
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1369
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1370
  // Check whether this method is the proper implementation for the class of
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1371
  // the receiver (ic miss check).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1372
  {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1373
    Label valid;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1374
    // Compare cached class against klass from receiver.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1375
    // This also does an implicit null check!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1376
    __ compare_klass_ptr(ic_klass, klass_offset, R2_receiver, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1377
    __ z_bre(valid);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1378
    // The inline cache points to the wrong method. Call the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1379
    // ic_miss_stub to find the proper method.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1380
    __ load_const_optimized(R1_ic_miss_stub_addr, icmiss);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1381
    __ z_br(R1_ic_miss_stub_addr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1382
    __ bind(valid);
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
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1386
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1387
uint MachUEPNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1388
  // Determine size dynamically.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1389
  return MachNode::size(ra_);
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
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1393
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1394
%} // interrupt source section
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1395
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1396
source_hpp %{ // Header information of the source block.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1397
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1398
class HandlerImpl {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1399
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1400
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1401
  static int emit_exception_handler(CodeBuffer &cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1402
  static int emit_deopt_handler(CodeBuffer& cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1403
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1404
  static uint size_exception_handler() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1405
    return NativeJump::max_instruction_size();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1406
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1407
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1408
  static uint size_deopt_handler() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1409
    return NativeCall::max_instruction_size();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1410
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1411
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1412
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1413
%} // end source_hpp section
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1414
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1415
source %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1416
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1417
// This exception handler code snippet is placed after the method's
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1418
// code. It is the return point if an exception occurred. it jumps to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1419
// the exception blob.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1420
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1421
// If the method gets deoptimized, the method and this code snippet
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1422
// get patched.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1423
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1424
// 1) Trampoline code gets patched into the end of this exception
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1425
//   handler. the trampoline code jumps to the deoptimization blob.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1426
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1427
// 2) The return address in the method's code will get patched such
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1428
//   that it jumps to the trampoline.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1429
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1430
// 3) The handler will get patched such that it does not jump to the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1431
//   exception blob, but to an entry in the deoptimization blob being
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1432
//   aware of the exception.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1433
int HandlerImpl::emit_exception_handler(CodeBuffer &cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1434
  Register temp_reg = Z_R1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1435
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1436
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1437
  address base = __ start_a_stub(size_exception_handler());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1438
  if (base == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1439
    return 0;          // CodeBuffer::expand failed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1440
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1441
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1442
  int offset = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1443
  // Use unconditional pc-relative jump with 32-bit range here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1444
  __ load_const_optimized(temp_reg, (address)OptoRuntime::exception_blob()->content_begin());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1445
  __ z_br(temp_reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1446
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1447
  assert(__ offset() - offset <= (int) size_exception_handler(), "overflow");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1448
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1449
  __ end_a_stub();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1450
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1451
  return offset;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1452
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1453
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1454
// Emit deopt handler code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1455
int HandlerImpl::emit_deopt_handler(CodeBuffer& cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1456
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1457
  address        base = __ start_a_stub(size_deopt_handler());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1458
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1459
  if (base == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1460
    return 0;  // CodeBuffer::expand failed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1461
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1462
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1463
  int offset = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1464
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1465
  // Size_deopt_handler() must be exact on zarch, so for simplicity
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1466
  // we do not use load_const_opt here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1467
  __ load_const(Z_R1, SharedRuntime::deopt_blob()->unpack());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1468
  __ call(Z_R1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1469
  assert(__ offset() - offset == (int) size_deopt_handler(), "must be fixed size");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1470
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1471
  __ end_a_stub();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1472
  return offset;
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
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1477
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1478
// Given a register encoding, produce an Integer Register object.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1479
static Register reg_to_register_object(int register_encoding) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1480
  assert(Z_R12->encoding() == Z_R12_enc, "wrong coding");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1481
  return as_Register(register_encoding);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1482
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1483
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1484
const bool Matcher::match_rule_supported(int opcode) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1485
  if (!has_match_rule(opcode)) return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1486
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1487
  switch (opcode) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1488
    case Op_CountLeadingZerosI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1489
    case Op_CountLeadingZerosL:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1490
    case Op_CountTrailingZerosI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1491
    case Op_CountTrailingZerosL:
42556
c03d98321ad1 8169317: [s390] Various minor bug fixes and adaptions.
goetz
parents: 42065
diff changeset
  1492
      // Implementation requires FLOGR instruction, which is available since z9.
c03d98321ad1 8169317: [s390] Various minor bug fixes and adaptions.
goetz
parents: 42065
diff changeset
  1493
      return true;
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1494
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1495
    case Op_ReverseBytesI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1496
    case Op_ReverseBytesL:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1497
      return UseByteReverseInstruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1498
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1499
    // PopCount supported by H/W from z/Architecture G5 (z196) on.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1500
    case Op_PopCountI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1501
    case Op_PopCountL:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1502
      return UsePopCountInstruction && VM_Version::has_PopCount();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1503
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1504
    case Op_StrComp:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1505
      return SpecialStringCompareTo;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1506
    case Op_StrEquals:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1507
      return SpecialStringEquals;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1508
    case Op_StrIndexOf:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1509
    case Op_StrIndexOfChar:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1510
      return SpecialStringIndexOf;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1511
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1512
    case Op_GetAndAddI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1513
    case Op_GetAndAddL:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1514
      return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1515
      // return VM_Version::has_AtomicMemWithImmALUOps();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1516
    case Op_GetAndSetI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1517
    case Op_GetAndSetL:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1518
    case Op_GetAndSetP:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1519
    case Op_GetAndSetN:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1520
      return true;  // General CAS implementation, always available.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1521
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1522
    default:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1523
      return true;  // Per default match rules are supported.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1524
                    // BUT: make sure match rule is not disabled by a false predicate!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1525
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1526
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1527
  return true;  // Per default match rules are supported.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1528
                // BUT: make sure match rule is not disabled by a false predicate!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1529
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1530
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1531
const bool Matcher::match_rule_supported_vector(int opcode, int vlen) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1532
  // TODO
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1533
  // Identify extra cases that we might want to provide match rules for
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1534
  // e.g. Op_ vector nodes and other intrinsics while guarding with vlen.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1535
  bool ret_value = match_rule_supported(opcode);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1536
  // Add rules here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1537
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1538
  return ret_value;  // Per default match rules are supported.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1539
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1540
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1541
int Matcher::regnum_to_fpu_offset(int regnum) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1542
  ShouldNotReachHere();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1543
  return regnum - 32; // The FP registers are in the second chunk.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1544
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1545
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1546
const bool Matcher::has_predicated_vectors(void) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1547
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1548
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1549
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1550
const int Matcher::float_pressure(int default_pressure_threshold) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1551
  return default_pressure_threshold;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1552
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1553
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1554
const bool Matcher::convL2FSupported(void) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1555
  return true; // False means that conversion is done by runtime call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1556
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1557
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1558
//----------SUPERWORD HELPERS----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1559
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1560
// Vector width in bytes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1561
const int Matcher::vector_width_in_bytes(BasicType bt) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1562
  assert(MaxVectorSize == 8, "");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1563
  return 8;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1564
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1565
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1566
// Vector ideal reg.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1567
const int Matcher::vector_ideal_reg(int size) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1568
  assert(MaxVectorSize == 8 && size == 8, "");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1569
  return Op_RegL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1570
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1571
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1572
// Limits on vector size (number of elements) loaded into vector.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1573
const int Matcher::max_vector_size(const BasicType bt) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1574
  assert(is_java_primitive(bt), "only primitive type vectors");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1575
  return vector_width_in_bytes(bt)/type2aelembytes(bt);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1576
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1577
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1578
const int Matcher::min_vector_size(const BasicType bt) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1579
  return max_vector_size(bt); // Same as max.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1580
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1581
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1582
const int Matcher::vector_shift_count_ideal_reg(int size) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1583
  fatal("vector shift is not supported");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1584
  return Node::NotAMachineReg;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1585
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1586
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1587
// z/Architecture does support misaligned store/load at minimal extra cost.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1588
const bool Matcher::misaligned_vectors_ok() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1589
  return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1590
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1591
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1592
// Not yet ported to z/Architecture.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1593
const bool Matcher::pass_original_key_for_aes() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1594
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1595
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1596
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1597
// RETURNS: whether this branch offset is short enough that a short
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1598
// branch can be used.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1599
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1600
// If the platform does not provide any short branch variants, then
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1601
// this method should return `false' for offset 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1602
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1603
// `Compile::Fill_buffer' will decide on basis of this information
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1604
// whether to do the pass `Compile::Shorten_branches' at all.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1605
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1606
// And `Compile::Shorten_branches' will decide on basis of this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1607
// information whether to replace particular branch sites by short
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1608
// ones.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1609
bool Matcher::is_short_branch_offset(int rule, int br_size, int offset) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1610
  // On zarch short branches use a 16 bit signed immediate that
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1611
  // is the pc-relative offset in halfword (= 2 bytes) units.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1612
  return Assembler::is_within_range_of_RelAddr16((address)((long)offset), (address)0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1613
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1614
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1615
const bool Matcher::isSimpleConstant64(jlong value) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1616
  // Probably always true, even if a temp register is required.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1617
  return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1618
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1619
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1620
// Should correspond to setting above
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1621
const bool Matcher::init_array_count_is_in_bytes = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1622
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1623
// 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
  1624
const int Matcher::long_cmove_cost() { return ConditionalMoveLimit; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1625
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1626
// 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
  1627
const int Matcher::float_cmove_cost() { return ConditionalMoveLimit; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1628
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1629
// Does the CPU require postalloc expand (see block.cpp for description of postalloc expand)?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1630
const bool Matcher::require_postalloc_expand = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1631
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1632
// Do we need to mask the count passed to shift instructions or does
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1633
// the cpu only look at the lower 5/6 bits anyway?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1634
// 32bit shifts mask in emitter, 64bit shifts need no mask.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1635
// Constant shift counts are handled in Ideal phase.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1636
const bool Matcher::need_masked_shift_count = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1637
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1638
// Set this as clone_shift_expressions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1639
bool Matcher::narrow_oop_use_complex_address() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1640
  if (Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0) return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1641
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1642
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1643
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1644
bool Matcher::narrow_klass_use_complex_address() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1645
  NOT_LP64(ShouldNotCallThis());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1646
  assert(UseCompressedClassPointers, "only for compressed klass code");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1647
  // TODO HS25: z port if (MatchDecodeNodes) return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1648
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1649
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1650
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1651
bool Matcher::const_oop_prefer_decode() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1652
  // Prefer ConN+DecodeN over ConP in simple compressed oops mode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1653
  return Universe::narrow_oop_base() == NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1654
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1655
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1656
bool Matcher::const_klass_prefer_decode() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1657
  // Prefer ConNKlass+DecodeNKlass over ConP in simple compressed klass mode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1658
  return Universe::narrow_klass_base() == NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1659
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1660
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1661
// Is it better to copy float constants, or load them directly from memory?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1662
// Most RISCs will have to materialize an address into a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1663
// register first, so they would do better to copy the constant from stack.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1664
const bool Matcher::rematerialize_float_constants = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1665
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1666
// If CPU can load and store mis-aligned doubles directly then no fixup is
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1667
// needed. Else we split the double into 2 integer pieces and move it
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1668
// piece-by-piece. Only happens when passing doubles into C code as the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1669
// Java calling convention forces doubles to be aligned.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1670
const bool Matcher::misaligned_doubles_ok = true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1671
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1672
// Advertise here if the CPU requires explicit rounding operations
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1673
// to implement the UseStrictFP mode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1674
const bool Matcher::strict_fp_requires_explicit_rounding = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1675
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1676
// Do floats take an entire double register or just half?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1677
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1678
// A float in resides in a zarch double register. When storing it by
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1679
// 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
  1680
// and casting it into a float afterwards.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1681
bool Matcher::float_in_double() { return false; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1682
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1683
// Do ints take an entire long register or just half?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1684
// The relevant question is how the int is callee-saved:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1685
// the whole long is written but de-opt'ing will have to extract
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1686
// the relevant 32 bits.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1687
const bool Matcher::int_in_long = true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1688
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1689
// Constants for c2c and c calling conventions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1690
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1691
const MachRegisterNumbers z_iarg_reg[5] = {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1692
  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
  1693
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1694
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1695
const MachRegisterNumbers z_farg_reg[4] = {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1696
  Z_F0_num, Z_F2_num, Z_F4_num, Z_F6_num
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1697
};
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_iarg_registers = sizeof(z_iarg_reg) / sizeof(z_iarg_reg[0]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1700
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1701
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
  1702
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1703
// Return whether or not this register is ever used as an argument. This
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1704
// function is used on startup to build the trampoline stubs in generateOptoStub.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1705
// Registers not mentioned will be killed by the VM call in the trampoline, and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1706
// arguments in those registers not be available to the callee.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1707
bool Matcher::can_be_java_arg(int reg) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1708
  // We return true for all registers contained in z_iarg_reg[] and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1709
  // z_farg_reg[] and their virtual halves.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1710
  // We must include the virtual halves in order to get STDs and LDs
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1711
  // instead of STWs and LWs in the trampoline stubs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1712
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1713
  if (reg == Z_R2_num || reg == Z_R2_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1714
      reg == Z_R3_num || reg == Z_R3_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1715
      reg == Z_R4_num || reg == Z_R4_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1716
      reg == Z_R5_num || reg == Z_R5_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1717
      reg == Z_R6_num || reg == Z_R6_H_num) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1718
    return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1719
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1720
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1721
  if (reg == Z_F0_num || reg == Z_F0_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1722
      reg == Z_F2_num || reg == Z_F2_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1723
      reg == Z_F4_num || reg == Z_F4_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1724
      reg == Z_F6_num || reg == Z_F6_H_num) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1725
    return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1726
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1727
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1728
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1729
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1730
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1731
bool Matcher::is_spillable_arg(int reg) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1732
  return can_be_java_arg(reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1733
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1734
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1735
bool Matcher::use_asm_for_ldiv_by_con(jlong divisor) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1736
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1737
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1738
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1739
// Register for DIVI projection of divmodI
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1740
RegMask Matcher::divI_proj_mask() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1741
  return _Z_RARG4_INT_REG_mask;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1742
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1743
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1744
// Register for MODI projection of divmodI
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1745
RegMask Matcher::modI_proj_mask() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1746
  return _Z_RARG3_INT_REG_mask;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1747
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1748
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1749
// Register for DIVL projection of divmodL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1750
RegMask Matcher::divL_proj_mask() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1751
  return _Z_RARG4_LONG_REG_mask;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1752
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1753
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1754
// Register for MODL projection of divmodL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1755
RegMask Matcher::modL_proj_mask() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1756
  return _Z_RARG3_LONG_REG_mask;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1757
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1758
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1759
// Copied from sparc.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1760
const RegMask Matcher::method_handle_invoke_SP_save_mask() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1761
  return RegMask();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1762
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1763
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1764
const bool Matcher::convi2l_type_required = true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1765
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1766
// Should the Matcher clone shifts on addressing modes, expecting them
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1767
// to be subsumed into complex addressing expressions or compute them
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1768
// into registers?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1769
bool Matcher::clone_address_expressions(AddPNode* m, Matcher::MStack& mstack, VectorSet& address_visited) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1770
  return clone_base_plus_offset_address(m, mstack, address_visited);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1771
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1772
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1773
void Compile::reshape_address(AddPNode* addp) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1774
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1775
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1776
%} // source
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1777
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1778
//----------ENCODING BLOCK-----------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1779
// This block specifies the encoding classes used by the compiler to output
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1780
// byte streams. Encoding classes are parameterized macros used by
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1781
// Machine Instruction Nodes in order to generate the bit encoding of the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1782
// instruction. Operands specify their base encoding interface with the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1783
// interface keyword. There are currently supported four interfaces,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1784
// REG_INTER, CONST_INTER, MEMORY_INTER, & COND_INTER. REG_INTER causes an
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1785
// operand to generate a function which returns its register number when
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1786
// queried. CONST_INTER causes an operand to generate a function which
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1787
// returns the value of the constant when queried. MEMORY_INTER causes an
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1788
// operand to generate four functions which return the Base Register, the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1789
// Index Register, the Scale Value, and the Offset Value of the operand when
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1790
// queried. COND_INTER causes an operand to generate six functions which
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1791
// return the encoding code (ie - encoding bits for the instruction)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1792
// associated with each basic boolean condition for a conditional instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1793
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1794
// Instructions specify two basic values for encoding. Again, a function
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1795
// is available to check if the constant displacement is an oop. They use the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1796
// ins_encode keyword to specify their encoding classes (which must be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1797
// a sequence of enc_class names, and their parameters, specified in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1798
// the encoding block), and they use the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1799
// opcode keyword to specify, in order, their primary, secondary, and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1800
// tertiary opcode. Only the opcode sections which a particular instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1801
// needs for encoding need to be specified.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1802
encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1803
  enc_class enc_unimplemented %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1804
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1805
    __ unimplemented("Unimplemented mach node encoding in AD file.", 13);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1806
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1807
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1808
  enc_class enc_untested %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1809
#ifdef ASSERT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1810
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1811
    __ untested("Untested mach node encoding in AD file.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1812
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1813
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1814
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1815
  enc_class z_rrform(iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1816
    assert((($primary >> 14) & 0x03) == 0, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1817
    assert( ($primary >> 16)         == 0, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1818
    z_emit16(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1819
             Assembler::reg($dst$$reg,8,16) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1820
             Assembler::reg($src$$reg,12,16));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1821
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1822
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1823
  enc_class z_rreform(iRegI dst1, iRegI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1824
    assert((($primary >> 30) & 0x03) == 2, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1825
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1826
             Assembler::reg($dst1$$reg,24,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1827
             Assembler::reg($src2$$reg,28,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1828
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1829
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1830
  enc_class z_rrfform(iRegI dst1, iRegI src2, iRegI src3) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1831
    assert((($primary >> 30) & 0x03) == 2, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1832
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1833
             Assembler::reg($dst1$$reg,24,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1834
             Assembler::reg($src2$$reg,28,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1835
             Assembler::reg($src3$$reg,16,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1836
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1837
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1838
  enc_class z_riform_signed(iRegI dst, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1839
    assert((($primary>>30) & 0x03) == 2, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1840
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1841
             Assembler::reg($dst$$reg,8,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1842
             Assembler::simm16($src$$constant,16,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1843
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1844
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1845
  enc_class z_riform_unsigned(iRegI dst, uimmI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1846
    assert((($primary>>30) & 0x03) == 2, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1847
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1848
             Assembler::reg($dst$$reg,8,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1849
             Assembler::uimm16($src$$constant,16,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1850
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1851
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1852
  enc_class z_rieform_d(iRegI dst1, iRegI src3, immI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1853
    assert((($primary>>46) & 0x03) == 3, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1854
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1855
             Assembler::reg($dst1$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1856
             Assembler::reg($src3$$reg,12,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1857
             Assembler::simm16($src2$$constant,16,48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1858
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1859
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1860
  enc_class z_rilform_signed(iRegI dst, immL32 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1861
    assert((($primary>>46) & 0x03) == 3, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1862
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1863
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1864
             Assembler::simm32($src$$constant,16,48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1865
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1866
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1867
  enc_class z_rilform_unsigned(iRegI dst, uimmL32 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1868
    assert((($primary>>46) & 0x03) == 3, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1869
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1870
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1871
             Assembler::uimm32($src$$constant,16,48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1872
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1873
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1874
  enc_class z_rsyform_const(iRegI dst, iRegI src1, immI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1875
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1876
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1877
             Assembler::reg($src1$$reg,12,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1878
             Assembler::simm20($src2$$constant));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1879
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1880
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1881
  enc_class z_rsyform_reg_reg(iRegI dst, iRegI src, iRegI shft) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1882
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1883
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1884
             Assembler::reg($src$$reg,12,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1885
             Assembler::reg($shft$$reg,16,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1886
             Assembler::simm20(0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1887
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1888
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1889
  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
  1890
    assert((($primary>>30) & 0x03) == 1, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1891
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1892
             Assembler::reg($dst$$reg,8,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1893
             Assembler::reg($src1$$reg,12,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1894
             Assembler::reg($src2$$reg,16,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1895
             Assembler::uimm12($con$$constant,20,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1896
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1897
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1898
  enc_class z_rxform_imm_reg(iRegL dst, immL con, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1899
    assert((($primary>>30) & 0x03) == 1, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1900
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1901
             Assembler::reg($dst$$reg,8,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1902
             Assembler::reg($src$$reg,16,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1903
             Assembler::uimm12($con$$constant,20,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1904
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1905
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1906
  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
  1907
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1908
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1909
             Assembler::reg($src1$$reg,12,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1910
             Assembler::reg($src2$$reg,16,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1911
             Assembler::simm20($con$$constant));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1912
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1913
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1914
  enc_class z_rxyform_imm_reg(iRegL dst, immL con, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1915
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1916
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1917
             Assembler::reg($src$$reg,16,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1918
             Assembler::simm20($con$$constant));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1919
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1920
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1921
  // Direct memory arithmetic.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1922
  enc_class z_siyform(memoryRSY mem, immI8 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1923
    int      disp = $mem$$disp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1924
    Register base = reg_to_register_object($mem$$base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1925
    int      con  = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1926
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1927
    assert(VM_Version::has_MemWithImmALUOps(), "unsupported CPU");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1928
    z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1929
                Assembler::regz(base,16,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1930
                Assembler::simm20(disp) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1931
                Assembler::simm8(con,8,48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1932
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1933
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1934
  enc_class z_silform(memoryRS mem, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1935
    z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1936
                Assembler::regz(reg_to_register_object($mem$$base),16,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1937
                Assembler::uimm12($mem$$disp,20,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1938
                Assembler::simm16($src$$constant,32,48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1939
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1940
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1941
  // Encoder for FP ALU reg/mem instructions (support only short displacements).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1942
  enc_class z_form_rt_memFP(RegF dst, memoryRX mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1943
    Register Ridx = $mem$$index$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1944
    if (Ridx == noreg) { Ridx = Z_R0; } // Index is 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1945
    if ($primary > (1L << 32)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1946
      z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1947
                  Assembler::reg($dst$$reg, 8, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1948
                  Assembler::uimm12($mem$$disp, 20, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1949
                  Assembler::reg(Ridx, 12, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1950
                  Assembler::regz(reg_to_register_object($mem$$base), 16, 48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1951
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1952
      z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1953
                  Assembler::reg($dst$$reg, 8, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1954
                  Assembler::uimm12($mem$$disp, 20, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1955
                  Assembler::reg(Ridx, 12, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1956
                  Assembler::regz(reg_to_register_object($mem$$base), 16, 32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1957
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1958
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1959
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1960
  enc_class z_form_rt_mem(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1961
    Register Ridx = $mem$$index$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1962
    if (Ridx == noreg) { Ridx = Z_R0; } // Index is 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1963
    if ($primary > (1L<<32)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1964
      z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1965
                  Assembler::reg($dst$$reg, 8, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1966
                  Assembler::simm20($mem$$disp) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1967
                  Assembler::reg(Ridx, 12, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1968
                  Assembler::regz(reg_to_register_object($mem$$base), 16, 48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1969
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1970
      z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1971
                  Assembler::reg($dst$$reg, 8, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1972
                  Assembler::uimm12($mem$$disp, 20, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1973
                  Assembler::reg(Ridx, 12, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1974
                  Assembler::regz(reg_to_register_object($mem$$base), 16, 32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1975
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1976
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1977
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1978
  enc_class z_form_rt_mem_opt(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1979
    int isize = $secondary > 1L << 32 ? 48 : 32;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1980
    Register Ridx = $mem$$index$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1981
    if (Ridx == noreg) { Ridx = Z_R0; } // Index is 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1982
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1983
    if (Displacement::is_shortDisp((long)$mem$$disp)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1984
      z_emit_inst(cbuf, $secondary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1985
                  Assembler::reg($dst$$reg, 8, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1986
                  Assembler::uimm12($mem$$disp, 20, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1987
                  Assembler::reg(Ridx, 12, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1988
                  Assembler::regz(reg_to_register_object($mem$$base), 16, isize));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1989
    } else if (Displacement::is_validDisp((long)$mem$$disp)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1990
      z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1991
                  Assembler::reg($dst$$reg, 8, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1992
                  Assembler::simm20($mem$$disp) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1993
                  Assembler::reg(Ridx, 12, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1994
                  Assembler::regz(reg_to_register_object($mem$$base), 16, 48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1995
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1996
        MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1997
        __ load_const_optimized(Z_R1_scratch, $mem$$disp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1998
        if (Ridx != Z_R0) { __ z_agr(Z_R1_scratch, Ridx); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1999
        z_emit_inst(cbuf, $secondary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2000
                    Assembler::reg($dst$$reg, 8, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2001
                    Assembler::uimm12(0, 20, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2002
                    Assembler::reg(Z_R1_scratch, 12, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2003
                    Assembler::regz(reg_to_register_object($mem$$base), 16, isize));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2004
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2005
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2006
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2007
  enc_class z_enc_brul(Label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2008
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2009
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2010
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2011
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2012
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2013
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2014
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2015
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2016
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2017
    __ z_brul(l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2018
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2019
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2020
  enc_class z_enc_bru(Label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2021
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2022
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2023
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2024
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2025
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2026
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2027
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2028
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2029
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2030
    __ z_bru(l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2031
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2032
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2033
  enc_class z_enc_branch_con_far(cmpOp cmp, Label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2034
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2035
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2036
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2037
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2038
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2039
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2040
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2041
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2042
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2043
    __ z_brcl((Assembler::branch_condition)$cmp$$cmpcode, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2044
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2045
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2046
  enc_class z_enc_branch_con_short(cmpOp cmp, Label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2047
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2048
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2049
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2050
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2051
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2052
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2053
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2054
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2055
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2056
    __ z_brc((Assembler::branch_condition)$cmp$$cmpcode, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2057
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2058
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2059
  enc_class z_enc_cmpb_regreg(iRegI src1, iRegI src2, Label lbl, cmpOpT cmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2060
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2061
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2062
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2063
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2064
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2065
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2066
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2067
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2068
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2069
    Assembler::branch_condition cc = (Assembler::branch_condition)$cmp$$cmpcode;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2070
    unsigned long instr = $primary;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2071
    if (instr == CRJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2072
      __ z_crj($src1$$Register, $src2$$Register, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2073
    } else if (instr == CLRJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2074
      __ z_clrj($src1$$Register, $src2$$Register, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2075
    } else if (instr == CGRJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2076
      __ z_cgrj($src1$$Register, $src2$$Register, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2077
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2078
      guarantee(instr == CLGRJ_ZOPC, "opcode not implemented");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2079
      __ z_clgrj($src1$$Register, $src2$$Register, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2080
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2081
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2082
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2083
  enc_class z_enc_cmpb_regregFar(iRegI src1, iRegI src2, Label lbl, cmpOpT cmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2084
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2085
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2086
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2087
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2088
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2089
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2090
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2091
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2092
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2093
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2094
    unsigned long instr = $primary;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2095
    if (instr == CR_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2096
      __ z_cr($src1$$Register, $src2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2097
    } else if (instr == CLR_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2098
      __ z_clr($src1$$Register, $src2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2099
    } else if (instr == CGR_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2100
      __ z_cgr($src1$$Register, $src2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2101
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2102
      guarantee(instr == CLGR_ZOPC, "opcode not implemented");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2103
      __ z_clgr($src1$$Register, $src2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2104
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2105
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2106
    __ z_brcl((Assembler::branch_condition)$cmp$$cmpcode, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2107
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2108
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2109
  enc_class z_enc_cmpb_regimm(iRegI src1, immI8 src2, Label lbl, cmpOpT cmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2110
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2111
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2112
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2113
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2114
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2115
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2116
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2117
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2118
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2119
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2120
    Assembler::branch_condition cc = (Assembler::branch_condition)$cmp$$cmpcode;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2121
    unsigned long instr = $primary;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2122
    if (instr == CIJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2123
      __ z_cij($src1$$Register, $src2$$constant, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2124
    } else if (instr == CLIJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2125
      __ z_clij($src1$$Register, $src2$$constant, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2126
    } else if (instr == CGIJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2127
      __ z_cgij($src1$$Register, $src2$$constant, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2128
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2129
      guarantee(instr == CLGIJ_ZOPC, "opcode not implemented");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2130
      __ z_clgij($src1$$Register, $src2$$constant, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2131
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2132
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2133
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2134
  enc_class z_enc_cmpb_regimmFar(iRegI src1, immI8 src2, Label lbl, cmpOpT cmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2135
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2136
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2137
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2138
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2139
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2140
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2141
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2142
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2143
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2144
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2145
    unsigned long instr = $primary;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2146
    if (instr == CHI_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2147
      __ z_chi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2148
    } else if (instr == CLFI_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2149
      __ z_clfi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2150
    } else if (instr == CGHI_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2151
      __ z_cghi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2152
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2153
      guarantee(instr == CLGFI_ZOPC, "opcode not implemented");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2154
      __ z_clgfi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2155
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2156
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2157
    __ z_brcl((Assembler::branch_condition)$cmp$$cmpcode, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2158
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2159
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2160
  // Call from Java to runtime.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2161
  enc_class z_enc_java_to_runtime_call(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2162
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2163
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2164
    // Save return pc before call to the place where we need it, since
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2165
    // callee doesn't.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2166
    unsigned int start_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2167
    // Compute size of "larl + stg + call_c_opt".
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2168
    const int size_of_code = 6 + 6 + MacroAssembler::call_far_patchable_size();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2169
    __ get_PC(Z_R14, size_of_code);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2170
    __ save_return_pc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2171
    assert(__ offset() - start_off == 12, "bad prelude len: %d", __ offset() - start_off);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2172
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2173
    assert((__ offset() & 2) == 0, "misaligned z_enc_java_to_runtime_call");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2174
    address call_addr = __ call_c_opt((address)$meth$$method);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2175
    if (call_addr == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2176
      Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2177
      return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2178
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2179
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2180
#ifdef ASSERT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2181
    // Plausibility check for size_of_code assumptions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2182
    unsigned int actual_ret_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2183
    assert(start_off + size_of_code == actual_ret_off, "wrong return_pc");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2184
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2185
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2186
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2187
  enc_class z_enc_java_static_call(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2188
    // Call to fixup routine. Fixup routine uses ScopeDesc info to determine
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2189
    // whom we intended to call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2190
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2191
    int ret_offset = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2192
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2193
    if (!_method) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2194
      ret_offset = emit_call_reloc(_masm, $meth$$method,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2195
                                   relocInfo::runtime_call_w_cp_type, ra_);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2196
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2197
      int method_index = resolved_method_index(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2198
      if (_optimized_virtual) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2199
        ret_offset = emit_call_reloc(_masm, $meth$$method,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2200
                                     opt_virtual_call_Relocation::spec(method_index));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2201
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2202
        ret_offset = emit_call_reloc(_masm, $meth$$method,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2203
                                     static_call_Relocation::spec(method_index));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2204
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2205
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2206
    assert(__ inst_mark() != NULL, "emit_call_reloc must set_inst_mark()");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2207
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2208
    if (_method) { // Emit stub for static call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2209
      address stub = CompiledStaticCall::emit_to_interp_stub(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2210
      if (stub == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2211
        ciEnv::current()->record_failure("CodeCache is full");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2212
        return;
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
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2216
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2217
  // Java dynamic call
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2218
  enc_class z_enc_java_dynamic_call(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2219
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2220
    unsigned int start_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2221
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2222
    int vtable_index = this->_vtable_index;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2223
    if (vtable_index == -4) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2224
      Register ic_reg = reg_to_register_object(Matcher::inline_cache_reg_encode());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2225
      address virtual_call_oop_addr = NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2226
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2227
      AddressLiteral empty_ic((address) Universe::non_oop_word());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2228
      virtual_call_oop_addr = __ pc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2229
      bool success = __ load_const_from_toc(ic_reg, empty_ic);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2230
      if (!success) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2231
        Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2232
        return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2233
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2234
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2235
      // Call to fixup routine. Fixup routine uses ScopeDesc info
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2236
      // to determine who we intended to call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2237
      int method_index = resolved_method_index(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2238
      __ relocate(virtual_call_Relocation::spec(virtual_call_oop_addr, method_index));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2239
      unsigned int ret_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2240
      assert(__ offset() - start_off == 6, "bad prelude len: %d", __ offset() - start_off);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2241
      ret_off += emit_call_reloc(_masm, $meth$$method, relocInfo::none, ra_);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2242
      assert(_method, "lazy_constant may be wrong when _method==null");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2243
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2244
      assert(!UseInlineCaches, "expect vtable calls only if not using ICs");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2245
      // Go through the vtable. Get receiver klass. Receiver already
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2246
      // checked for non-null. If we'll go thru a C2I adapter, the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2247
      // interpreter expects method in Z_method.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2248
      // Use Z_method to temporarily hold the klass oop. Z_R1_scratch is destroyed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2249
      // by load_heap_oop_not_null.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2250
      __ load_klass(Z_method, Z_R2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2251
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2252
      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
  2253
      int v_off        = entry_offset + vtableEntry::method_offset_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2254
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2255
      if (Displacement::is_validDisp(v_off) ) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2256
        // Can use load instruction with large offset.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2257
        __ z_lg(Z_method, Address(Z_method /*class oop*/, v_off /*method offset*/));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2258
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2259
        // Worse case, must load offset into register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2260
        __ load_const(Z_R1_scratch, v_off);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2261
        __ z_lg(Z_method, Address(Z_method /*class oop*/, Z_R1_scratch /*method offset*/));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2262
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2263
      // NOTE: for vtable dispatches, the vtable entry will never be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2264
      // null. However it may very well end up in handle_wrong_method
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2265
      // if the method is abstract for the particular class.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2266
      __ z_lg(Z_R1_scratch, Address(Z_method, Method::from_compiled_offset()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2267
      // Call target. Either compiled code or C2I adapter.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2268
      __ z_basr(Z_R14, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2269
      unsigned int ret_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2270
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2271
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2272
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2273
  enc_class z_enc_cmov_reg(cmpOp cmp, iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2274
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2275
    Register Rdst = reg_to_register_object($dst$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2276
    Register Rsrc = reg_to_register_object($src$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2277
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2278
    // Don't emit code if operands are identical (same register).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2279
    if (Rsrc != Rdst) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2280
      Assembler::branch_condition cc = (Assembler::branch_condition)$cmp$$cmpcode;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2281
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2282
      if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2283
        __ z_locgr(Rdst, Rsrc, cc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2284
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2285
        // Branch if not (cmp cr).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2286
        Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2287
        __ z_brc(Assembler::inverse_condition(cc), done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2288
        __ z_lgr(Rdst, Rsrc); // Used for int and long+ptr.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2289
        __ bind(done);
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
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2293
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2294
  enc_class z_enc_cmov_imm(cmpOp cmp, iRegI dst, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2295
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2296
    Register Rdst = reg_to_register_object($dst$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2297
    int      Csrc = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2298
    Assembler::branch_condition cc = (Assembler::branch_condition)$cmp$$cmpcode;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2299
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2300
    // Branch if not (cmp cr).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2301
    __ z_brc(Assembler::inverse_condition(cc), done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2302
    if (Csrc == 0) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2303
      // Don't set CC.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2304
      __ clear_reg(Rdst, true, false);  // Use for int, long & ptr.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2305
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2306
      __ z_lghi(Rdst, Csrc); // Use for int, long & ptr.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2307
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2308
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2309
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2310
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2311
  enc_class z_enc_cctobool(iRegI res) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2312
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2313
    Register Rres = reg_to_register_object($res$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2314
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2315
    if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2316
      __ load_const_optimized(Z_R0_scratch, 0L); // false (failed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2317
      __ load_const_optimized(Rres, 1L);         // true  (succeed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2318
      __ z_locgr(Rres, Z_R0_scratch, Assembler::bcondNotEqual);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2319
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2320
      Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2321
      __ load_const_optimized(Rres, 0L); // false (failed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2322
      __ z_brne(done);                   // Assume true to be the common case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2323
      __ load_const_optimized(Rres, 1L); // true  (succeed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2324
      __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2325
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2326
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2327
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2328
  enc_class z_enc_casI(iRegI compare_value, iRegI exchange_value, iRegP addr_ptr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2329
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2330
    Register Rcomp = reg_to_register_object($compare_value$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2331
    Register Rnew  = reg_to_register_object($exchange_value$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2332
    Register Raddr = reg_to_register_object($addr_ptr$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2333
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2334
    __ z_cs(Rcomp, Rnew, 0, Raddr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2335
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2336
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2337
  enc_class z_enc_casL(iRegL compare_value, iRegL exchange_value, iRegP addr_ptr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2338
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2339
    Register Rcomp = reg_to_register_object($compare_value$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2340
    Register Rnew  = reg_to_register_object($exchange_value$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2341
    Register Raddr = reg_to_register_object($addr_ptr$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2342
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2343
    __ z_csg(Rcomp, Rnew, 0, Raddr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2344
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2345
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2346
  enc_class z_enc_SwapI(memoryRSY mem, iRegI dst, iRegI tmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2347
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2348
    Register Rdst = reg_to_register_object($dst$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2349
    Register Rtmp = reg_to_register_object($tmp$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2350
    guarantee(Rdst != Rtmp, "Fix match rule to use TEMP_DEF");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2351
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2352
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2353
    // Iterate until swap succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2354
    __ z_llgf(Rtmp, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2355
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2356
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2357
      __ z_csy(Rtmp, Rdst, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2358
      __ z_brne(retry);                    // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2359
    __ z_lgr(Rdst, Rtmp);                  // Exchanged value from memory is return value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2360
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2361
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2362
  enc_class z_enc_SwapL(memoryRSY mem, iRegL dst, iRegL tmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2363
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2364
    Register Rdst = reg_to_register_object($dst$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2365
    Register Rtmp = reg_to_register_object($tmp$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2366
    guarantee(Rdst != Rtmp, "Fix match rule to use TEMP_DEF");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2367
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2368
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2369
    // Iterate until swap succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2370
    __ z_lg(Rtmp, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2371
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2372
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2373
      __ z_csg(Rtmp, Rdst, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2374
      __ z_brne(retry);                    // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2375
    __ z_lgr(Rdst, Rtmp);                  // Exchanged value from memory is return value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2376
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2377
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2378
%} // encode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2379
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2380
source %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2381
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2382
  // Check whether outs are all Stores. If so, we can omit clearing the upper
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2383
  // 32 bits after encoding.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2384
  static bool all_outs_are_Stores(const Node *n) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2385
    for (DUIterator_Fast imax, k = n->fast_outs(imax); k < imax; k++) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2386
      Node *out = n->fast_out(k);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2387
      if (!out->is_Mach() || out->as_Mach()->ideal_Opcode() != Op_StoreN) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2388
        // Most other outs are SpillCopy, but there are various other.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2389
        // jvm98 has arond 9% Encodes where we return false.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2390
        return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2391
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2392
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2393
    return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2394
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2395
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2396
%} // source
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2397
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2398
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2399
//----------FRAME--------------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2400
// Definition of frame structure and management information.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2401
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2402
frame %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2403
  // What direction does stack grow in (assumed to be same for native & Java).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2404
  stack_direction(TOWARDS_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2405
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2406
  // These two registers define part of the calling convention between
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2407
  // compiled code and the interpreter.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2408
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2409
  // Inline Cache Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2410
  inline_cache_reg(Z_R9); // Z_inline_cache
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2411
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2412
  // Argument pointer for I2C adapters
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2413
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2414
  // Tos is loaded in run_compiled_code to Z_ARG5=Z_R6.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2415
  // interpreter_arg_ptr_reg(Z_R6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2416
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2417
  // Temporary in compiled entry-points
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2418
  // compiler_method_oop_reg(Z_R1);//Z_R1_scratch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2419
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2420
  // Method Oop Register when calling interpreter
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2421
  interpreter_method_oop_reg(Z_R9);//Z_method
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2422
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2423
  // Optional: name the operand used by cisc-spilling to access
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2424
  // [stack_pointer + offset].
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2425
  cisc_spilling_operand_name(indOffset12);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2426
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2427
  // Number of stack slots consumed by a Monitor enter.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2428
  sync_stack_slots(frame::jit_monitor_size_in_4_byte_units);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2429
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2430
  // Compiled code's Frame Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2431
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2432
  // z/Architecture stack pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2433
  frame_pointer(Z_R15); // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2434
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2435
  // Interpreter stores its frame pointer in a register which is
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2436
  // stored to the stack by I2CAdaptors. I2CAdaptors convert from
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2437
  // interpreted java to compiled java.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2438
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2439
  // Z_state holds pointer to caller's cInterpreter.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2440
  interpreter_frame_pointer(Z_R7); // Z_state
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2441
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2442
  // Use alignment_in_bytes instead of log_2_of_alignment_in_bits.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2443
  stack_alignment(frame::alignment_in_bytes);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2444
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2445
  in_preserve_stack_slots(frame::jit_in_preserve_size_in_4_byte_units);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2446
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2447
  // A `slot' is assumed 4 bytes here!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2448
  // out_preserve_stack_slots(frame::jit_out_preserve_size_in_4_byte_units);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2449
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2450
  // Number of outgoing stack slots killed above the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2451
  // out_preserve_stack_slots for calls to C. Supports the var-args
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2452
  // backing area for register parms.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2453
  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
  2454
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2455
  // The after-PROLOG location of the return address. Location of
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2456
  // return address specifies a type (REG or STACK) and a number
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2457
  // representing the register number (i.e. - use a register name) or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2458
  // stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2459
  return_addr(REG Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2460
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2461
  // This is the body of the function
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2462
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2463
  // void Matcher::calling_convention(OptoRegPair* sig /* array of ideal regs */,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2464
  //                                  uint length      /* length of array */,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2465
  //                                  bool is_outgoing)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2466
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2467
  // The `sig' array is to be updated. Sig[j] represents the location
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2468
  // of the j-th argument, either a register or a stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2469
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2470
  // Body of function which returns an integer array locating
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2471
  // arguments either in registers or in stack slots. Passed an array
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2472
  // of ideal registers called "sig" and a "length" count. Stack-slot
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2473
  // offsets are based on outgoing arguments, i.e. a CALLER setting up
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2474
  // arguments for a CALLEE. Incoming stack arguments are
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2475
  // automatically biased by the preserve_stack_slots field above.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2476
  calling_convention %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2477
    // No difference between ingoing/outgoing just pass false.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2478
    SharedRuntime::java_calling_convention(sig_bt, regs, length, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2479
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2480
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2481
  // Body of function which returns an integer array locating
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2482
  // arguments either in registers or in stack slots. Passed an array
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2483
  // of ideal registers called "sig" and a "length" count. Stack-slot
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2484
  // offsets are based on outgoing arguments, i.e. a CALLER setting up
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2485
  // arguments for a CALLEE. Incoming stack arguments are
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2486
  // automatically biased by the preserve_stack_slots field above.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2487
  c_calling_convention %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2488
    // This is obviously always outgoing.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2489
    // C argument must be in register AND stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2490
    (void) SharedRuntime::c_calling_convention(sig_bt, regs, /*regs2=*/NULL, length);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2491
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2492
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2493
  // Location of native (C/C++) and interpreter return values. This
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2494
  // is specified to be the same as Java. In the 32-bit VM, long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2495
  // values are actually returned from native calls in O0:O1 and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2496
  // returned to the interpreter in I0:I1. The copying to and from
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2497
  // the register pairs is done by the appropriate call and epilog
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2498
  // opcodes. This simplifies the register allocator.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2499
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2500
  // Use register pair for c return value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2501
  c_return_value %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2502
    assert(ideal_reg >= Op_RegI && ideal_reg <= Op_RegL, "only return normal values");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2503
    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
  2504
    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
  2505
    return OptoRegPair(typeToRegHi[ideal_reg], typeToRegLo[ideal_reg]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2506
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2507
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2508
  // Use register pair for return value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2509
  // Location of compiled Java return values. Same as C
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2510
  return_value %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2511
    assert(ideal_reg >= Op_RegI && ideal_reg <= Op_RegL, "only return normal values");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2512
    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
  2513
    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
  2514
    return OptoRegPair(typeToRegHi[ideal_reg], typeToRegLo[ideal_reg]);
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
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2518
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2519
//----------ATTRIBUTES---------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2520
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2521
//----------Operand Attributes-------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2522
op_attrib op_cost(1);          // Required cost attribute
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2523
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2524
//----------Instruction Attributes---------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2525
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2526
// Cost attribute. required.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2527
ins_attrib ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2528
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2529
// Is this instruction a non-matching short branch variant of some
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2530
// long branch? Not required.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2531
ins_attrib ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2532
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2533
// Indicates this is a trap based check node and final control-flow fixup
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2534
// must generate a proper fall through.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2535
ins_attrib ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2536
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2537
// Attribute of instruction to tell how many constants the instruction will generate.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2538
// (optional attribute). Default: 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2539
ins_attrib ins_num_consts(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2540
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2541
// Required alignment attribute (must be a power of 2)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2542
// specifies the alignment that some part of the instruction (not
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2543
// necessarily the start) requires. If > 1, a compute_padding()
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2544
// function must be provided for the instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2545
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2546
// WARNING: Don't use size(FIXED_SIZE) or size(VARIABLE_SIZE) in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2547
// instructions which depend on the proper alignment, because the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2548
// desired alignment isn't guaranteed for the call to "emit()" during
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2549
// the size computation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2550
ins_attrib ins_alignment(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2551
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2552
// Enforce/prohibit rematerializations.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2553
// - If an instruction is attributed with 'ins_cannot_rematerialize(true)'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2554
//   then rematerialization of that instruction is prohibited and the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2555
//   instruction's value will be spilled if necessary.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2556
// - If an instruction is attributed with 'ins_should_rematerialize(true)'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2557
//   then rematerialization is enforced and the instruction's value will
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2558
//   never get spilled. a copy of the instruction will be inserted if
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2559
//   necessary.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2560
//   Note: this may result in rematerializations in front of every use.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2561
// (optional attribute)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2562
ins_attrib ins_cannot_rematerialize(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2563
ins_attrib ins_should_rematerialize(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2564
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2565
//----------OPERANDS-----------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2566
// Operand definitions must precede instruction definitions for correct
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2567
// parsing in the ADLC because operands constitute user defined types
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2568
// which are used in instruction definitions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2569
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2570
//----------Simple Operands----------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2571
// Immediate Operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2572
// Please note:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2573
// Formats are generated automatically for constants and base registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2574
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2575
//----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2576
// SIGNED (shorter than INT) immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2577
//----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2578
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2579
// Byte Immediate: constant 'int -1'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2580
operand immB_minus1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2581
  //         sign-ext constant      zero-ext constant
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2582
  predicate((n->get_int() == -1) || ((n->get_int()&0x000000ff) == 0x000000ff));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2583
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2584
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2585
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2586
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2587
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2588
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2589
// Byte Immediate: constant, but not 'int 0' nor 'int -1'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2590
operand immB_n0m1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2591
  //                             sign-ext constant     zero-ext constant
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2592
  predicate(n->get_int() != 0 && n->get_int() != -1 && (n->get_int()&0x000000ff) != 0x000000ff);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2593
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2594
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2595
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2596
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2597
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2598
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2599
// Short Immediate: constant 'int -1'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2600
operand immS_minus1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2601
  //         sign-ext constant      zero-ext constant
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2602
  predicate((n->get_int() == -1) || ((n->get_int()&0x0000ffff) == 0x0000ffff));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2603
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2604
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2605
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2606
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2607
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2608
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2609
// Short Immediate: constant, but not 'int 0' nor 'int -1'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2610
operand immS_n0m1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2611
  //                             sign-ext constant     zero-ext constant
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2612
  predicate(n->get_int() != 0 && n->get_int() != -1 && (n->get_int()&0x0000ffff) != 0x0000ffff);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2613
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2614
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2615
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2616
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2617
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2618
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2619
//-----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2620
//  SIGNED INT immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2621
//-----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2622
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2623
// Integer Immediate: 32-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2624
operand immI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2625
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2626
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2627
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2628
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2629
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2630
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2631
// Int Immediate: 20-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2632
operand immI20() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2633
  predicate(Immediate::is_simm20(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2634
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2635
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2636
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2637
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2638
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2639
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2640
// Integer Immediate: 16-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2641
operand immI16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2642
  predicate(Immediate::is_simm16(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2643
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2644
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2645
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2646
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2647
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2648
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2649
// Integer Immediate: 8-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2650
operand immI8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2651
  predicate(Immediate::is_simm8(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2652
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2653
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2654
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2655
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2656
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2657
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2658
// Integer Immediate: constant 'int 0'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2659
operand immI_0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2660
  predicate(n->get_int() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2661
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2662
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2663
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2664
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2665
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2666
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2667
// Integer Immediate: constant 'int -1'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2668
operand immI_minus1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2669
  predicate(n->get_int() == -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2670
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2671
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2672
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2673
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2674
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2675
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2676
// Integer Immediate: constant, but not 'int 0' nor 'int -1'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2677
operand immI_n0m1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2678
  predicate(n->get_int() != 0 && n->get_int() != -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2679
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2680
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2681
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2682
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2683
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2684
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2685
//-------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2686
// UNSIGNED INT immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2687
//-------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2688
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2689
// Unsigned Integer Immediate: 32-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2690
operand uimmI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2691
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2692
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2693
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2694
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2695
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2696
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2697
// Unsigned Integer Immediate: 16-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2698
operand uimmI16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2699
  predicate(Immediate::is_uimm16(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2700
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2701
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2702
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2703
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2704
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2705
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2706
// Unsigned Integer Immediate: 12-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2707
operand uimmI12() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2708
  predicate(Immediate::is_uimm12(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2709
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2710
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2711
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2712
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2713
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2714
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2715
// Unsigned Integer Immediate: 12-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2716
operand uimmI8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2717
  predicate(Immediate::is_uimm8(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2718
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2719
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2720
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2721
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2722
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2723
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2724
// Integer Immediate: 6-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2725
operand uimmI6() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2726
  predicate(Immediate::is_uimm(n->get_int(), 6));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2727
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2728
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2729
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2730
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2731
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2732
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2733
// Integer Immediate: 5-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2734
operand uimmI5() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2735
  predicate(Immediate::is_uimm(n->get_int(), 5));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2736
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2737
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2738
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2739
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2740
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2741
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2742
// Length for SS instructions, given in DWs,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2743
//   possible range [1..512], i.e. [8..4096] Bytes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2744
//   used     range [1..256], i.e. [8..2048] Bytes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2745
//   operand type int
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2746
// Unsigned Integer Immediate: 9-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2747
operand SSlenDW() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2748
  predicate(Immediate::is_uimm8(n->get_long()-1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2749
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2750
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2751
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2752
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2753
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2754
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2755
//------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2756
// (UN)SIGNED INT specific values
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2757
//------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2758
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2759
// Integer Immediate: the value 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2760
operand immI_1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2761
  predicate(n->get_int() == 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2762
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2763
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2764
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2765
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2766
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2767
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2768
// Integer Immediate: the value 16.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2769
operand immI_16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2770
  predicate(n->get_int() == 16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2771
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2772
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2773
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2774
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2775
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2776
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2777
// Integer Immediate: the value 24.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2778
operand immI_24() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2779
  predicate(n->get_int() == 24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2780
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2781
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2782
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2783
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2784
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2785
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2786
// Integer Immediate: the value 255
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2787
operand immI_255() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2788
  predicate(n->get_int() == 255);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2789
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2790
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2791
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2792
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2793
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2794
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2795
// Integer Immediate: the values 32-63
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2796
operand immI_32_63() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2797
  predicate(n->get_int() >= 32 && n->get_int() <= 63);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2798
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2799
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2800
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2801
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2802
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2803
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2804
// Unsigned Integer Immediate: LL-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2805
operand uimmI_LL1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2806
  predicate((n->get_int() & 0xFFFF0000) == 0xFFFF0000);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2807
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2808
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2809
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2810
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2811
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2812
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2813
// Unsigned Integer Immediate: LH-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2814
operand uimmI_LH1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2815
  predicate((n->get_int() & 0xFFFF) == 0xFFFF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2816
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2817
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2818
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2819
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2820
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2821
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2822
//------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2823
// SIGNED LONG immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2824
//------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2825
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2826
operand immL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2827
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2828
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2829
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2830
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2831
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2832
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2833
// Long Immediate: 32-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2834
operand immL32() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2835
  predicate(Immediate::is_simm32(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2836
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2837
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2838
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2839
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2840
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2841
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2842
// Long Immediate: 20-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2843
operand immL20() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2844
  predicate(Immediate::is_simm20(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2845
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2846
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2847
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2848
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2849
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2850
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2851
// Long Immediate: 16-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2852
operand immL16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2853
  predicate(Immediate::is_simm16(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2854
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2855
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2856
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2857
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2858
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2859
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2860
// Long Immediate: 8-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2861
operand immL8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2862
  predicate(Immediate::is_simm8(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2863
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2864
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2865
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2866
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2867
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2868
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2869
//--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2870
// UNSIGNED LONG immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2871
//--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2872
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2873
operand uimmL32() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2874
  predicate(Immediate::is_uimm32(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2875
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2876
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2877
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2878
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2879
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2880
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2881
// Unsigned Long Immediate: 16-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2882
operand uimmL16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2883
  predicate(Immediate::is_uimm16(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2884
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2885
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2886
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2887
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2888
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2889
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2890
// Unsigned Long Immediate: 12-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2891
operand uimmL12() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2892
  predicate(Immediate::is_uimm12(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2893
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2894
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2895
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2896
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2897
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2898
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2899
// Unsigned Long Immediate: 8-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2900
operand uimmL8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2901
  predicate(Immediate::is_uimm8(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2902
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2903
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2904
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2905
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2906
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2907
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2908
//-------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2909
// (UN)SIGNED LONG specific values
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2910
//-------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2911
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2912
// Long Immediate: the value FF
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2913
operand immL_FF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2914
  predicate(n->get_long() == 0xFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2915
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2916
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2917
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2918
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2919
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2920
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2921
// Long Immediate: the value FFFF
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2922
operand immL_FFFF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2923
  predicate(n->get_long() == 0xFFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2924
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2925
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2926
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2927
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2928
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2929
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2930
// Long Immediate: the value FFFFFFFF
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2931
operand immL_FFFFFFFF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2932
  predicate(n->get_long() == 0xFFFFFFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2933
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2934
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2935
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2936
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2937
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2938
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2939
operand immL_0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2940
  predicate(n->get_long() == 0L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2941
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2942
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2943
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2944
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2945
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2946
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2947
// Unsigned Long Immediate: LL-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2948
operand uimmL_LL1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2949
  predicate((n->get_long() & 0xFFFFFFFFFFFF0000L) == 0xFFFFFFFFFFFF0000L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2950
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2951
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2952
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2953
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2954
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2955
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2956
// Unsigned Long Immediate: LH-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2957
operand uimmL_LH1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2958
  predicate((n->get_long() & 0xFFFFFFFF0000FFFFL) == 0xFFFFFFFF0000FFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2959
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2960
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2961
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2962
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2963
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2964
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2965
// Unsigned Long Immediate: HL-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2966
operand uimmL_HL1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2967
  predicate((n->get_long() & 0xFFFF0000FFFFFFFFL) == 0xFFFF0000FFFFFFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2968
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2969
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2970
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2971
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2972
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2973
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2974
// Unsigned Long Immediate: HH-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2975
operand uimmL_HH1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2976
  predicate((n->get_long() & 0xFFFFFFFFFFFFL) == 0xFFFFFFFFFFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2977
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2978
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2979
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2980
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2981
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2982
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2983
// Long Immediate: low 32-bit mask
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2984
operand immL_32bits() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2985
  predicate(n->get_long() == 0xFFFFFFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2986
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2987
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2988
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2989
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2990
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2991
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2992
//--------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2993
//  POINTER immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2994
//--------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2995
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2996
// Pointer Immediate: 64-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2997
operand immP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2998
  match(ConP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2999
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3000
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3001
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3002
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3003
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3004
// Pointer Immediate: 32-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3005
operand immP32() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3006
  predicate(Immediate::is_uimm32(n->get_ptr()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3007
  match(ConP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3008
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3009
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3010
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3011
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3012
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3013
// Pointer Immediate: 16-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3014
operand immP16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3015
  predicate(Immediate::is_uimm16(n->get_ptr()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3016
  match(ConP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3017
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3018
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3019
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3020
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3021
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3022
// Pointer Immediate: 8-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3023
operand immP8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3024
  predicate(Immediate::is_uimm8(n->get_ptr()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3025
  match(ConP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3026
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3027
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3028
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3029
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3030
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3031
//-----------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3032
// POINTER specific values
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3033
//-----------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3034
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3035
// Pointer Immediate: NULL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3036
operand immP0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3037
  predicate(n->get_ptr() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3038
  match(ConP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3039
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3040
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3041
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3042
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3043
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3044
//---------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3045
// NARROW POINTER immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3046
//---------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3047
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3048
// Narrow Pointer Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3049
operand immN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3050
  match(ConN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3051
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3052
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3053
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3054
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3055
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3056
operand immNKlass() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3057
  match(ConNKlass);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3058
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3059
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3060
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3061
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3062
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3063
// Narrow Pointer Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3064
operand immN8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3065
  predicate(Immediate::is_uimm8(n->get_narrowcon()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3066
  match(ConN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3067
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3068
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3069
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3070
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3071
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3072
// Narrow NULL Pointer Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3073
operand immN0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3074
  predicate(n->get_narrowcon() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3075
  match(ConN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3076
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3077
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3078
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3079
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3080
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3081
// FLOAT and DOUBLE immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3082
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3083
// Double Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3084
operand immD() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3085
  match(ConD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3086
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3087
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3088
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3089
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3090
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3091
// Double Immediate: +-0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3092
operand immDpm0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3093
  predicate(n->getd() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3094
  match(ConD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3095
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3096
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3097
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3098
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3099
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3100
// Double Immediate: +0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3101
operand immDp0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3102
  predicate(jlong_cast(n->getd()) == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3103
  match(ConD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3104
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3105
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3106
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3107
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3108
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3109
// Float Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3110
operand immF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3111
  match(ConF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3112
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3113
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3114
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3115
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3116
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3117
// Float Immediate: +-0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3118
operand immFpm0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3119
  predicate(n->getf() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3120
  match(ConF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3121
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3122
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3123
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3124
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3125
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3126
// Float Immediate: +0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3127
operand immFp0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3128
  predicate(jint_cast(n->getf()) == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3129
  match(ConF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3130
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3131
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3132
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3133
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3134
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3135
// End of Immediate Operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3136
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3137
// Integer Register Operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3138
// Integer Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3139
operand iRegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3140
  constraint(ALLOC_IN_RC(z_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3141
  match(RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3142
  match(noArg_iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3143
  match(rarg1RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3144
  match(rarg2RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3145
  match(rarg3RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3146
  match(rarg4RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3147
  match(rarg5RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3148
  match(noOdd_iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3149
  match(revenRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3150
  match(roddRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3151
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3152
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3153
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3154
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3155
operand noArg_iRegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3156
  constraint(ALLOC_IN_RC(z_no_arg_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3157
  match(RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3158
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3159
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3160
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3161
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3162
// Revenregi and roddRegI constitute and even-odd-pair.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3163
operand revenRegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3164
  constraint(ALLOC_IN_RC(z_rarg3_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3165
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3166
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3167
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3168
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3169
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3170
// Revenregi and roddRegI constitute and even-odd-pair.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3171
operand roddRegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3172
  constraint(ALLOC_IN_RC(z_rarg4_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3173
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3174
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3175
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3176
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3177
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3178
operand rarg1RegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3179
  constraint(ALLOC_IN_RC(z_rarg1_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3180
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3181
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3182
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3183
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3184
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3185
operand rarg2RegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3186
  constraint(ALLOC_IN_RC(z_rarg2_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3187
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3188
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3189
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3190
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3191
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3192
operand rarg3RegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3193
  constraint(ALLOC_IN_RC(z_rarg3_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3194
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3195
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3196
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3197
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3198
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3199
operand rarg4RegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3200
  constraint(ALLOC_IN_RC(z_rarg4_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3201
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3202
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3203
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3204
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3205
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3206
operand rarg5RegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3207
  constraint(ALLOC_IN_RC(z_rarg5_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3208
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3209
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3210
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3211
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3212
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3213
operand noOdd_iRegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3214
  constraint(ALLOC_IN_RC(z_no_odd_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3215
  match(RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3216
  match(revenRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3217
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3218
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3219
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3220
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3221
// Pointer Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3222
operand iRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3223
  constraint(ALLOC_IN_RC(z_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3224
  match(RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3225
  match(noArg_iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3226
  match(rarg1RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3227
  match(rarg2RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3228
  match(rarg3RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3229
  match(rarg4RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3230
  match(rarg5RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3231
  match(revenRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3232
  match(roddRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3233
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3234
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3235
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3236
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3237
// thread operand
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3238
operand threadRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3239
  constraint(ALLOC_IN_RC(z_thread_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3240
  match(RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3241
  format %{ "Z_THREAD" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3242
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3243
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3244
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3245
operand noArg_iRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3246
  constraint(ALLOC_IN_RC(z_no_arg_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3247
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3248
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3249
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3250
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3251
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3252
operand rarg1RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3253
  constraint(ALLOC_IN_RC(z_rarg1_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3254
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3255
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3256
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3257
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3258
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3259
operand rarg2RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3260
  constraint(ALLOC_IN_RC(z_rarg2_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3261
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3262
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3263
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3264
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3265
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3266
operand rarg3RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3267
  constraint(ALLOC_IN_RC(z_rarg3_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3268
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3269
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3270
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3271
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3272
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3273
operand rarg4RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3274
  constraint(ALLOC_IN_RC(z_rarg4_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3275
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3276
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3277
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3278
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3279
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3280
operand rarg5RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3281
  constraint(ALLOC_IN_RC(z_rarg5_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3282
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3283
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3284
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3285
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3286
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3287
operand memoryRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3288
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3289
  match(RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3290
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3291
  match(threadRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3292
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3293
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3294
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3295
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3296
// Revenregp and roddRegP constitute and even-odd-pair.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3297
operand revenRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3298
  constraint(ALLOC_IN_RC(z_rarg3_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3299
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3300
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3301
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3302
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3303
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3304
// Revenregl and roddRegL constitute and even-odd-pair.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3305
operand roddRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3306
  constraint(ALLOC_IN_RC(z_rarg4_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3307
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3308
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3309
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3310
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3311
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3312
operand lock_ptr_RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3313
  constraint(ALLOC_IN_RC(z_lock_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3314
  match(RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3315
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3316
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3317
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3318
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3319
operand rscratch2RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3320
  constraint(ALLOC_IN_RC(z_rscratch2_bits64_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3321
  match(RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3322
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3323
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3324
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3325
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3326
operand iRegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3327
  constraint(ALLOC_IN_RC(z_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3328
  match(RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3329
  match(noArg_iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3330
  match(rarg1RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3331
  match(rarg2RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3332
  match(rarg3RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3333
  match(rarg4RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3334
  match(rarg5RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3335
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3336
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3337
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3338
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3339
operand noArg_iRegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3340
  constraint(ALLOC_IN_RC(z_no_arg_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3341
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3342
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3343
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3344
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3345
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3346
operand rarg1RegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3347
  constraint(ALLOC_IN_RC(z_rarg1_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3348
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3349
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3350
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3351
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3352
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3353
operand rarg2RegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3354
  constraint(ALLOC_IN_RC(z_rarg2_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3355
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3356
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3357
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3358
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3359
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3360
operand rarg3RegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3361
  constraint(ALLOC_IN_RC(z_rarg3_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3362
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3363
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3364
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3365
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3366
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3367
operand rarg4RegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3368
  constraint(ALLOC_IN_RC(z_rarg4_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3369
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3370
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3371
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3372
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3373
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3374
operand rarg5RegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3375
  constraint(ALLOC_IN_RC(z_rarg5_ptrN_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3376
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3377
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3378
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3379
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3380
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3381
// Long Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3382
operand iRegL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3383
  constraint(ALLOC_IN_RC(z_long_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3384
  match(RegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3385
  match(revenRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3386
  match(roddRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3387
  match(rarg1RegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3388
  match(rarg5RegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3389
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3390
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3391
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3392
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3393
// Revenregl and roddRegL constitute and even-odd-pair.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3394
operand revenRegL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3395
  constraint(ALLOC_IN_RC(z_rarg3_long_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3396
  match(iRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3397
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3398
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3399
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3400
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3401
// Revenregl and roddRegL constitute and even-odd-pair.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3402
operand roddRegL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3403
  constraint(ALLOC_IN_RC(z_rarg4_long_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3404
  match(iRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3405
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3406
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3407
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3408
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3409
operand rarg1RegL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3410
  constraint(ALLOC_IN_RC(z_rarg1_long_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3411
  match(iRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3412
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3413
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3414
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3415
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3416
operand rarg5RegL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3417
  constraint(ALLOC_IN_RC(z_rarg5_long_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3418
  match(iRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3419
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3420
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3421
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3422
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3423
// Condition Code Flag Registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3424
operand flagsReg() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3425
  constraint(ALLOC_IN_RC(z_condition_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3426
  match(RegFlags);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3427
  format %{ "CR" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3428
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3429
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3430
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3431
// Condition Code Flag Registers for rules with result tuples
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3432
operand TD_flagsReg() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3433
  constraint(ALLOC_IN_RC(z_condition_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3434
  match(RegFlags);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3435
  format %{ "CR" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3436
  interface(REG_TUPLE_DEST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3437
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3438
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3439
operand regD() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3440
  constraint(ALLOC_IN_RC(z_dbl_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3441
  match(RegD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3442
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3443
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3444
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3445
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3446
operand rscratchRegD() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3447
  constraint(ALLOC_IN_RC(z_rscratch1_dbl_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3448
  match(RegD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3449
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3450
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3451
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3452
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3453
operand regF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3454
  constraint(ALLOC_IN_RC(z_flt_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3455
  match(RegF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3456
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3457
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3458
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3459
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3460
operand rscratchRegF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3461
  constraint(ALLOC_IN_RC(z_rscratch1_flt_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3462
  match(RegF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3463
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3464
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3465
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3466
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3467
// Special Registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3468
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3469
// Method Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3470
operand inline_cache_regP(iRegP reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3471
  constraint(ALLOC_IN_RC(z_r9_regP)); // inline_cache_reg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3472
  match(reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3473
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3474
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3475
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3476
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3477
operand compiler_method_oop_regP(iRegP reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3478
  constraint(ALLOC_IN_RC(z_r1_RegP)); // compiler_method_oop_reg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3479
  match(reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3480
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3481
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3482
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3483
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3484
operand interpreter_method_oop_regP(iRegP reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3485
  constraint(ALLOC_IN_RC(z_r9_regP)); // interpreter_method_oop_reg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3486
  match(reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3487
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3488
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3489
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3490
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3491
// Operands to remove register moves in unscaled mode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3492
// 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
  3493
operand iRegP2N(iRegP reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3494
  predicate(Universe::narrow_oop_shift() == 0 && _leaf->as_EncodeP()->in(0) == NULL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3495
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3496
  match(EncodeP reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3497
  format %{ "$reg" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3498
  interface(REG_INTER)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3499
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3500
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3501
operand iRegN2P(iRegN reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3502
  predicate(Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0 &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3503
            _leaf->as_DecodeN()->in(0) == NULL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3504
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3505
  match(DecodeN reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3506
  format %{ "$reg" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3507
  interface(REG_INTER)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3508
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3509
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3510
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3511
//----------Complex Operands---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3512
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3513
// Indirect Memory Reference
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3514
operand indirect(memoryRegP base) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3515
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3516
  match(base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3517
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3518
  format %{ "#0[,$base]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3519
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3520
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3521
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3522
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3523
    disp(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3524
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3525
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3526
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3527
// Indirect with Offset (long)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3528
operand indOffset20(memoryRegP base, immL20 offset) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3529
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3530
  match(AddP base offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3531
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3532
  format %{ "$offset[,$base]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3533
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3534
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3535
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3536
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3537
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3538
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3539
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3540
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3541
operand indOffset20Narrow(iRegN base, immL20 offset) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3542
  predicate(Matcher::narrow_oop_use_complex_address());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3543
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3544
  match(AddP (DecodeN base) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3545
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3546
  format %{ "$offset[,$base]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3547
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3548
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3549
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3550
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3551
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3552
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3553
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3554
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3555
// Indirect with Offset (short)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3556
operand indOffset12(memoryRegP base, uimmL12 offset) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3557
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3558
  match(AddP base offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3559
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3560
  format %{ "$offset[[,$base]]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3561
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3562
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3563
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3564
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3565
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3566
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3567
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3568
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3569
operand indOffset12Narrow(iRegN base, uimmL12 offset) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3570
  predicate(Matcher::narrow_oop_use_complex_address());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3571
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3572
  match(AddP (DecodeN base) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3573
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3574
  format %{ "$offset[[,$base]]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3575
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3576
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3577
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3578
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3579
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3580
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3581
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3582
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3583
// Indirect with Register Index
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3584
operand indIndex(memoryRegP base, iRegL index) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3585
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3586
  match(AddP base index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3587
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3588
  format %{ "#0[($index,$base)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3589
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3590
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3591
    index($index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3592
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3593
    disp(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3594
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3595
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3596
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3597
// Indirect with Offset (long) and index
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3598
operand indOffset20index(memoryRegP base, immL20 offset, iRegL index) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3599
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3600
  match(AddP (AddP base index) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3601
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3602
  format %{ "$offset[($index,$base)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3603
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3604
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3605
    index($index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3606
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3607
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3608
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3609
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3610
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3611
operand indOffset20indexNarrow(iRegN base, immL20 offset, iRegL index) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3612
  predicate(Matcher::narrow_oop_use_complex_address());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3613
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3614
  match(AddP (AddP (DecodeN base) index) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3615
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3616
  format %{ "$offset[($index,$base)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3617
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3618
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3619
    index($index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3620
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3621
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3622
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3623
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3624
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3625
// Indirect with Offset (short) and index
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3626
operand indOffset12index(memoryRegP base, uimmL12 offset, iRegL index) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3627
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3628
  match(AddP (AddP base index) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3629
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3630
  format %{ "$offset[[($index,$base)]]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3631
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3632
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3633
    index($index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3634
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3635
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3636
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3637
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3638
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3639
operand indOffset12indexNarrow(iRegN base, uimmL12 offset, iRegL index) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3640
  predicate(Matcher::narrow_oop_use_complex_address());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3641
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3642
  match(AddP (AddP (DecodeN base) index) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3643
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3644
  format %{ "$offset[[($index,$base)]]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3645
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3646
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3647
    index($index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3648
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3649
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3650
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3651
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3652
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3653
//----------Special Memory Operands--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3654
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3655
// Stack Slot Operand
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3656
// This operand is used for loading and storing temporary values on
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3657
// the stack where a match requires a value to flow through memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3658
operand stackSlotI(sRegI reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3659
  constraint(ALLOC_IN_RC(stack_slots));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3660
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3661
  format %{ "[$reg(stackSlotI)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3662
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3663
    base(0xf);   // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3664
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3665
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3666
    disp($reg);  // stack offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3667
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3668
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3669
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3670
operand stackSlotP(sRegP reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3671
  constraint(ALLOC_IN_RC(stack_slots));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3672
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3673
  format %{ "[$reg(stackSlotP)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3674
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3675
    base(0xf);   // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3676
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3677
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3678
    disp($reg);  // Stack Offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3679
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3680
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3681
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3682
operand stackSlotF(sRegF reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3683
  constraint(ALLOC_IN_RC(stack_slots));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3684
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3685
  format %{ "[$reg(stackSlotF)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3686
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3687
    base(0xf);   // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3688
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3689
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3690
    disp($reg);  // Stack Offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3691
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3692
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3693
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3694
operand stackSlotD(sRegD reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3695
  constraint(ALLOC_IN_RC(stack_slots));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3696
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3697
  //match(RegD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3698
  format %{ "[$reg(stackSlotD)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3699
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3700
    base(0xf);   // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3701
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3702
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3703
    disp($reg);  // Stack Offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3704
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3705
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3706
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3707
operand stackSlotL(sRegL reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3708
  constraint(ALLOC_IN_RC(stack_slots));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3709
  op_cost(1);  //match(RegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3710
  format %{ "[$reg(stackSlotL)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3711
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3712
    base(0xf);   // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3713
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3714
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3715
    disp($reg);  // Stack Offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3716
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3717
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3718
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3719
// Operands for expressing Control Flow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3720
// NOTE: Label is a predefined operand which should not be redefined in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3721
// the AD file. It is generically handled within the ADLC.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3722
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3723
//----------Conditional Branch Operands----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3724
// Comparison Op  - This is the operation of the comparison, and is limited to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3725
//                  the following set of codes:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3726
//                  L (<), LE (<=), G (>), GE (>=), E (==), NE (!=)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3727
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3728
// Other attributes of the comparison, such as unsignedness, are specified
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3729
// by the comparison instruction that sets a condition code flags register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3730
// That result is represented by a flags operand whose subtype is appropriate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3731
// to the unsignedness (etc.) of the comparison.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3732
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3733
// Later, the instruction which matches both the Comparison Op (a Bool) and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3734
// the flags (produced by the Cmp) specifies the coding of the comparison op
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3735
// by matching a specific subtype of Bool operand below.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3736
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3737
// INT cmpOps for CompareAndBranch and CompareAndTrap instructions should not
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3738
// have mask bit #3 set.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3739
operand cmpOpT() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3740
  match(Bool);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3741
  format %{ "" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3742
  interface(COND_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3743
    equal(0x8);         // Assembler::bcondEqual
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3744
    not_equal(0x6);     // Assembler::bcondNotEqual
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3745
    less(0x4);          // Assembler::bcondLow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3746
    greater_equal(0xa); // Assembler::bcondNotLow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3747
    less_equal(0xc);    // Assembler::bcondNotHigh
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3748
    greater(0x2);       // Assembler::bcondHigh
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3749
    overflow(0x1);      // Assembler::bcondOverflow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3750
    no_overflow(0xe);   // Assembler::bcondNotOverflow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3751
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3752
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3753
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3754
// When used for floating point comparisons: unordered is treated as less.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3755
operand cmpOpF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3756
  match(Bool);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3757
  format %{ "" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3758
  interface(COND_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3759
    equal(0x8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3760
    not_equal(0x7);     // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3761
    less(0x5);          // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3762
    greater_equal(0xa);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3763
    less_equal(0xd);    // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3764
    greater(0x2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3765
    overflow(0x0);      // Not meaningful on z/Architecture.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3766
    no_overflow(0x0);   // leave unchanged (zero) therefore
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3767
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3768
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3769
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3770
// "Regular" cmpOp for int comparisons, includes bit #3 (overflow).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3771
operand cmpOp() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3772
  match(Bool);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3773
  format %{ "" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3774
  interface(COND_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3775
    equal(0x8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3776
    not_equal(0x7);     // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3777
    less(0x5);          // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3778
    greater_equal(0xa);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3779
    less_equal(0xd);    // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3780
    greater(0x2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3781
    overflow(0x1);      // Assembler::bcondOverflow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3782
    no_overflow(0xe);   // Assembler::bcondNotOverflow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3783
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3784
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3785
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3786
//----------OPERAND CLASSES----------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3787
// Operand Classes are groups of operands that are used to simplify
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3788
// instruction definitions by not requiring the AD writer to specify
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3789
// seperate instructions for every form of operand when the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3790
// instruction accepts multiple operand types with the same basic
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3791
// encoding and format.  The classic case of this is memory operands.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3792
// Indirect is not included since its use is limited to Compare & Swap
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3793
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3794
// Most general memory operand, allows base, index, and long displacement.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3795
opclass memory(indirect, indIndex, indOffset20, indOffset20Narrow, indOffset20index, indOffset20indexNarrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3796
opclass memoryRXY(indirect, indIndex, indOffset20, indOffset20Narrow, indOffset20index, indOffset20indexNarrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3797
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3798
// General memory operand, allows base, index, and short displacement.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3799
opclass memoryRX(indirect, indIndex, indOffset12, indOffset12Narrow, indOffset12index, indOffset12indexNarrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3800
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3801
// Memory operand, allows only base and long displacement.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3802
opclass memoryRSY(indirect, indOffset20, indOffset20Narrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3803
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3804
// Memory operand, allows only base and short displacement.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3805
opclass memoryRS(indirect, indOffset12, indOffset12Narrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3806
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3807
// Operand classes to match encode and decode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3808
opclass iRegN_P2N(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3809
opclass iRegP_N2P(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3810
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3811
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3812
//----------PIPELINE-----------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3813
pipeline %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3814
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3815
//----------ATTRIBUTES---------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3816
attributes %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3817
  // z/Architecture instructions are of length 2, 4, or 6 bytes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3818
  variable_size_instructions;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3819
  instruction_unit_size = 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3820
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3821
  // Meaningless on z/Architecture.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3822
  max_instructions_per_bundle = 1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3823
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3824
  // The z/Architecture processor fetches 64 bytes...
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3825
  instruction_fetch_unit_size = 64;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3826
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3827
  // ...in one line.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3828
  instruction_fetch_units = 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3829
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3830
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3831
//----------RESOURCES----------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3832
// Resources are the functional units available to the machine.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3833
resources(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3834
   Z_BR,     // branch unit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3835
   Z_CR,     // condition unit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3836
   Z_FX1,    // integer arithmetic unit 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3837
   Z_FX2,    // integer arithmetic unit 2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3838
   Z_LDST1,  // load/store unit 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3839
   Z_LDST2,  // load/store unit 2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3840
   Z_FP1,    // float arithmetic unit 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3841
   Z_FP2,    // float arithmetic unit 2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3842
   Z_LDST = Z_LDST1 | Z_LDST2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3843
   Z_FX   = Z_FX1 | Z_FX2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3844
   Z_FP   = Z_FP1 | Z_FP2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3845
  );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3846
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3847
//----------PIPELINE DESCRIPTION-----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3848
// Pipeline Description specifies the stages in the machine's pipeline.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3849
pipe_desc(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3850
   // TODO: adapt
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3851
   Z_IF,  // instruction fetch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3852
   Z_IC,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3853
   Z_D0,  // decode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3854
   Z_D1,  // decode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3855
   Z_D2,  // decode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3856
   Z_D3,  // decode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3857
   Z_Xfer1,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3858
   Z_GD,  // group definition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3859
   Z_MP,  // map
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3860
   Z_ISS, // issue
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3861
   Z_RF,  // resource fetch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3862
   Z_EX1, // execute (all units)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3863
   Z_EX2, // execute (FP, LDST)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3864
   Z_EX3, // execute (FP, LDST)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3865
   Z_EX4, // execute (FP)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3866
   Z_EX5, // execute (FP)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3867
   Z_EX6, // execute (FP)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3868
   Z_WB,  // write back
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3869
   Z_Xfer2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3870
   Z_CP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3871
  );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3872
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3873
//----------PIPELINE CLASSES---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3874
// Pipeline Classes describe the stages in which input and output are
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3875
// referenced by the hardware pipeline.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3876
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3877
// Providing the `ins_pipe' declarations in the instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3878
// specifications seems to be of little use. So we use
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3879
// `pipe_class_dummy' for all our instructions at present.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3880
pipe_class pipe_class_dummy() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3881
  single_instruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3882
  fixed_latency(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3883
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3884
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3885
// SIGTRAP based implicit range checks in compiled code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3886
// Currently, no pipe classes are used on z/Architecture.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3887
pipe_class pipe_class_trap() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3888
  single_instruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3889
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3890
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3891
pipe_class pipe_class_fx_reg_reg(iRegI dst, iRegI src1, iRegI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3892
  single_instruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3893
  dst  : Z_EX1(write);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3894
  src1 : Z_RF(read);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3895
  src2 : Z_RF(read);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3896
  Z_FX : Z_RF;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3897
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3898
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3899
pipe_class pipe_class_ldst(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3900
  single_instruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3901
  mem : Z_RF(read);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3902
  dst : Z_WB(write);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3903
  Z_LDST : Z_RF;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3904
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3905
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3906
define %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3907
  MachNop = pipe_class_dummy;
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
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3911
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3912
//----------INSTRUCTIONS-------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3913
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3914
//---------- Chain stack slots between similar types --------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3915
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3916
// Load integer from stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3917
instruct stkI_to_regI(iRegI dst, stackSlotI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3918
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3919
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3920
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3921
  format %{ "L       $dst,$src\t # stk reload int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3922
  opcode(L_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3923
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3924
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3925
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3926
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3927
// Store integer to stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3928
instruct regI_to_stkI(stackSlotI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3929
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3930
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3931
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3932
  format %{ "ST      $src,$dst\t # stk spill int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3933
  opcode(ST_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3934
  ins_encode(z_form_rt_mem(src, dst)); // rs=rt
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3935
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3936
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3937
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3938
// Load long from stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3939
instruct stkL_to_regL(iRegL dst, stackSlotL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3940
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3941
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3942
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3943
  format %{ "LG      $dst,$src\t # stk reload long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3944
  opcode(LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3945
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3946
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3947
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3948
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3949
// Store long to stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3950
instruct regL_to_stkL(stackSlotL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3951
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3952
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3953
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3954
  format %{ "STG     $src,$dst\t # stk spill long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3955
  opcode(STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3956
  ins_encode(z_form_rt_mem(src, dst)); // rs=rt
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3957
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3958
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3959
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3960
// Load pointer from stack slot, 64-bit encoding.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3961
instruct stkP_to_regP(iRegP dst, stackSlotP src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3962
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3963
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3964
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3965
  format %{ "LG      $dst,$src\t # stk reload ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3966
  opcode(LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3967
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3968
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3969
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3970
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3971
// Store pointer to stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3972
instruct regP_to_stkP(stackSlotP dst, iRegP src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3973
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3974
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3975
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3976
  format %{ "STG     $src,$dst\t # stk spill ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3977
  opcode(STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3978
  ins_encode(z_form_rt_mem(src, dst)); // rs=rt
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3979
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3980
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3981
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3982
//  Float types
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3983
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3984
// Load float value from stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3985
instruct stkF_to_regF(regF dst, stackSlotF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3986
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3987
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3988
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3989
  format %{ "LE(Y)   $dst,$src\t # stk reload float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3990
  opcode(LE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3991
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3992
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3993
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3994
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3995
// Store float value to stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3996
instruct regF_to_stkF(stackSlotF dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3997
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3998
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3999
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4000
  format %{ "STE(Y)  $src,$dst\t # stk spill float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4001
  opcode(STE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4002
  ins_encode(z_form_rt_mem(src, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4003
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4004
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4005
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4006
// Load double value from stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4007
instruct stkD_to_regD(regD dst, stackSlotD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4008
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4009
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4010
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4011
  format %{ "LD(Y)   $dst,$src\t # stk reload double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4012
  opcode(LD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4013
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4014
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4015
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4016
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4017
// Store double value to stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4018
instruct regD_to_stkD(stackSlotD dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4019
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4020
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4021
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4022
  format %{ "STD(Y)  $src,$dst\t # stk spill double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4023
  opcode(STD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4024
  ins_encode(z_form_rt_mem(src, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4025
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4026
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4027
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4028
//----------Load/Store/Move Instructions---------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4029
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4030
//----------Load Instructions--------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4031
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4032
//------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4033
//  MEMORY
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4034
//------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4035
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4036
//  BYTE
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4037
// Load Byte (8bit signed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4038
instruct loadB(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4039
  match(Set dst (LoadB mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4040
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4041
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4042
  format %{ "LB      $dst, $mem\t # sign-extend byte to int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4043
  opcode(LB_ZOPC, LB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4044
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4045
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4046
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4047
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4048
// Load Byte (8bit signed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4049
instruct loadB2L(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4050
  match(Set dst (ConvI2L (LoadB mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4051
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4052
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4053
  format %{ "LGB     $dst, $mem\t # sign-extend byte to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4054
  opcode(LGB_ZOPC, LGB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4055
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4056
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4057
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4058
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4059
// Load Unsigned Byte (8bit UNsigned) into an int reg.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4060
instruct loadUB(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4061
  match(Set dst (LoadUB mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4062
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4063
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4064
  format %{ "LLGC    $dst,$mem\t # zero-extend byte to int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4065
  opcode(LLGC_ZOPC, LLGC_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4066
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4067
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4068
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4069
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4070
// Load Unsigned Byte (8bit UNsigned) into a Long Register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4071
instruct loadUB2L(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4072
  match(Set dst (ConvI2L (LoadUB mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4073
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4074
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4075
  format %{ "LLGC    $dst,$mem\t # zero-extend byte to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4076
  opcode(LLGC_ZOPC, LLGC_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4077
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4078
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4079
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4080
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4081
// CHAR/SHORT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4082
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4083
// Load Short (16bit signed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4084
instruct loadS(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4085
  match(Set dst (LoadS mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4086
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4087
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4088
  format %{ "LH(Y)   $dst,$mem\t # sign-extend short to int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4089
  opcode(LHY_ZOPC, LH_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4090
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4091
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4092
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4093
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4094
// Load Short (16bit signed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4095
instruct loadS2L(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4096
  match(Set dst (ConvI2L (LoadS mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4097
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4098
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4099
  format %{ "LGH     $dst,$mem\t # sign-extend short to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4100
  opcode(LGH_ZOPC, LGH_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4101
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4102
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4103
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4104
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4105
// Load Char (16bit Unsigned)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4106
instruct loadUS(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4107
  match(Set dst (LoadUS mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4108
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4109
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4110
  format %{ "LLGH    $dst,$mem\t # zero-extend short to int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4111
  opcode(LLGH_ZOPC, LLGH_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4112
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4113
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4114
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4115
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4116
// Load Unsigned Short/Char (16bit UNsigned) into a Long Register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4117
instruct loadUS2L(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4118
  match(Set dst (ConvI2L (LoadUS mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4119
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4120
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4121
  format %{ "LLGH    $dst,$mem\t # zero-extend short to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4122
  opcode(LLGH_ZOPC, LLGH_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4123
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4124
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4125
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4126
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4127
// INT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4128
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4129
// Load Integer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4130
instruct loadI(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4131
  match(Set dst (LoadI mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4132
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4133
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4134
  format %{ "L(Y)    $dst,$mem\t #" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4135
  opcode(LY_ZOPC, L_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4136
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4137
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4138
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4139
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4140
// Load and convert to long.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4141
instruct loadI2L(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4142
  match(Set dst (ConvI2L (LoadI mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4143
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4144
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4145
  format %{ "LGF     $dst,$mem\t #" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4146
  opcode(LGF_ZOPC, LGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4147
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4148
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4149
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4150
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4151
// Load Unsigned Integer into a Long Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4152
instruct loadUI2L(iRegL dst, memory mem, immL_FFFFFFFF mask) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4153
  match(Set dst (AndL (ConvI2L (LoadI mem)) mask));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4154
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4155
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4156
  format %{ "LLGF    $dst,$mem\t # zero-extend int to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4157
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4158
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4159
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4160
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4161
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4162
// range = array length (=jint)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4163
// Load Range
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4164
instruct loadRange(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4165
  match(Set dst (LoadRange mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4166
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4167
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4168
  format %{ "L(Y)    $dst,$mem\t # range" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4169
  opcode(LY_ZOPC, L_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4170
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4171
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4172
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4173
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4174
// LONG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4175
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4176
// Load Long - aligned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4177
instruct loadL(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4178
  match(Set dst (LoadL mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4179
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4180
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4181
  format %{ "LG      $dst,$mem\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4182
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4183
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4184
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4185
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4186
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4187
// Load Long - UNaligned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4188
instruct loadL_unaligned(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4189
  match(Set dst (LoadL_unaligned mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4190
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4191
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4192
  format %{ "LG      $dst,$mem\t # unaligned long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4193
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4194
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4195
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4196
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4197
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4198
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4199
// PTR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4200
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4201
// Load Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4202
instruct loadP(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4203
  match(Set dst (LoadP mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4204
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4205
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4206
  format %{ "LG      $dst,$mem\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4207
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4208
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4209
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4210
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4211
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4212
// LoadP + CastP2L
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4213
instruct castP2X_loadP(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4214
  match(Set dst (CastP2X (LoadP mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4215
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4216
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4217
  format %{ "LG      $dst,$mem\t # ptr + p2x" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4218
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4219
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4220
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4221
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4222
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4223
// Load Klass Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4224
instruct loadKlass(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4225
  match(Set dst (LoadKlass mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4226
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4227
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4228
  format %{ "LG      $dst,$mem\t # klass ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4229
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4230
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4231
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4232
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4233
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4234
instruct loadTOC(iRegL dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4235
  effect(DEF dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4236
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4237
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4238
  // TODO: check why this attribute causes many unnecessary rematerializations.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4239
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4240
  // The graphs I saw just had high register pressure. Further the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4241
  // register TOC is loaded to is overwritten by the constant short
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4242
  // after. Here something as round robin register allocation might
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4243
  // help. But rematerializing seems not to hurt, jack even seems to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4244
  // improve slightly.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4245
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4246
  // Without this flag we get spill-split recycle sanity check
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4247
  // failures in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4248
  // spec.benchmarks._228_jack.NfaState::GenerateCode. This happens in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4249
  // a block with three loadConP_dynTOC nodes and a tlsLoadP. The
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4250
  // tlsLoadP has a huge amount of outs and forces the TOC down to the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4251
  // stack. Later tlsLoadP is rematerialized, leaving the register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4252
  // allocator with TOC on the stack and a badly placed reload.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4253
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4254
  format %{ "LARL    $dst, &constant_pool\t; load dynTOC" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4255
  ins_encode %{ __ load_toc($dst$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4256
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4257
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4258
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4259
// FLOAT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4260
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4261
// Load Float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4262
instruct loadF(regF dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4263
  match(Set dst (LoadF mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4264
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4265
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4266
  format %{ "LE(Y)    $dst,$mem" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4267
  opcode(LEY_ZOPC, LE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4268
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4269
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4270
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4271
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4272
// DOUBLE
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4273
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4274
// Load Double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4275
instruct loadD(regD dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4276
  match(Set dst (LoadD mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4277
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4278
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4279
  format %{ "LD(Y)    $dst,$mem" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4280
  opcode(LDY_ZOPC, LD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4281
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4282
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4283
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4284
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4285
// Load Double - UNaligned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4286
instruct loadD_unaligned(regD dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4287
  match(Set dst (LoadD_unaligned mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4288
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4289
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4290
  format %{ "LD(Y)    $dst,$mem" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4291
  opcode(LDY_ZOPC, LD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4292
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4293
  ins_pipe(pipe_class_dummy);
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
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4297
//----------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4298
//  IMMEDIATES
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4299
//----------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4300
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4301
instruct loadConI(iRegI dst, immI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4302
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4303
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4304
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4305
  format %{ "LGFI     $dst,$src\t # (int)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4306
  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
  4307
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4308
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4309
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4310
instruct loadConI16(iRegI dst, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4311
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4312
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4313
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4314
  format %{ "LGHI     $dst,$src\t # (int)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4315
  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
  4316
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4317
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4318
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4319
instruct loadConI_0(iRegI dst, immI_0 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4320
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4321
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4322
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4323
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4324
  format %{ "loadConI $dst,$src\t # (int) XGR because ZERO is loaded" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4325
  opcode(XGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4326
  ins_encode(z_rreform(dst, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4327
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4328
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4329
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4330
instruct loadConUI16(iRegI dst, uimmI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4331
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4332
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4333
  format %{ "LLILL    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4334
  opcode(LLILL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4335
  ins_encode(z_riform_unsigned(dst, src) );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4336
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4337
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4338
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4339
// Load long constant from TOC with pcrelative address.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4340
instruct loadConL_pcrelTOC(iRegL dst, immL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4341
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4342
  ins_cost(MEMORY_REF_COST_LO);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4343
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4344
  format %{ "LGRL    $dst,[pcrelTOC]\t # load long $src from table" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4345
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4346
    address long_address = __ long_constant($src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4347
    if (long_address == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4348
      Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4349
      return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4350
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4351
    __ load_long_pcrelative($dst$$Register, long_address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4352
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4353
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4354
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4355
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4356
instruct loadConL32(iRegL dst, immL32 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4357
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4358
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4359
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4360
  format %{ "LGFI     $dst,$src\t # (long)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4361
  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
  4362
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4363
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4364
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4365
instruct loadConL16(iRegL dst, immL16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4366
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4367
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4368
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4369
  format %{ "LGHI     $dst,$src\t # (long)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4370
  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
  4371
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4372
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4373
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4374
instruct loadConL_0(iRegL dst, immL_0 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4375
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4376
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4377
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4378
  format %{ "LoadConL    $dst,$src\t # (long) XGR because ZERO is loaded" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4379
  opcode(XGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4380
  ins_encode(z_rreform(dst, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4381
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4382
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4383
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4384
// Load ptr constant from TOC with pc relative address.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4385
// Special handling for oop constants required.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4386
instruct loadConP_pcrelTOC(iRegP dst, immP src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4387
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4388
  ins_cost(MEMORY_REF_COST_LO);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4389
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4390
  format %{ "LGRL    $dst,[pcrelTOC]\t # load ptr $src from table" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4391
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4392
    relocInfo::relocType constant_reloc = $src->constant_reloc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4393
    if (constant_reloc == relocInfo::oop_type) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4394
      AddressLiteral a = __ allocate_oop_address((jobject)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4395
      bool success = __ load_oop_from_toc($dst$$Register, a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4396
      if (!success) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4397
        Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4398
        return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4399
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4400
    } else if (constant_reloc == relocInfo::metadata_type) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4401
      AddressLiteral a = __ constant_metadata_address((Metadata *)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4402
      address const_toc_addr = __ address_constant((address)a.value(), RelocationHolder::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4403
      if (const_toc_addr == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4404
        Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4405
        return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4406
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4407
      __ load_long_pcrelative($dst$$Register, const_toc_addr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4408
    } else {          // Non-oop pointers, e.g. card mark base, heap top.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4409
      address long_address = __ long_constant((jlong)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4410
      if (long_address == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4411
        Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4412
        return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4413
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4414
      __ load_long_pcrelative($dst$$Register, long_address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4415
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4416
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4417
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4418
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4419
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4420
// We don't use immP16 to avoid problems with oops.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4421
instruct loadConP0(iRegP dst, immP0 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4422
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4423
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4424
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4425
  format %{ "XGR     $dst,$dst\t # NULL ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4426
  opcode(XGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4427
  ins_encode(z_rreform(dst, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4428
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4429
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4430
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4431
//----------Load Float Constant Instructions-------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4432
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4433
// We may not specify this instruction via an `expand' rule. If we do,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4434
// code selection will forget that this instruction needs a floating
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4435
// point constant inserted into the code buffer. So `Shorten_branches'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4436
// will fail.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4437
instruct loadConF_dynTOC(regF dst, immF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4438
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4439
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4440
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4441
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4442
  // If this instruction rematerializes, it prolongs the live range
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4443
  // of the toc node, causing illegal graphs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4444
  ins_cannot_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4445
  format %{ "LE(Y)    $dst,$constantoffset[,$constanttablebase]\t # load FLOAT $src from table" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4446
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4447
    __ load_float_largeoffset($dst$$FloatRegister, $constantoffset($src), $constanttablebase, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4448
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4449
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4450
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4451
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4452
// E may not specify this instruction via an `expand' rule. If we do,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4453
// code selection will forget that this instruction needs a floating
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4454
// point constant inserted into the code buffer. So `Shorten_branches'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4455
// will fail.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4456
instruct loadConD_dynTOC(regD dst, immD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4457
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4458
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4459
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4460
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4461
  // If this instruction rematerializes, it prolongs the live range
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4462
  // of the toc node, causing illegal graphs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4463
  ins_cannot_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4464
  format %{ "LD(Y)    $dst,$constantoffset[,$constanttablebase]\t # load DOUBLE $src from table" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4465
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4466
    __ load_double_largeoffset($dst$$FloatRegister, $constantoffset($src), $constanttablebase, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4467
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4468
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4469
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4470
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4471
// Special case: Load Const 0.0F
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4472
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4473
// There's a special instr to clear a FP register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4474
instruct loadConF0(regF dst, immFp0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4475
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4476
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4477
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4478
  format %{ "LZER     $dst,$src\t # clear to zero" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4479
  opcode(LZER_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4480
  ins_encode(z_rreform(dst, Z_F0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4481
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4482
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4483
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4484
// There's a special instr to clear a FP register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4485
instruct loadConD0(regD dst, immDp0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4486
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4487
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4488
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4489
  format %{ "LZDR     $dst,$src\t # clear to zero" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4490
  opcode(LZDR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4491
  ins_encode(z_rreform(dst, Z_F0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4492
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4493
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4494
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4495
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4496
//----------Store Instructions-------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4497
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4498
// BYTE
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4499
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4500
// Store Byte
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4501
instruct storeB(memory mem, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4502
  match(Set mem (StoreB mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4503
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4504
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4505
  format %{ "STC(Y)  $src,$mem\t # byte" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4506
  opcode(STCY_ZOPC, STC_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4507
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4508
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4509
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4510
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4511
instruct storeCM(memory mem, immI_0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4512
  match(Set mem (StoreCM mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4513
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4514
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4515
  format %{ "STC(Y)  $src,$mem\t # CMS card-mark byte (must be 0!)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4516
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4517
    guarantee($mem$$index$$Register != Z_R0, "content will not be used.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4518
    if ($mem$$index$$Register != noreg) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4519
      // Can't use clear_mem --> load const zero and store character.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4520
      __ load_const_optimized(Z_R0_scratch, (long)0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4521
      if (Immediate::is_uimm12($mem$$disp)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4522
        __ z_stc(Z_R0_scratch, $mem$$Address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4523
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4524
        __ z_stcy(Z_R0_scratch, $mem$$Address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4525
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4526
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4527
      __ clear_mem(Address($mem$$Address), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4528
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4529
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4530
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4531
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4532
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4533
// CHAR/SHORT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4534
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4535
// Store Char/Short
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4536
instruct storeC(memory mem, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4537
  match(Set mem (StoreC mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4538
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4539
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4540
  format %{ "STH(Y)  $src,$mem\t # short" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4541
  opcode(STHY_ZOPC, STH_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4542
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4543
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4544
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4545
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4546
// INT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4547
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4548
// Store Integer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4549
instruct storeI(memory mem, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4550
  match(Set mem (StoreI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4551
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4552
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4553
  format %{ "ST(Y)   $src,$mem\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4554
  opcode(STY_ZOPC, ST_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4555
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4556
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4557
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4558
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4559
// LONG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4560
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4561
// Store Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4562
instruct storeL(memory mem, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4563
  match(Set mem (StoreL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4564
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4565
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4566
  format %{ "STG     $src,$mem\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4567
  opcode(STG_ZOPC, STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4568
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4569
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4570
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4571
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4572
// PTR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4573
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4574
// Store Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4575
instruct storeP(memory dst, memoryRegP src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4576
  match(Set dst (StoreP dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4577
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4578
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4579
  format %{ "STG     $src,$dst\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4580
  opcode(STG_ZOPC, STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4581
  ins_encode(z_form_rt_mem_opt(src, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4582
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4583
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4584
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4585
// FLOAT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4586
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4587
// Store Float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4588
instruct storeF(memory mem, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4589
  match(Set mem (StoreF mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4590
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4591
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4592
  format %{ "STE(Y)   $src,$mem\t # float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4593
  opcode(STEY_ZOPC, STE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4594
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4595
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4596
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4597
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4598
// DOUBLE
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4599
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4600
// Store Double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4601
instruct storeD(memory mem, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4602
  match(Set mem (StoreD mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4603
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4604
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4605
  format %{ "STD(Y)   $src,$mem\t # double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4606
  opcode(STDY_ZOPC, STD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4607
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4608
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4609
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4610
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4611
// Prefetch instructions. Must be safe to execute with invalid address (cannot fault).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4612
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4613
// Should support match rule for PrefetchAllocation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4614
// Still needed after 8068977 for PrefetchAllocate.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4615
instruct prefetchAlloc(memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4616
  match(PrefetchAllocation mem);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4617
  predicate(VM_Version::has_Prefetch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4618
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4619
  format %{ "PREFETCH 2, $mem\t # Prefetch allocation, z10 only" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4620
  ins_encode %{ __ z_pfd(0x02, $mem$$Address); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4621
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4622
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4623
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4624
//----------Memory init instructions------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4625
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4626
// Move Immediate to 1-byte memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4627
instruct memInitB(memoryRSY mem, immI8 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4628
  match(Set mem (StoreB mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4629
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4630
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4631
  format %{ "MVI     $mem,$src\t # direct mem init 1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4632
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4633
    if (Immediate::is_uimm12((long)$mem$$disp)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4634
      __ z_mvi($mem$$Address, $src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4635
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4636
      __ z_mviy($mem$$Address, $src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4637
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4638
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4639
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4640
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4641
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4642
// Move Immediate to 2-byte memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4643
instruct memInitC(memoryRS mem, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4644
  match(Set mem (StoreC mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4645
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4646
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4647
  format %{ "MVHHI   $mem,$src\t # direct mem init 2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4648
  opcode(MVHHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4649
  ins_encode(z_silform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4650
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4651
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4652
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4653
// Move Immediate to 4-byte memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4654
instruct memInitI(memoryRS mem, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4655
  match(Set mem (StoreI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4656
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4657
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4658
  format %{ "MVHI    $mem,$src\t # direct mem init 4" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4659
  opcode(MVHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4660
  ins_encode(z_silform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4661
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4662
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4663
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4664
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4665
// Move Immediate to 8-byte memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4666
instruct memInitL(memoryRS mem, immL16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4667
  match(Set mem (StoreL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4668
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4669
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4670
  format %{ "MVGHI   $mem,$src\t # direct mem init 8" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4671
  opcode(MVGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4672
  ins_encode(z_silform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4673
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4674
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4675
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4676
// Move Immediate to 8-byte memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4677
instruct memInitP(memoryRS mem, immP16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4678
  match(Set mem (StoreP mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4679
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4680
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4681
  format %{ "MVGHI   $mem,$src\t # direct mem init 8" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4682
  opcode(MVGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4683
  ins_encode(z_silform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4684
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4685
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4686
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4687
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4688
//----------Instructions for compressed pointers (cOop and NKlass)-------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4689
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4690
// See cOop encoding classes for elaborate comment.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4691
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4692
// Moved here because it is needed in expand rules for encode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4693
// Long negation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4694
instruct negL_reg_reg(iRegL dst, immL_0 zero, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4695
  match(Set dst (SubL zero src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4696
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4697
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4698
  format %{ "NEG     $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4699
  ins_encode %{ __ z_lcgr($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4700
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4701
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4702
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4703
// Load Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4704
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4705
// Load narrow oop
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4706
instruct loadN(iRegN dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4707
  match(Set dst (LoadN mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4708
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4709
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4710
  format %{ "LoadN  $dst,$mem\t# (cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4711
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4712
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4713
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4714
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4715
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4716
// Load narrow Klass Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4717
instruct loadNKlass(iRegN dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4718
  match(Set dst (LoadNKlass mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4719
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4720
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4721
  format %{ "LoadNKlass $dst,$mem\t# (klass cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4722
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4723
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4724
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4725
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4726
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4727
// Load constant Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4728
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4729
instruct loadConN(iRegN dst, immN src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4730
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4731
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4732
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4733
  format %{ "loadConN    $dst,$src\t # (cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4734
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4735
    AddressLiteral cOop = __ constant_oop_address((jobject)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4736
    __ relocate(cOop.rspec(), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4737
    __ load_narrow_oop($dst$$Register, (narrowOop)cOop.value());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4738
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4739
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4740
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4741
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4742
instruct loadConN0(iRegN dst, immN0 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4743
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4744
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4745
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4746
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4747
  format %{ "loadConN    $dst,$src\t # (cOop) XGR because ZERO is loaded" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4748
  opcode(XGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4749
  ins_encode(z_rreform(dst, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4750
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4751
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4752
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4753
instruct loadConNKlass(iRegN dst, immNKlass src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4754
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4755
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4756
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4757
  format %{ "loadConNKlass $dst,$src\t # (cKlass)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4758
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4759
    AddressLiteral NKlass = __ constant_metadata_address((Metadata*)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4760
    __ relocate(NKlass.rspec(), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4761
    __ load_narrow_klass($dst$$Register, (Klass*)NKlass.value());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4762
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4763
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4764
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4765
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4766
// Load and Decode Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4767
// optimized variants for Unscaled cOops
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4768
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4769
instruct decodeLoadN(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4770
  match(Set dst (DecodeN (LoadN mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4771
  predicate(false && (Universe::narrow_oop_base()==NULL)&&(Universe::narrow_oop_shift()==0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4772
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4773
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4774
  format %{ "DecodeLoadN  $dst,$mem\t# (cOop Load+Decode)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4775
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4776
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4777
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4778
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4779
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4780
instruct decodeLoadNKlass(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4781
  match(Set dst (DecodeNKlass (LoadNKlass mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4782
  predicate(false && (Universe::narrow_klass_base()==NULL)&&(Universe::narrow_klass_shift()==0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4783
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4784
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4785
  format %{ "DecodeLoadNKlass  $dst,$mem\t# (load/decode NKlass)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4786
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4787
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4788
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4789
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4790
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4791
instruct decodeLoadConNKlass(iRegP dst, immNKlass src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4792
  match(Set dst (DecodeNKlass src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4793
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4794
  size(12);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4795
  format %{ "DecodeLoadConNKlass  $dst,$src\t # decode(cKlass)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4796
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4797
    AddressLiteral NKlass = __ constant_metadata_address((Metadata*)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4798
    __ relocate(NKlass.rspec(), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4799
    __ load_const($dst$$Register, (Klass*)NKlass.value());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4800
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4801
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4802
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4803
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4804
// Decode Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4805
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4806
// General decoder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4807
instruct decodeN(iRegP dst, iRegN src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4808
  match(Set dst (DecodeN src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4809
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4810
  predicate(Universe::narrow_oop_base() == NULL || !ExpandLoadingBaseDecode);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4811
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4812
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4813
  format %{ "decodeN  $dst,$src\t# (decode cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4814
  ins_encode %{  __ oop_decoder($dst$$Register, $src$$Register, true); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4815
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4816
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4817
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4818
// General Klass decoder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4819
instruct decodeKlass(iRegP dst, iRegN src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4820
  match(Set dst (DecodeNKlass src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4821
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4822
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4823
  format %{ "decode_klass $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4824
  ins_encode %{ __ decode_klass_not_null($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4825
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4826
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4827
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4828
// General decoder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4829
instruct decodeN_NN(iRegP dst, iRegN src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4830
  match(Set dst (DecodeN src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4831
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4832
  predicate((n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4833
             n->bottom_type()->is_oopptr()->ptr() == TypePtr::Constant) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4834
            (Universe::narrow_oop_base()== NULL || !ExpandLoadingBaseDecode_NN));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4835
  ins_cost(MEMORY_REF_COST+2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4836
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4837
  format %{ "decodeN  $dst,$src\t# (decode cOop NN)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4838
  ins_encode %{ __ oop_decoder($dst$$Register, $src$$Register, false); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4839
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4840
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4841
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4842
  instruct loadBase(iRegL dst, immL baseImm) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4843
    effect(DEF dst, USE baseImm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4844
    predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4845
    format %{ "llihl    $dst=$baseImm \t// load heap base" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4846
    ins_encode %{ __ get_oop_base($dst$$Register, $baseImm$$constant); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4847
    ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4848
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4849
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4850
  // Decoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4851
  instruct decodeN_base(iRegP dst, iRegN src, iRegL base, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4852
    match(Set dst (DecodeN src base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4853
    // Note: Effect TEMP dst was used with the intention to get
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4854
    // different regs for dst and base, but this has caused ADLC to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4855
    // generate wrong code. Oop_decoder generates additional lgr when
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4856
    // dst==base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4857
    effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4858
    predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4859
    // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4860
    format %{ "decodeN  $dst = ($src == 0) ? NULL : ($src << 3) + $base + pow2_offset\t# (decode cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4861
    ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4862
      __ oop_decoder($dst$$Register, $src$$Register, true, $base$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4863
                     (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
  4864
    %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4865
    ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4866
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4867
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4868
  // Decoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4869
  instruct decodeN_NN_base(iRegP dst, iRegN src, iRegL base, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4870
    match(Set dst (DecodeN src base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4871
    effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4872
    predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4873
    // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4874
    format %{ "decodeN  $dst = ($src << 3) + $base + pow2_offset\t# (decode cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4875
    ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4876
      __ oop_decoder($dst$$Register, $src$$Register, false, $base$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4877
                     (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
  4878
    %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4879
    ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4880
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4881
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4882
// Decoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4883
instruct decodeN_Ex(iRegP dst, iRegN src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4884
  match(Set dst (DecodeN src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4885
  predicate(Universe::narrow_oop_base() != NULL && ExpandLoadingBaseDecode);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4886
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4887
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4888
  expand %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4889
    immL baseImm %{ (jlong)(intptr_t)Universe::narrow_oop_base() %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4890
    iRegL base;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4891
    loadBase(base, baseImm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4892
    decodeN_base(dst, src, base, cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4893
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4894
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4895
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4896
// Decoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4897
instruct decodeN_NN_Ex(iRegP dst, iRegN src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4898
  match(Set dst (DecodeN src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4899
  predicate((n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4900
             n->bottom_type()->is_oopptr()->ptr() == TypePtr::Constant) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4901
            Universe::narrow_oop_base() != NULL && ExpandLoadingBaseDecode_NN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4902
  ins_cost(MEMORY_REF_COST+2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4903
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4904
  expand %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4905
    immL baseImm %{ (jlong)(intptr_t)Universe::narrow_oop_base() %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4906
    iRegL base;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4907
    loadBase(base, baseImm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4908
    decodeN_NN_base(dst, src, base, cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4909
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4910
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4911
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4912
//  Encode Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4913
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4914
// General encoder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4915
instruct encodeP(iRegN dst, iRegP src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4916
  match(Set dst (EncodeP src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4917
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4918
  predicate((n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4919
            (Universe::narrow_oop_base() == 0 ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4920
             Universe::narrow_oop_base_disjoint() ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4921
             !ExpandLoadingBaseEncode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4922
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4923
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4924
  format %{ "encodeP  $dst,$src\t# (encode cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4925
  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
  4926
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4927
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4928
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4929
// General class encoder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4930
instruct encodeKlass(iRegN dst, iRegP src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4931
  match(Set dst (EncodePKlass src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4932
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4933
  format %{ "encode_klass $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4934
  ins_encode %{ __ encode_klass_not_null($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4935
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4936
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4937
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4938
instruct encodeP_NN(iRegN dst, iRegP src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4939
  match(Set dst (EncodeP src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4940
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4941
  predicate((n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4942
            (Universe::narrow_oop_base() == 0 ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4943
             Universe::narrow_oop_base_disjoint() ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4944
             !ExpandLoadingBaseEncode_NN));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4945
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4946
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4947
  format %{ "encodeP  $dst,$src\t# (encode cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4948
  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
  4949
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4950
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4951
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4952
  // Encoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4953
  instruct encodeP_base(iRegN dst, iRegP src, iRegL base) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4954
    match(Set dst (EncodeP src (Binary base dst)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4955
    effect(TEMP_DEF dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4956
    predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4957
    ins_cost(MEMORY_REF_COST+2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4958
    // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4959
    format %{ "encodeP  $dst = ($src>>3) +$base + pow2_offset\t# (encode cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4960
    ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4961
      jlong offset = -(jlong)MacroAssembler::get_oop_base_pow2_offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4962
        (((uint64_t)(intptr_t)Universe::narrow_oop_base()) >> Universe::narrow_oop_shift());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4963
      __ oop_encoder($dst$$Register, $src$$Register, true, $base$$Register, offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4964
    %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4965
    ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4966
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4967
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4968
  // Encoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4969
  instruct encodeP_NN_base(iRegN dst, iRegP src, iRegL base, immL pow2_offset) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4970
    match(Set dst (EncodeP src base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4971
    effect(USE pow2_offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4972
    predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4973
    ins_cost(MEMORY_REF_COST+2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4974
    // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4975
    format %{ "encodeP  $dst = ($src>>3) +$base + $pow2_offset\t# (encode cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4976
    ins_encode %{ __ oop_encoder($dst$$Register, $src$$Register, false, $base$$Register, $pow2_offset$$constant); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4977
    ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4978
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4979
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4980
// Encoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4981
instruct encodeP_Ex(iRegN dst, iRegP src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4982
  match(Set dst (EncodeP src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4983
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4984
  predicate((n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4985
            (Universe::narrow_oop_base_overlaps() && ExpandLoadingBaseEncode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4986
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4987
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4988
  expand %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4989
    immL baseImm %{ ((jlong)(intptr_t)Universe::narrow_oop_base()) >> Universe::narrow_oop_shift() %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4990
    immL_0 zero %{ (0) %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4991
    flagsReg ccr;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4992
    iRegL base;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4993
    iRegL negBase;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4994
    loadBase(base, baseImm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4995
    negL_reg_reg(negBase, zero, base, ccr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4996
    encodeP_base(dst, src, negBase);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4997
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4998
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4999
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5000
// Encoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5001
instruct encodeP_NN_Ex(iRegN dst, iRegP src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5002
  match(Set dst (EncodeP src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5003
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5004
  predicate((n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5005
            (Universe::narrow_oop_base_overlaps() && ExpandLoadingBaseEncode_NN));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5006
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5007
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5008
  expand %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5009
    immL baseImm %{ (jlong)(intptr_t)Universe::narrow_oop_base() %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5010
    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
  5011
    immL_0 zero %{ 0 %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5012
    flagsReg ccr;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5013
    iRegL base;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5014
    iRegL negBase;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5015
    loadBase(base, baseImm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5016
    negL_reg_reg(negBase, zero, base, ccr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5017
    encodeP_NN_base(dst, src, negBase, pow2_offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5018
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5019
%}
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
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5023
// Store Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5024
instruct storeN(memory mem, iRegN_P2N src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5025
  match(Set mem (StoreN mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5026
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5027
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5028
  format %{ "ST      $src,$mem\t# (cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5029
  opcode(STY_ZOPC, ST_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5030
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5031
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5032
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5033
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5034
// Store Compressed Klass pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5035
instruct storeNKlass(memory mem, iRegN src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5036
  match(Set mem (StoreNKlass mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5037
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5038
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5039
  format %{ "ST      $src,$mem\t# (cKlass)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5040
  opcode(STY_ZOPC, ST_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5041
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5042
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5043
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5044
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5045
// Compare Compressed Pointers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5046
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5047
instruct compN_iRegN(iRegN_P2N src1, iRegN_P2N src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5048
  match(Set cr (CmpN src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5049
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5050
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5051
  format %{ "CLR     $src1,$src2\t# (cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5052
  opcode(CLR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5053
  ins_encode(z_rrform(src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5054
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5055
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5056
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5057
instruct compN_iRegN_immN(iRegN_P2N src1, immN src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5058
  match(Set cr (CmpN src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5059
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5060
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5061
  format %{ "CLFI    $src1,$src2\t# (cOop) compare immediate narrow" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5062
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5063
    AddressLiteral cOop = __ constant_oop_address((jobject)$src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5064
    __ relocate(cOop.rspec(), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5065
    __ compare_immediate_narrow_oop($src1$$Register, (narrowOop)cOop.value());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5066
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5067
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5068
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5069
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5070
instruct compNKlass_iRegN_immN(iRegN src1, immNKlass src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5071
  match(Set cr (CmpN src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5072
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5073
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5074
  format %{ "CLFI    $src1,$src2\t# (NKlass) compare immediate narrow" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5075
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5076
    AddressLiteral NKlass = __ constant_metadata_address((Metadata*)$src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5077
    __ relocate(NKlass.rspec(), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5078
    __ compare_immediate_narrow_klass($src1$$Register, (Klass*)NKlass.value());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5079
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5080
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5081
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5082
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5083
instruct compN_iRegN_immN0(iRegN_P2N src1, immN0 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5084
  match(Set cr (CmpN src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5085
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5086
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5087
  format %{ "LTR     $src1,$src2\t# (cOop) LTR because comparing against zero" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5088
  opcode(LTR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5089
  ins_encode(z_rrform(src1, src1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5090
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5091
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5092
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5093
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5094
//----------MemBar Instructions-----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5095
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5096
// Memory barrier flavors
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5097
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5098
instruct membar_acquire() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5099
  match(MemBarAcquire);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5100
  match(LoadFence);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5101
  ins_cost(4*MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5102
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5103
  format %{ "MEMBAR-acquire" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5104
  ins_encode %{ __ z_acquire(); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5105
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5106
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5107
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5108
instruct membar_acquire_lock() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5109
  match(MemBarAcquireLock);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5110
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5111
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5112
  format %{ "MEMBAR-acquire (CAS in prior FastLock so empty encoding)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5113
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5114
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5115
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5116
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5117
instruct membar_release() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5118
  match(MemBarRelease);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5119
  match(StoreFence);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5120
  ins_cost(4 * MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5121
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5122
  format %{ "MEMBAR-release" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5123
  ins_encode %{ __ z_release(); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5124
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5125
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5126
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5127
instruct membar_release_lock() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5128
  match(MemBarReleaseLock);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5129
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5130
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5131
  format %{ "MEMBAR-release (CAS in succeeding FastUnlock so empty encoding)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5132
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5133
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5134
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5135
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5136
instruct membar_volatile() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5137
  match(MemBarVolatile);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5138
  ins_cost(4 * MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5139
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5140
  format %{ "MEMBAR-volatile" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5141
  ins_encode %{ __ z_fence(); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5142
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5143
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5144
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5145
instruct unnecessary_membar_volatile() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5146
  match(MemBarVolatile);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5147
  predicate(Matcher::post_store_load_barrier(n));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5148
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5149
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5150
  format %{ "# MEMBAR-volatile (empty)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5151
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5152
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5153
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5154
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5155
instruct membar_CPUOrder() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5156
  match(MemBarCPUOrder);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5157
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5158
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5159
  format %{ "MEMBAR-CPUOrder (empty)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5160
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5161
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5162
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5163
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5164
instruct membar_storestore() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5165
  match(MemBarStoreStore);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5166
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5167
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5168
  format %{ "MEMBAR-storestore (empty)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5169
  ins_encode();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5170
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5171
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5172
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5173
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5174
//----------Register Move Instructions-----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5175
instruct roundDouble_nop(regD dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5176
  match(Set dst (RoundDouble dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5177
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5178
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5179
  // z/Architecture results are already "rounded" (i.e., normal-format IEEE).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5180
  ins_encode();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5181
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5182
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5183
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5184
instruct roundFloat_nop(regF dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5185
  match(Set dst (RoundFloat dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5186
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5187
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5188
  // z/Architecture results are already "rounded" (i.e., normal-format IEEE).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5189
  ins_encode();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5190
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5191
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5192
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5193
// Cast Long to Pointer for unsafe natives.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5194
instruct castX2P(iRegP dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5195
  match(Set dst (CastX2P src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5196
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5197
  format %{ "LGR     $dst,$src\t # CastX2P" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5198
  ins_encode %{ __ lgr_if_needed($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5199
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5200
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5201
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5202
// Cast Pointer to Long for unsafe natives.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5203
instruct castP2X(iRegL dst, iRegP_N2P src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5204
  match(Set dst (CastP2X src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5205
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5206
  format %{ "LGR     $dst,$src\t # CastP2X" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5207
  ins_encode %{ __ lgr_if_needed($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5208
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5209
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5210
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5211
instruct stfSSD(stackSlotD stkSlot, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5212
  // %%%% TODO: Tell the coalescer that this kind of node is a copy!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5213
  match(Set stkSlot src);   // chain rule
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5214
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5215
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5216
  format %{ " STD   $src,$stkSlot\t # stk" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5217
  opcode(STD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5218
  ins_encode(z_form_rt_mem(src, stkSlot));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5219
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5220
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5221
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5222
instruct stfSSF(stackSlotF stkSlot, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5223
  // %%%% TODO: Tell the coalescer that this kind of node is a copy!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5224
  match(Set stkSlot src);   // chain rule
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5225
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5226
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5227
  format %{ "STE   $src,$stkSlot\t # stk" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5228
  opcode(STE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5229
  ins_encode(z_form_rt_mem(src, stkSlot));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5230
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5231
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5232
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5233
//----------Conditional Move---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5234
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5235
instruct cmovN_reg(cmpOp cmp, flagsReg cr, iRegN dst, iRegN_P2N src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5236
  match(Set dst (CMoveN (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5237
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5238
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5239
  format %{ "CMoveN,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5240
  ins_encode(z_enc_cmov_reg(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5241
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5242
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5243
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5244
instruct cmovN_imm(cmpOp cmp, flagsReg cr, iRegN dst, immN0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5245
  match(Set dst (CMoveN (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5246
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5247
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5248
  format %{ "CMoveN,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5249
  ins_encode(z_enc_cmov_imm(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5250
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5251
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5252
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5253
instruct cmovI_reg(cmpOp cmp, flagsReg cr, iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5254
  match(Set dst (CMoveI (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5255
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5256
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5257
  format %{ "CMoveI,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5258
  ins_encode(z_enc_cmov_reg(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5259
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5260
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5261
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5262
instruct cmovI_imm(cmpOp cmp, flagsReg cr, iRegI dst, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5263
  match(Set dst (CMoveI (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5264
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5265
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5266
  format %{ "CMoveI,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5267
  ins_encode(z_enc_cmov_imm(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5268
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5269
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5270
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5271
instruct cmovP_reg(cmpOp cmp, flagsReg cr, iRegP dst, iRegP_N2P src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5272
  match(Set dst (CMoveP (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5273
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5274
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5275
  format %{ "CMoveP,$cmp    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5276
  ins_encode(z_enc_cmov_reg(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5277
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5278
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5279
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5280
instruct cmovP_imm(cmpOp cmp, flagsReg cr, iRegP dst, immP0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5281
  match(Set dst (CMoveP (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5282
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5283
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5284
  format %{ "CMoveP,$cmp  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5285
  ins_encode(z_enc_cmov_imm(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5286
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5287
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5288
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5289
instruct cmovF_reg(cmpOpF cmp, flagsReg cr, regF dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5290
  match(Set dst (CMoveF (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5291
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5292
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5293
  format %{ "CMoveF,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5294
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5295
    // Don't emit code if operands are identical (same register).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5296
    if ($dst$$FloatRegister != $src$$FloatRegister) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5297
      Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5298
      __ z_brc(Assembler::inverse_float_condition((Assembler::branch_condition)$cmp$$cmpcode), done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5299
      __ z_ler($dst$$FloatRegister, $src$$FloatRegister);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5300
      __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5301
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5302
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5303
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5304
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5305
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5306
instruct cmovD_reg(cmpOpF cmp, flagsReg cr, regD dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5307
  match(Set dst (CMoveD (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5308
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5309
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5310
  format %{ "CMoveD,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5311
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5312
    // Don't emit code if operands are identical (same register).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5313
    if ($dst$$FloatRegister != $src$$FloatRegister) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5314
      Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5315
      __ z_brc(Assembler::inverse_float_condition((Assembler::branch_condition)$cmp$$cmpcode), done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5316
      __ z_ldr($dst$$FloatRegister, $src$$FloatRegister);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5317
      __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5318
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5319
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5320
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5321
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5322
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5323
instruct cmovL_reg(cmpOp cmp, flagsReg cr, iRegL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5324
  match(Set dst (CMoveL (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5325
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5326
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5327
  format %{ "CMoveL,$cmp  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5328
  ins_encode(z_enc_cmov_reg(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5329
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5330
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5331
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5332
instruct cmovL_imm(cmpOp cmp, flagsReg cr, iRegL dst, immL16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5333
  match(Set dst (CMoveL (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5334
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5335
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5336
  format %{ "CMoveL,$cmp  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5337
  ins_encode(z_enc_cmov_imm(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5338
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5339
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5340
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5341
//----------OS and Locking Instructions----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5342
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5343
// This name is KNOWN by the ADLC and cannot be changed.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5344
// The ADLC forces a 'TypeRawPtr::BOTTOM' output type
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5345
// for this guy.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5346
instruct tlsLoadP(threadRegP dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5347
  match(Set dst (ThreadLocal));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5348
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5349
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5350
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5351
  format %{ "# $dst=ThreadLocal" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5352
  ins_encode(/* empty */);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5353
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5354
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5355
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5356
instruct checkCastPP(iRegP dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5357
  match(Set dst (CheckCastPP dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5358
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5359
  format %{ "# checkcastPP of $dst" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5360
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5361
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5362
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5363
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5364
instruct castPP(iRegP dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5365
  match(Set dst (CastPP dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5366
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5367
  format %{ "# castPP of $dst" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5368
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5369
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5370
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5371
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5372
instruct castII(iRegI dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5373
  match(Set dst (CastII dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5374
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5375
  format %{ "# castII of $dst" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5376
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5377
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5378
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5379
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5380
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5381
//----------Conditional_store--------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5382
// Conditional-store of the updated heap-top.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5383
// Used during allocation of the shared heap.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5384
// Sets flags (EQ) on success.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5385
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5386
// Implement LoadPLocked. Must be ordered against changes of the memory location
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5387
// by storePConditional.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5388
// Don't know whether this is ever used.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5389
instruct loadPLocked(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5390
  match(Set dst (LoadPLocked mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5391
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5392
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5393
  format %{ "LG      $dst,$mem\t # LoadPLocked" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5394
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5395
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5396
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5397
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5398
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5399
// As compareAndSwapP, but return flag register instead of boolean value in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5400
// int register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5401
// This instruction is matched if UseTLAB is off. Needed to pass
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5402
// option tests.  Mem_ptr must be a memory operand, else this node
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5403
// does not get Flag_needs_anti_dependence_check set by adlc. If this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5404
// is not set this node can be rematerialized which leads to errors.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5405
instruct storePConditional(indirect mem_ptr, rarg5RegP oldval, iRegP_N2P newval, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5406
  match(Set cr (StorePConditional mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5407
  effect(KILL oldval);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5408
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5409
  format %{ "storePConditional $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5410
  ins_encode(z_enc_casL(oldval, newval, mem_ptr));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5411
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5412
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5413
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5414
// As compareAndSwapL, but return flag register instead of boolean value in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5415
// int register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5416
// Used by sun/misc/AtomicLongCSImpl.java. Mem_ptr must be a memory
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5417
// operand, else this node does not get
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5418
// Flag_needs_anti_dependence_check set by adlc. If this is not set
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5419
// this node can be rematerialized which leads to errors.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5420
instruct storeLConditional(indirect mem_ptr, rarg5RegL oldval, iRegL newval, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5421
  match(Set cr (StoreLConditional mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5422
  effect(KILL oldval);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5423
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5424
  format %{ "storePConditional $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5425
  ins_encode(z_enc_casL(oldval, newval, mem_ptr));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5426
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5427
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5428
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5429
// 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
  5430
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5431
instruct compareAndSwapI_bool(iRegP mem_ptr, rarg5RegI oldval, iRegI newval, iRegI res, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5432
  match(Set res (CompareAndSwapI mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5433
  effect(USE mem_ptr, USE_KILL oldval, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5434
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5435
  format %{ "$res = CompareAndSwapI $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5436
  ins_encode(z_enc_casI(oldval, newval, mem_ptr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5437
             z_enc_cctobool(res));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5438
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5439
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5440
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5441
instruct compareAndSwapL_bool(iRegP mem_ptr, rarg5RegL oldval, iRegL newval, iRegI res, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5442
  match(Set res (CompareAndSwapL mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5443
  effect(USE mem_ptr, USE_KILL oldval, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5444
  size(18);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5445
  format %{ "$res = CompareAndSwapL $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5446
  ins_encode(z_enc_casL(oldval, newval, mem_ptr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5447
             z_enc_cctobool(res));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5448
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5449
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5450
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5451
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
  5452
  match(Set res (CompareAndSwapP mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5453
  effect(USE mem_ptr, USE_KILL oldval, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5454
  size(18);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5455
  format %{ "$res = CompareAndSwapP $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5456
  ins_encode(z_enc_casL(oldval, newval, mem_ptr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5457
             z_enc_cctobool(res));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5458
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5459
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5460
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5461
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
  5462
  match(Set res (CompareAndSwapN mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5463
  effect(USE mem_ptr, USE_KILL oldval, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5464
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5465
  format %{ "$res = CompareAndSwapN $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5466
  ins_encode(z_enc_casI(oldval, newval, mem_ptr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5467
             z_enc_cctobool(res));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5468
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5469
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5470
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5471
//----------Atomic operations on memory (GetAndSet*, GetAndAdd*)---------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5472
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5473
// Exploit: direct memory arithmetic
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5474
// Prereqs: - instructions available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5475
//          - instructions guarantee atomicity
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5476
//          - immediate operand to be added
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5477
//          - immediate operand is small enough (8-bit signed).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5478
//          - result of instruction is not used
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5479
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
  5480
  match(Set dummy (GetAndAddI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5481
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5482
  predicate(VM_Version::has_AtomicMemWithImmALUOps() && n->as_LoadStore()->result_not_used());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5483
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5484
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5485
  format %{ "ASI     [$mem],$src\t # GetAndAddI (atomic)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5486
  opcode(ASI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5487
  ins_encode(z_siyform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5488
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5489
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5490
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5491
// Fallback: direct memory arithmetic not available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5492
// Disadvantages: - CS-Loop required, very expensive.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5493
//                - more code generated (26 to xx bytes vs. 6 bytes)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5494
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
  5495
  match(Set dst (GetAndAddI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5496
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5497
  ins_cost(MEMORY_REF_COST+100*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5498
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5499
            "  LGF     $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5500
            "  AHIK    $tmp,$dst,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5501
            "  CSY     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5502
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5503
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5504
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5505
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5506
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5507
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5508
    int      Isrc = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5509
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5510
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5511
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5512
    __ z_lgf(Rdst, $mem$$Address);    // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5513
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5514
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5515
      if (VM_Version::has_DistinctOpnds()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5516
        __ z_ahik(Rtmp, Rdst, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5517
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5518
        __ z_lr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5519
        __ z_ahi(Rtmp, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5520
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5521
      // Swap into memory location.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5522
      __ z_csy(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5523
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5524
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5525
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5526
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5527
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5528
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
  5529
  match(Set dst (GetAndAddI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5530
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5531
  ins_cost(MEMORY_REF_COST+200*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5532
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5533
            "  LGF     $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5534
            "  LGR     $tmp,$dst\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5535
            "  AFI     $tmp,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5536
            "  CSY     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5537
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5538
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5539
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5540
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5541
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5542
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5543
    int      Isrc = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5544
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5545
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5546
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5547
    __ z_lgf(Rdst, $mem$$Address);    // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5548
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5549
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5550
      __ z_lr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5551
      __ z_afi(Rtmp, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5552
      // Swap into memory location.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5553
      __ z_csy(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5554
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5555
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5556
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5557
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5558
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5559
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
  5560
  match(Set dst (GetAndAddI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5561
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5562
  ins_cost(MEMORY_REF_COST+100*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5563
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5564
            "  LGF     $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5565
            "  ARK     $tmp,$dst,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5566
            "  CSY     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5567
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5568
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5569
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5570
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5571
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5572
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5573
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5574
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5575
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5576
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5577
    __ z_lgf(Rdst, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5578
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5579
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5580
      if (VM_Version::has_DistinctOpnds()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5581
        __ z_ark(Rtmp, Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5582
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5583
        __ z_lr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5584
        __ z_ar(Rtmp, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5585
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5586
      __ z_csy(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5587
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5588
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5589
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5590
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5591
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5592
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5593
// Exploit: direct memory arithmetic
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5594
// Prereqs: - instructions available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5595
//          - instructions guarantee atomicity
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5596
//          - immediate operand to be added
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5597
//          - immediate operand is small enough (8-bit signed).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5598
//          - result of instruction is not used
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5599
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
  5600
  match(Set dummy (GetAndAddL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5601
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5602
  predicate(VM_Version::has_AtomicMemWithImmALUOps() && n->as_LoadStore()->result_not_used());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5603
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5604
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5605
  format %{ "AGSI    [$mem],$src\t # GetAndAddL (atomic)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5606
  opcode(AGSI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5607
  ins_encode(z_siyform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5608
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5609
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5610
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5611
// Fallback: direct memory arithmetic not available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5612
// Disadvantages: - CS-Loop required, very expensive.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5613
//                - more code generated (26 to xx bytes vs. 6 bytes)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5614
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
  5615
  match(Set dst (GetAndAddL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5616
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5617
  ins_cost(MEMORY_REF_COST+100*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5618
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5619
            "  LG      $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5620
            "  AGHIK   $tmp,$dst,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5621
            "  CSG     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5622
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5623
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5624
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5625
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5626
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5627
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5628
    int      Isrc = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5629
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5630
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5631
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5632
    __ z_lg(Rdst, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5633
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5634
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5635
      if (VM_Version::has_DistinctOpnds()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5636
        __ z_aghik(Rtmp, Rdst, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5637
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5638
        __ z_lgr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5639
        __ z_aghi(Rtmp, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5640
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5641
      __ z_csg(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5642
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5643
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5644
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5645
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5646
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5647
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
  5648
  match(Set dst (GetAndAddL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5649
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5650
  ins_cost(MEMORY_REF_COST+100*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5651
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5652
            "  LG      $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5653
            "  LGR     $tmp,$dst\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5654
            "  AGFI    $tmp,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5655
            "  CSG     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5656
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5657
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5658
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5659
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5660
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5661
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5662
    int      Isrc = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5663
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5664
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5665
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5666
    __ z_lg(Rdst, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5667
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5668
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5669
      __ z_lgr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5670
      __ z_agfi(Rtmp, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5671
      __ z_csg(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5672
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5673
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5674
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5675
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5676
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5677
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
  5678
  match(Set dst (GetAndAddL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5679
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5680
  ins_cost(MEMORY_REF_COST+100*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5681
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5682
            "  LG      $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5683
            "  AGRK    $tmp,$dst,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5684
            "  CSG     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5685
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5686
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5687
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5688
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5689
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5690
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5691
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5692
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5693
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5694
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5695
    __ z_lg(Rdst, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5696
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5697
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5698
      if (VM_Version::has_DistinctOpnds()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5699
        __ z_agrk(Rtmp, Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5700
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5701
        __ z_lgr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5702
        __ z_agr(Rtmp, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5703
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5704
      __ z_csg(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5705
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5706
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5707
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5708
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5709
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5710
// Increment value in memory, save old value in dst.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5711
instruct addI_mem_reg_atomic_z196(memoryRSY mem, iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5712
  match(Set dst (GetAndAddI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5713
  predicate(VM_Version::has_LoadAndALUAtomicV1());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5714
  ins_cost(MEMORY_REF_COST + DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5715
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5716
  format %{ "LAA     $dst,$src,[$mem]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5717
  ins_encode %{ __ z_laa($dst$$Register, $src$$Register, $mem$$Address); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5718
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5719
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5720
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5721
// Increment value in memory, save old value in dst.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5722
instruct addL_mem_reg_atomic_z196(memoryRSY mem, iRegL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5723
  match(Set dst (GetAndAddL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5724
  predicate(VM_Version::has_LoadAndALUAtomicV1());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5725
  ins_cost(MEMORY_REF_COST + DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5726
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5727
  format %{ "LAAG    $dst,$src,[$mem]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5728
  ins_encode %{ __ z_laag($dst$$Register, $src$$Register, $mem$$Address); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5729
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5730
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5731
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5732
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5733
instruct xchgI_reg_mem(memoryRSY mem, iRegI dst, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5734
  match(Set dst (GetAndSetI mem dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5735
  effect(KILL cr, TEMP tmp); // USE_DEF dst by match rule.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5736
  format %{ "XCHGI   $dst,[$mem]\t # EXCHANGE (int, atomic), temp $tmp" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5737
  ins_encode(z_enc_SwapI(mem, dst, tmp));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5738
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5739
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5740
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5741
instruct xchgL_reg_mem(memoryRSY mem, iRegL dst, iRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5742
  match(Set dst (GetAndSetL mem dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5743
  effect(KILL cr, TEMP tmp); // USE_DEF dst by match rule.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5744
  format %{ "XCHGL   $dst,[$mem]\t # EXCHANGE (long, atomic), temp $tmp" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5745
  ins_encode(z_enc_SwapL(mem, dst, tmp));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5746
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5747
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5748
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5749
instruct xchgN_reg_mem(memoryRSY mem, iRegN dst, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5750
  match(Set dst (GetAndSetN mem dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5751
  effect(KILL cr, TEMP tmp); // USE_DEF dst by match rule.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5752
  format %{ "XCHGN   $dst,[$mem]\t # EXCHANGE (coop, atomic), temp $tmp" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5753
  ins_encode(z_enc_SwapI(mem, dst, tmp));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5754
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5755
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5756
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5757
instruct xchgP_reg_mem(memoryRSY mem, iRegP dst, iRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5758
  match(Set dst (GetAndSetP mem dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5759
  effect(KILL cr, TEMP tmp); // USE_DEF dst by match rule.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5760
  format %{ "XCHGP   $dst,[$mem]\t # EXCHANGE (oop, atomic), temp $tmp" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5761
  ins_encode(z_enc_SwapL(mem, dst, tmp));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5762
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5763
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5764
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5765
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5766
//----------Arithmetic Instructions--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5767
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5768
// The rules are sorted by right operand type and operand length. Please keep
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5769
// it that way.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5770
// Left operand type is always reg. Left operand len is I, L, P
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5771
// 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
  5772
// Special instruction formats, e.g. multi-operand, are inserted at the end.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5773
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5774
// ADD
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5775
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5776
// REG = REG + REG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5777
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5778
// Register Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5779
instruct addI_reg_reg_CISC(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5780
  match(Set dst (AddI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5781
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5782
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5783
  format %{ "AR      $dst,$src\t # int  CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5784
  opcode(AR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5785
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5786
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5787
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5788
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5789
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5790
instruct addI_reg_reg_RISC(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5791
  match(Set dst (AddI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5792
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5793
  predicate(VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5794
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5795
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5796
  format %{ "ARK     $dst,$src1,$src2\t # int  RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5797
  opcode(ARK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5798
  ins_encode(z_rrfform(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5799
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5800
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5801
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5802
// REG = REG + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5803
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5804
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5805
// Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5806
instruct addI_reg_imm16_CISC(iRegI dst, immI16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5807
  match(Set dst (AddI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5808
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5809
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5810
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5811
  format %{ "AHI     $dst,$con\t # int  CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5812
  opcode(AHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5813
  ins_encode(z_riform_signed(dst, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5814
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5815
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5816
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5817
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5818
// Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5819
instruct addI_reg_imm16_RISC(iRegI dst, iRegI src, immI16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5820
  match(Set dst (AddI src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5821
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5822
  predicate( VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5823
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5824
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5825
  format %{ "AHIK    $dst,$src,$con\t # int  RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5826
  opcode(AHIK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5827
  ins_encode(z_rieform_d(dst, src, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5828
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5829
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5830
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5831
// Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5832
instruct addI_reg_imm32(iRegI dst, immI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5833
  match(Set dst (AddI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5834
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5835
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5836
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5837
  format %{ "AFI     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5838
  opcode(AFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5839
  ins_encode(z_rilform_signed(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5840
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5841
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5842
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5843
// Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5844
instruct addI_reg_imm12(iRegI dst, iRegI src, uimmI12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5845
  match(Set dst (AddI src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5846
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5847
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5848
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5849
  format %{ "LA      $dst,$con(,$src)\t # int d12(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5850
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5851
  ins_encode(z_rxform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5852
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5853
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5854
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5855
// Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5856
instruct addI_reg_imm20(iRegI dst, iRegI src, immI20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5857
  match(Set dst (AddI src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5858
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5859
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5860
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5861
  format %{ "LAY     $dst,$con(,$src)\t # int d20(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5862
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5863
  ins_encode(z_rxyform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5864
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5865
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5866
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5867
instruct addI_reg_reg_imm12(iRegI dst, iRegI src1, iRegI src2, uimmI12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5868
  match(Set dst (AddI (AddI src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5869
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5870
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5871
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5872
  format %{ "LA      $dst,$con($src1,$src2)\t # int d12(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5873
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5874
  ins_encode(z_rxform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5875
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5876
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5877
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5878
instruct addI_reg_reg_imm20(iRegI dst, iRegI src1, iRegI src2, immI20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5879
  match(Set dst (AddI (AddI src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5880
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5881
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5882
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5883
  format %{ "LAY     $dst,$con($src1,$src2)\t # int d20(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5884
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5885
  ins_encode(z_rxyform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5886
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5887
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5888
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5889
// REG = REG + MEM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5890
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5891
instruct addI_Reg_mem(iRegI dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5892
  match(Set dst (AddI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5893
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5894
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5895
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5896
  format %{ "A(Y)    $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5897
  opcode(AY_ZOPC, A_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5898
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5899
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5900
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5901
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5902
// MEM = MEM + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5903
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5904
// Add Immediate to 4-byte memory operand and result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5905
instruct addI_mem_imm(memoryRSY mem, immI8 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5906
  match(Set mem (StoreI mem (AddI (LoadI mem) src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5907
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5908
  predicate(VM_Version::has_MemWithImmALUOps());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5909
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5910
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5911
  format %{ "ASI     $mem,$src\t # direct mem add 4" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5912
  opcode(ASI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5913
  ins_encode(z_siyform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5914
  ins_pipe(pipe_class_dummy);
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
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5919
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5920
// REG = REG + REG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5921
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5922
instruct addL_reg_regI(iRegL dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5923
  match(Set dst (AddL dst (ConvI2L src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5924
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5925
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5926
  format %{ "AGFR    $dst,$src\t # long<-int CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5927
  opcode(AGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5928
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5929
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5930
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5931
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5932
instruct addL_reg_reg_CISC(iRegL dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5933
  match(Set dst (AddL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5934
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5935
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5936
  format %{ "AGR     $dst, $src\t # long CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5937
  opcode(AGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5938
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5939
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5940
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5941
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5942
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5943
instruct addL_reg_reg_RISC(iRegL dst, iRegL src1, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5944
  match(Set dst (AddL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5945
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5946
  predicate(VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5947
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5948
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5949
  format %{ "AGRK    $dst,$src1,$src2\t # long RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5950
  opcode(AGRK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5951
  ins_encode(z_rrfform(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5952
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5953
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5954
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5955
// REG = REG + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5956
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5957
instruct addL_reg_imm12(iRegL dst, iRegL src, uimmL12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5958
  match(Set dst (AddL src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5959
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5960
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5961
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5962
  format %{ "LA      $dst,$con(,$src)\t # long d12(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5963
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5964
  ins_encode(z_rxform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5965
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5966
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5967
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5968
instruct addL_reg_imm20(iRegL dst, iRegL src, immL20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5969
  match(Set dst (AddL src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5970
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5971
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5972
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5973
  format %{ "LAY     $dst,$con(,$src)\t # long d20(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5974
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5975
  ins_encode(z_rxyform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5976
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5977
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5978
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5979
instruct addL_reg_imm32(iRegL dst, immL32 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5980
  match(Set dst (AddL dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5981
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5982
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5983
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5984
  format %{ "AGFI    $dst,$con\t # long CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5985
  opcode(AGFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5986
  ins_encode(z_rilform_signed(dst, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5987
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5988
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5989
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5990
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5991
instruct addL_reg_imm16_CISC(iRegL dst, immL16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5992
  match(Set dst (AddL dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5993
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5994
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5995
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5996
  format %{ "AGHI    $dst,$con\t # long CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5997
  opcode(AGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5998
  ins_encode(z_riform_signed(dst, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5999
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6000
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6001
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6002
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6003
instruct addL_reg_imm16_RISC(iRegL dst, iRegL src, immL16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6004
  match(Set dst (AddL src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6005
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6006
  predicate( VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6007
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6008
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6009
  format %{ "AGHIK   $dst,$src,$con\t # long RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6010
  opcode(AGHIK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6011
  ins_encode(z_rieform_d(dst, src, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6012
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6013
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6014
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6015
// REG = REG + MEM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6016
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6017
instruct addL_Reg_memI(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6018
  match(Set dst (AddL dst (ConvI2L (LoadI src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6019
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6020
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6021
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6022
  format %{ "AGF     $dst, $src\t # long/int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6023
  opcode(AGF_ZOPC, AGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6024
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6025
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6026
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6027
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6028
instruct addL_Reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6029
  match(Set dst (AddL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6030
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6031
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6032
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6033
  format %{ "AG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6034
  opcode(AG_ZOPC, AG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6035
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6036
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6037
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6038
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6039
instruct addL_reg_reg_imm12(iRegL dst, iRegL src1, iRegL src2, uimmL12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6040
  match(Set dst (AddL (AddL src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6041
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6042
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6043
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6044
  format %{ "LA     $dst,$con($src1,$src2)\t # long d12(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6045
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6046
  ins_encode(z_rxform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6047
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6048
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6049
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6050
instruct addL_reg_reg_imm20(iRegL dst, iRegL src1, iRegL src2, immL20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6051
  match(Set dst (AddL (AddL src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6052
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6053
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6054
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6055
  format %{ "LAY    $dst,$con($src1,$src2)\t # long d20(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6056
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6057
  ins_encode(z_rxyform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6058
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6059
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6060
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6061
// MEM = MEM + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6062
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6063
// Add Immediate to 8-byte memory operand and result.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6064
instruct addL_mem_imm(memoryRSY mem, immL8 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6065
  match(Set mem (StoreL mem (AddL (LoadL mem) src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6066
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6067
  predicate(VM_Version::has_MemWithImmALUOps());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6068
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6069
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6070
  format %{ "AGSI    $mem,$src\t # direct mem add 8" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6071
  opcode(AGSI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6072
  ins_encode(z_siyform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6073
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6074
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6075
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6076
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6077
// REG = REG + REG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6078
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6079
// Ptr Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6080
instruct addP_reg_reg_LA(iRegP dst, iRegP_N2P src1, iRegL src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6081
  match(Set dst (AddP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6082
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6083
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6084
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6085
  format %{ "LA      $dst,#0($src1,$src2)\t # ptr 0(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6086
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6087
  ins_encode(z_rxform_imm_reg_reg(dst, 0x0, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6088
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6089
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6090
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6091
// Ptr Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6092
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6093
instruct addP_reg_reg_CISC(iRegP dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6094
  match(Set dst (AddP dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6095
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6096
  predicate(!PreferLAoverADD && !VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6097
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6098
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6099
  format %{ "ALGR    $dst,$src\t # ptr CICS ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6100
  opcode(ALGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6101
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6102
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6103
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6104
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6105
// Ptr Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6106
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6107
instruct addP_reg_reg_RISC(iRegP dst, iRegP_N2P src1, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6108
  match(Set dst (AddP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6109
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6110
  predicate(!PreferLAoverADD && VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6111
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6112
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6113
  format %{ "ALGRK   $dst,$src1,$src2\t # ptr RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6114
  opcode(ALGRK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6115
  ins_encode(z_rrfform(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6116
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6117
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6118
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6119
// REG = REG + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6120
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6121
instruct addP_reg_imm12(iRegP dst, iRegP_N2P src, uimmL12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6122
  match(Set dst (AddP src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6123
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6124
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6125
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6126
  format %{ "LA      $dst,$con(,$src)\t # ptr d12(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6127
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6128
  ins_encode(z_rxform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6129
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6130
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6131
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6132
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6133
instruct addP_reg_imm16_CISC(iRegP dst, immL16 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6134
  match(Set dst (AddP dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6135
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6136
  predicate(!PreferLAoverADD && !VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6137
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6138
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6139
  format %{ "AGHI    $dst,$src\t # ptr CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6140
  opcode(AGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6141
  ins_encode(z_riform_signed(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6142
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6143
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6144
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6145
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6146
instruct addP_reg_imm16_RISC(iRegP dst, iRegP_N2P src, immL16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6147
  match(Set dst (AddP src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6148
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6149
  predicate(!PreferLAoverADD && VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6150
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6151
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6152
  format %{ "ALGHSIK $dst,$src,$con\t # ptr RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6153
  opcode(ALGHSIK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6154
  ins_encode(z_rieform_d(dst, src, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6155
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6156
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6157
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6158
instruct addP_reg_imm20(iRegP dst, memoryRegP src, immL20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6159
  match(Set dst (AddP src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6160
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6161
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6162
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6163
  format %{ "LAY     $dst,$con(,$src)\t # ptr d20(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6164
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6165
  ins_encode(z_rxyform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6166
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6167
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6168
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6169
// Pointer Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6170
instruct addP_reg_imm32(iRegP dst, immL32 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6171
  match(Set dst (AddP dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6172
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6173
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6174
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6175
  format %{ "AGFI    $dst,$src\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6176
  opcode(AGFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6177
  ins_encode(z_rilform_signed(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6178
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6179
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6180
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6181
// REG = REG1 + REG2 + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6182
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6183
instruct addP_reg_reg_imm12(iRegP dst, memoryRegP src1, iRegL src2, uimmL12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6184
  match(Set dst (AddP (AddP src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6185
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6186
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6187
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6188
  format %{ "LA      $dst,$con($src1,$src2)\t # ptr d12(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6189
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6190
  ins_encode(z_rxform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6191
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6192
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6193
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6194
instruct addP_regN_reg_imm12(iRegP dst, iRegP_N2P src1, iRegL src2, uimmL12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6195
  match(Set dst (AddP (AddP src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6196
  predicate( PreferLAoverADD && Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6197
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6198
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6199
  format %{ "LA      $dst,$con($src1,$src2)\t # ptr d12(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6200
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6201
  ins_encode(z_rxform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6202
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6203
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6204
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6205
instruct addP_reg_reg_imm20(iRegP dst, memoryRegP src1, iRegL src2, immL20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6206
  match(Set dst (AddP (AddP src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6207
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6208
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6209
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6210
  format %{ "LAY     $dst,$con($src1,$src2)\t # ptr d20(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6211
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6212
  ins_encode(z_rxyform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6213
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6214
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6215
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6216
instruct addP_regN_reg_imm20(iRegP dst, iRegP_N2P src1, iRegL src2, immL20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6217
  match(Set dst (AddP (AddP src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6218
  predicate( PreferLAoverADD && Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6219
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6220
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6221
  format %{ "LAY     $dst,$con($src1,$src2)\t # ptr d20(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6222
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6223
  ins_encode(z_rxyform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6224
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6225
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6226
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6227
// MEM = MEM + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6228
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6229
// Add Immediate to 8-byte memory operand and result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6230
instruct addP_mem_imm(memoryRSY mem, immL8 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6231
  match(Set mem (StoreP mem (AddP (LoadP mem) src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6232
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6233
  predicate(VM_Version::has_MemWithImmALUOps());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6234
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6235
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6236
  format %{ "AGSI    $mem,$src\t # direct mem add 8 (ptr)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6237
  opcode(AGSI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6238
  ins_encode(z_siyform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6239
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6240
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6241
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6242
// SUB
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6243
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6244
// Register Subtraction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6245
instruct subI_reg_reg_CISC(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6246
  match(Set dst (SubI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6247
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6248
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6249
  format %{ "SR      $dst,$src\t # int  CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6250
  opcode(SR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6251
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6252
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6253
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6254
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6255
instruct subI_reg_reg_RISC(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6256
  match(Set dst (SubI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6257
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6258
  predicate(VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6259
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6260
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6261
  format %{ "SRK     $dst,$src1,$src2\t # int  RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6262
  opcode(SRK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6263
  ins_encode(z_rrfform(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6264
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6265
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6266
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6267
instruct subI_Reg_mem(iRegI dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6268
  match(Set dst (SubI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6269
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6270
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6271
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6272
  format %{ "S(Y)    $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6273
  opcode(SY_ZOPC, S_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6274
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6275
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6276
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6277
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6278
instruct subI_zero_reg(iRegI dst, immI_0 zero, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6279
  match(Set dst (SubI zero src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6280
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6281
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6282
  format %{ "NEG     $dst, $src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6283
  ins_encode %{ __ z_lcr($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6284
  ins_pipe(pipe_class_dummy);
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
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6288
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6289
// Long subtraction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6290
instruct subL_reg_reg_CISC(iRegL dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6291
  match(Set dst (SubL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6292
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6293
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6294
  format %{ "SGR     $dst,$src\t # int  CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6295
  opcode(SGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6296
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6297
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6298
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6299
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6300
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6301
instruct subL_reg_reg_RISC(iRegL dst, iRegL src1, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6302
  match(Set dst (SubL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6303
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6304
  predicate(VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6305
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6306
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6307
  format %{ "SGRK    $dst,$src1,$src2\t # int  RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6308
  opcode(SGRK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6309
  ins_encode(z_rrfform(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6310
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6311
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6312
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6313
instruct subL_reg_regI_CISC(iRegL dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6314
  match(Set dst (SubL dst (ConvI2L src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6315
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6316
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6317
  format %{ "SGFR    $dst, $src\t # int  CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6318
  opcode(SGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6319
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6320
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6321
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6322
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6323
instruct subL_Reg_memI(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6324
  match(Set dst (SubL dst (ConvI2L (LoadI src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6325
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6326
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6327
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6328
  format %{ "SGF     $dst, $src\t # long/int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6329
  opcode(SGF_ZOPC, SGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6330
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6331
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6332
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6333
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6334
instruct subL_Reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6335
  match(Set dst (SubL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6336
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6337
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6338
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6339
  format %{ "SG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6340
  opcode(SG_ZOPC, SG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6341
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6342
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6343
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6344
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6345
// Moved declaration of negL_reg_reg before encode nodes, where it is used.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6346
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6347
//  MUL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6348
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6349
// Register Multiplication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6350
instruct mulI_reg_reg(iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6351
  match(Set dst (MulI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6352
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6353
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6354
  format %{ "MSR     $dst, $src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6355
  opcode(MSR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6356
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6357
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6358
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6359
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6360
// Immediate Multiplication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6361
instruct mulI_reg_imm16(iRegI dst, immI16 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6362
  match(Set dst (MulI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6363
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6364
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6365
  format %{ "MHI     $dst,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6366
  opcode(MHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6367
  ins_encode(z_riform_signed(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6368
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6369
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6370
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6371
// Immediate (32bit) Multiplication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6372
instruct mulI_reg_imm32(iRegI dst, immI con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6373
  match(Set dst (MulI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6374
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6375
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6376
  format %{ "MSFI    $dst,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6377
  opcode(MSFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6378
  ins_encode(z_rilform_signed(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6379
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6380
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6381
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6382
instruct mulI_Reg_mem(iRegI dst, memory src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6383
  match(Set dst (MulI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6384
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6385
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6386
  format %{ "MS(Y)   $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6387
  opcode(MSY_ZOPC, MS_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6388
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6389
  ins_pipe(pipe_class_dummy);
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
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6393
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6394
instruct mulL_reg_regI(iRegL dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6395
  match(Set dst (MulL dst (ConvI2L src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6396
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6397
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6398
  format %{ "MSGFR   $dst $src\t # long/int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6399
  opcode(MSGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6400
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6401
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6402
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6403
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6404
instruct mulL_reg_reg(iRegL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6405
  match(Set dst (MulL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6406
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6407
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6408
  format %{ "MSGR    $dst $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6409
  opcode(MSGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6410
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6411
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6412
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6413
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6414
// Immediate Multiplication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6415
instruct mulL_reg_imm16(iRegL dst, immL16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6416
  match(Set dst (MulL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6417
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6418
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6419
  format %{ "MGHI    $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6420
  opcode(MGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6421
  ins_encode(z_riform_signed(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6422
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6423
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6424
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6425
// Immediate (32bit) Multiplication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6426
instruct mulL_reg_imm32(iRegL dst, immL32 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6427
  match(Set dst (MulL dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6428
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6429
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6430
  format %{ "MSGFI   $dst,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6431
  opcode(MSGFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6432
  ins_encode(z_rilform_signed(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6433
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6434
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6435
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6436
instruct mulL_Reg_memI(iRegL dst, memory src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6437
  match(Set dst (MulL dst (ConvI2L (LoadI src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6438
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6439
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6440
  format %{ "MSGF    $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6441
  opcode(MSGF_ZOPC, MSGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6442
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6443
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6444
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6445
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6446
instruct mulL_Reg_mem(iRegL dst, memory src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6447
  match(Set dst (MulL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6448
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6449
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6450
  format %{ "MSG     $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6451
  opcode(MSG_ZOPC, MSG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6452
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6453
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6454
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6455
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6456
//  DIV
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6457
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6458
// Integer DIVMOD with Register, both quotient and mod results
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6459
instruct divModI_reg_divmod(roddRegI dst1src1, revenRegI dst2, noOdd_iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6460
  match(DivModI dst1src1 src2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6461
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6462
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6463
  size(VM_Version::has_CompareBranch() ? 24 : 26);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6464
  format %{ "DIVMODI ($dst1src1, $dst2) $src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6465
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6466
    Register d1s1 = $dst1src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6467
    Register d2   = $dst2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6468
    Register s2   = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6469
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6470
    assert_different_registers(d1s1, s2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6471
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6472
    Label do_div, done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6473
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6474
      __ z_cij(s2, -1, Assembler::bcondNotEqual, do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6475
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6476
      __ z_chi(s2, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6477
      __ z_brne(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6478
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6479
    __ z_lcr(d1s1, d1s1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6480
    __ clear_reg(d2, false, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6481
    __ z_bru(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6482
    __ bind(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6483
    __ z_lgfr(d1s1, d1s1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6484
    __ z_dsgfr(d2, s2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6485
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6486
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6487
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6488
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6489
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6490
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6491
// Register Division
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6492
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
  6493
  match(Set dst (DivI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6494
  effect(KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6495
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6496
  size(VM_Version::has_CompareBranch() ? 20 : 22);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6497
  format %{ "DIV_checked $dst, $src1,$src2\t # treats special case 0x80../-1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6498
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6499
    Register a = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6500
    Register b = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6501
    Register t = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6502
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6503
    assert_different_registers(t, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6504
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6505
    Label do_div, done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6506
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6507
      __ z_cij(b, -1, Assembler::bcondNotEqual, do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6508
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6509
      __ z_chi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6510
      __ z_brne(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6511
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6512
    __ z_lcr(t, a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6513
    __ z_bru(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6514
    __ bind(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6515
    __ z_lgfr(t, a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6516
    __ z_dsgfr(t->predecessor()/* t is odd part of a register pair. */, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6517
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6518
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6519
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6520
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6521
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6522
// Immediate Division
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6523
instruct divI_reg_imm16(roddRegI dst, iRegI src1, immI16 src2, revenRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6524
  match(Set dst (DivI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6525
  effect(KILL tmp, KILL cr);  // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6526
  ins_cost(2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6527
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6528
  format %{ "DIV_const  $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6529
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6530
    // No sign extension of Rdividend needed here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6531
    if ($src2$$constant != -1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6532
      __ z_lghi(Z_R0_scratch, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6533
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6534
      __ 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
  6535
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6536
      __ z_lcr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6537
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6538
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6539
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6540
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6541
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6542
// Long DIVMOD with Register, both quotient and mod results
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6543
instruct divModL_reg_divmod(roddRegL dst1src1, revenRegL dst2, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6544
  match(DivModL dst1src1 src2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6545
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6546
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6547
  size(VM_Version::has_CompareBranch() ? 22 : 24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6548
  format %{ "DIVMODL ($dst1src1, $dst2) $src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6549
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6550
    Register d1s1 = $dst1src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6551
    Register d2   = $dst2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6552
    Register s2   = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6553
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6554
    Label do_div, done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6555
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6556
      __ z_cgij(s2, -1, Assembler::bcondNotEqual, do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6557
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6558
      __ z_cghi(s2, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6559
      __ z_brne(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6560
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6561
    __ z_lcgr(d1s1, d1s1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6562
    // indicate unused result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6563
    (void) __ clear_reg(d2, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6564
    __ z_bru(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6565
    __ bind(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6566
    __ z_dsgr(d2, s2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6567
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6568
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6569
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6570
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6571
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6572
// Register Long Division
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6573
instruct divL_reg_reg(roddRegL dst, iRegL src, revenRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6574
  match(Set dst (DivL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6575
  effect(KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6576
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6577
  size(VM_Version::has_CompareBranch() ? 18 : 20);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6578
  format %{ "DIVG_checked  $dst, $src\t # long, treats special case 0x80../-1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6579
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6580
    Register b = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6581
    Register t = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6582
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6583
    Label done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6584
    __ z_lcgr(t, t);    // Does no harm. divisor is in other register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6585
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6586
      __ z_cgij(b, -1, Assembler::bcondEqual, done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6587
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6588
      __ z_cghi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6589
      __ z_bre(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6590
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6591
    __ z_lcgr(t, t);    // Restore sign.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6592
    __ z_dsgr(t->predecessor()/* t is odd part of a register pair. */, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6593
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6594
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6595
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6596
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6597
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6598
// Immediate Long Division
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6599
instruct divL_reg_imm16(roddRegL dst, iRegL src1, immL16 src2, revenRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6600
  match(Set dst (DivL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6601
  effect(KILL tmp, KILL cr);  // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6602
  ins_cost(2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6603
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6604
  format %{ "DIVG_const  $dst,$src1,$src2\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6605
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6606
    if ($src2$$constant != -1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6607
      __ z_lghi(Z_R0_scratch, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6608
      __ lgr_if_needed($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6609
      __ 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
  6610
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6611
      __ z_lcgr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6612
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6613
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6614
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6615
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6616
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6617
// REM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6618
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6619
// Integer Remainder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6620
// Register Remainder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6621
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
  6622
  match(Set dst (ModI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6623
  effect(KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6624
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6625
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6626
  format %{ "MOD_checked   $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6627
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6628
    Register a = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6629
    Register b = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6630
    Register t = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6631
    assert_different_registers(t->successor(), b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6632
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6633
    Label do_div, done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6634
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6635
    if ((t->encoding() != b->encoding()) && (t->encoding() != a->encoding())) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6636
      (void) __ clear_reg(t, true, false);  // Does no harm. Operands are in other regs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6637
      if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6638
        __ z_cij(b, -1, Assembler::bcondEqual, done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6639
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6640
        __ z_chi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6641
        __ z_bre(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6642
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6643
      __ z_lgfr(t->successor(), a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6644
      __ z_dsgfr(t/* t is even part of a register pair. */, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6645
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6646
      if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6647
        __ z_cij(b, -1, Assembler::bcondNotEqual, do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6648
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6649
        __ z_chi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6650
        __ z_brne(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6651
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6652
      __ clear_reg(t, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6653
      __ z_bru(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6654
      __ bind(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6655
      __ z_lgfr(t->successor(), a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6656
      __ z_dsgfr(t/* t is even part of a register pair. */, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6657
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6658
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6659
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6660
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6661
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6662
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6663
// Immediate Remainder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6664
instruct modI_reg_imm16(revenRegI dst, iRegI src1, immI16 src2, roddRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6665
  match(Set dst (ModI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6666
  effect(KILL tmp, KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6667
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6668
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6669
  format %{ "MOD_const  $dst,src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6670
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6671
    assert_different_registers($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6672
    assert_different_registers($dst$$Register->successor(), $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6673
    int divisor = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6674
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6675
    if (divisor != -1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6676
      __ z_lghi(Z_R0_scratch, divisor);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6677
      __ z_lgfr($dst$$Register->successor(), $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6678
      __ 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
  6679
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6680
      __ clear_reg($dst$$Register, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6681
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6682
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6683
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6684
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6685
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6686
// Register Long Remainder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6687
instruct modL_reg_reg(revenRegL dst, roddRegL src1, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6688
  match(Set dst (ModL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6689
  effect(KILL src1, KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6690
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6691
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6692
  format %{ "MODG_checked   $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6693
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6694
    Register a = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6695
    Register b = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6696
    Register t = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6697
    assert(t->successor() == a, "(t,a) is an even-odd pair" );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6698
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6699
    Label do_div, done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6700
    if (t->encoding() != b->encoding()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6701
      (void) __ clear_reg(t, true, false); // Does no harm. Dividend is in successor.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6702
      if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6703
        __ z_cgij(b, -1, Assembler::bcondEqual, done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6704
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6705
        __ z_cghi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6706
        __ z_bre(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6707
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6708
      __ z_dsgr(t, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6709
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6710
      if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6711
        __ z_cgij(b, -1, Assembler::bcondNotEqual, do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6712
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6713
        __ z_cghi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6714
        __ z_brne(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6715
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6716
      __ clear_reg(t, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6717
      __ z_bru(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6718
      __ bind(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6719
      __ z_dsgr(t, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6720
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6721
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6722
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6723
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6724
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6725
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6726
// Register Long Remainder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6727
instruct modL_reg_imm16(revenRegL dst, iRegL src1, immL16 src2, roddRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6728
  match(Set dst (ModL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6729
  effect(KILL tmp, KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6730
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6731
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6732
  format %{ "MODG_const  $dst,src1,$src2\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6733
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6734
    int divisor = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6735
    if (divisor != -1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6736
      __ z_lghi(Z_R0_scratch, divisor);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6737
      __ z_lgr($dst$$Register->successor(), $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6738
      __ 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
  6739
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6740
      __ clear_reg($dst$$Register, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6741
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6742
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6743
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6744
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6745
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6746
// SHIFT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6747
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6748
// Shift left logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6749
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6750
// Register Shift Left variable
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6751
instruct sllI_reg_reg(iRegI dst, iRegI src, iRegI nbits, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6752
  match(Set dst (LShiftI src nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6753
  effect(KILL cr); // R1 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6754
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6755
  size(14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6756
  format %{ "SLL     $dst,$src,[$nbits] & 31\t# use RISC-like SLLG also for int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6757
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6758
    __ z_lgr(Z_R1_scratch, $nbits$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6759
    __ z_nill(Z_R1_scratch, BitsPerJavaInteger-1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6760
    __ z_sllg($dst$$Register, $src$$Register, 0, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6761
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6762
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6763
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6764
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6765
// Register Shift Left Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6766
// Constant shift count is masked in ideal graph already.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6767
instruct sllI_reg_imm(iRegI dst, iRegI src, immI nbits) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6768
  match(Set dst (LShiftI src nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6769
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6770
  format %{ "SLL     $dst,$src,$nbits\t# use RISC-like SLLG also for int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6771
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6772
    int Nbit = $nbits$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6773
    __ z_sllg($dst$$Register, $src$$Register, Nbit & (BitsPerJavaInteger - 1), Z_R0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6774
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6775
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6776
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6777
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6778
// Register Shift Left Immediate by 1bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6779
instruct sllI_reg_imm_1(iRegI dst, iRegI src, immI_1 nbits) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6780
  match(Set dst (LShiftI src nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6781
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6782
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6783
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6784
  format %{ "LA      $dst,#0($src,$src)\t # SLL by 1 (int)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6785
  ins_encode %{ __ z_la($dst$$Register, 0, $src$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6786
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6787
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6788
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6789
// Register Shift Left Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6790
instruct sllL_reg_reg(iRegL dst, iRegL src1, iRegI nbits) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6791
  match(Set dst (LShiftL src1 nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6792
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6793
  format %{ "SLLG    $dst,$src1,[$nbits]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6794
  opcode(SLLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6795
  ins_encode(z_rsyform_reg_reg(dst, src1, nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6796
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6797
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6798
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6799
// Register Shift Left Long Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6800
instruct sllL_reg_imm(iRegL dst, iRegL src1, immI nbits) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6801
  match(Set dst (LShiftL src1 nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6802
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6803
  format %{ "SLLG    $dst,$src1,$nbits" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6804
  opcode(SLLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6805
  ins_encode(z_rsyform_const(dst, src1, nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6806
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6807
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6808
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6809
// Register Shift Left Long Immediate by 1bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6810
instruct sllL_reg_imm_1(iRegL dst, iRegL src1, immI_1 nbits) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6811
  match(Set dst (LShiftL src1 nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6812
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6813
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6814
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6815
  format %{ "LA      $dst,#0($src1,$src1)\t # SLLG by 1 (long)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6816
  ins_encode %{ __ z_la($dst$$Register, 0, $src1$$Register, $src1$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6817
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6818
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6819
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6820
// Shift right arithmetic
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6821
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6822
// Register Arithmetic Shift Right
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6823
instruct sraI_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6824
  match(Set dst (RShiftI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6825
  effect(KILL cr); // R1 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6826
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6827
  size(12);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6828
  format %{ "SRA     $dst,[$src] & 31" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6829
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6830
    __ z_lgr(Z_R1_scratch, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6831
    __ z_nill(Z_R1_scratch, BitsPerJavaInteger-1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6832
    __ z_sra($dst$$Register, 0, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6833
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6834
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6835
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6836
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6837
// Register Arithmetic Shift Right Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6838
// Constant shift count is masked in ideal graph already.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6839
instruct sraI_reg_imm(iRegI dst, immI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6840
  match(Set dst (RShiftI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6841
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6842
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6843
  format %{ "SRA     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6844
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6845
    int Nbit = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6846
    __ z_sra($dst$$Register, Nbit & (BitsPerJavaInteger - 1), Z_R0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6847
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6848
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6849
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6850
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6851
// Register Arithmetic Shift Right Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6852
instruct sraL_reg_reg(iRegL dst, iRegL src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6853
  match(Set dst (RShiftL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6854
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6855
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6856
  format %{ "SRAG    $dst,$src1,[$src2]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6857
  opcode(SRAG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6858
  ins_encode(z_rsyform_reg_reg(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6859
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6860
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6861
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6862
// Register Arithmetic Shift Right Long Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6863
instruct sraL_reg_imm(iRegL dst, iRegL src1, immI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6864
  match(Set dst (RShiftL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6865
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6866
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6867
  format %{ "SRAG    $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6868
  opcode(SRAG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6869
  ins_encode(z_rsyform_const(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6870
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6871
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6872
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6873
//  Shift right logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6874
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6875
// Register Shift Right
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6876
instruct srlI_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6877
  match(Set dst (URShiftI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6878
  effect(KILL cr); // R1 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6879
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6880
  size(12);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6881
  format %{ "SRL     $dst,[$src] & 31" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6882
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6883
    __ z_lgr(Z_R1_scratch, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6884
    __ z_nill(Z_R1_scratch, BitsPerJavaInteger-1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6885
    __ z_srl($dst$$Register, 0, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6886
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6887
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6888
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6889
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6890
// Register Shift Right Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6891
// Constant shift count is masked in ideal graph already.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6892
instruct srlI_reg_imm(iRegI dst, immI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6893
  match(Set dst (URShiftI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6894
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6895
  format %{ "SRL     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6896
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6897
    int Nbit = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6898
    __ z_srl($dst$$Register, Nbit & (BitsPerJavaInteger - 1), Z_R0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6899
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6900
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6901
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6902
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6903
// Register Shift Right Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6904
instruct srlL_reg_reg(iRegL dst, iRegL src1, iRegI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6905
  match(Set dst (URShiftL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6906
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6907
  format %{ "SRLG    $dst,$src1,[$src2]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6908
  opcode(SRLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6909
  ins_encode(z_rsyform_reg_reg(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6910
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6911
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6912
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6913
// Register Shift Right Long Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6914
instruct srlL_reg_imm(iRegL dst, iRegL src1, immI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6915
  match(Set dst (URShiftL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6916
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6917
  format %{ "SRLG    $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6918
  opcode(SRLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6919
  ins_encode(z_rsyform_const(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6920
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6921
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6922
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6923
// Register Shift Right Immediate with a CastP2X
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6924
instruct srlP_reg_imm(iRegL dst, iRegP_N2P src1, immI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6925
  match(Set dst (URShiftL (CastP2X src1) src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6926
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6927
  format %{ "SRLG    $dst,$src1,$src2\t # Cast ptr $src1 to long and shift" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6928
  opcode(SRLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6929
  ins_encode(z_rsyform_const(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6930
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6931
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6932
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6933
//----------Rotate Instructions------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6934
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6935
// Rotate left 32bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6936
instruct rotlI_reg_immI8(iRegI dst, iRegI src, immI8 lshift, immI8 rshift) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6937
  match(Set dst (OrI (LShiftI src lshift) (URShiftI src rshift)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6938
  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
  6939
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6940
  format %{ "RLL     $dst,$src,$lshift\t # ROTL32" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6941
  opcode(RLL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6942
  ins_encode(z_rsyform_const(dst, src, lshift));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6943
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6944
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6945
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6946
// Rotate left 64bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6947
instruct rotlL_reg_immI8(iRegL dst, iRegL src, immI8 lshift, immI8 rshift) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6948
  match(Set dst (OrL (LShiftL src lshift) (URShiftL src rshift)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6949
  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
  6950
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6951
  format %{ "RLLG    $dst,$src,$lshift\t # ROTL64" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6952
  opcode(RLLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6953
  ins_encode(z_rsyform_const(dst, src, lshift));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6954
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6955
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6956
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6957
// Rotate right 32bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6958
instruct rotrI_reg_immI8(iRegI dst, iRegI src, immI8 rshift, immI8 lshift) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6959
  match(Set dst (OrI (URShiftI src rshift) (LShiftI src lshift)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6960
  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
  6961
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6962
  format %{ "RLL     $dst,$src,$rshift\t # ROTR32" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6963
  opcode(RLL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6964
  ins_encode(z_rsyform_const(dst, src, rshift));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6965
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6966
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6967
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6968
// Rotate right 64bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6969
instruct rotrL_reg_immI8(iRegL dst, iRegL src, immI8 rshift, immI8 lshift) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6970
  match(Set dst (OrL (URShiftL src rshift) (LShiftL src lshift)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6971
  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
  6972
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6973
  format %{ "RLLG    $dst,$src,$rshift\t # ROTR64" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6974
  opcode(RLLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6975
  ins_encode(z_rsyform_const(dst, src, rshift));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6976
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6977
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6978
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6979
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6980
//----------Overflow Math Instructions-----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6981
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6982
instruct overflowAddI_reg_reg(flagsReg cr, iRegI op1, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6983
  match(Set cr (OverflowAddI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6984
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6985
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6986
  format %{ "AR      $op1,$op2\t # overflow check int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6987
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6988
    __ z_lr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6989
    __ z_ar(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6990
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6991
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6992
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6993
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6994
instruct overflowAddI_reg_imm(flagsReg cr, iRegI op1, immI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6995
  match(Set cr (OverflowAddI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6996
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6997
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6998
  format %{ "AR      $op1,$op2\t # overflow check int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6999
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7000
    __ load_const_optimized(Z_R0_scratch, $op2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7001
    __ z_ar(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7002
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7003
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7004
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7005
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7006
instruct overflowAddL_reg_reg(flagsReg cr, iRegL op1, iRegL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7007
  match(Set cr (OverflowAddL op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7008
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7009
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7010
  format %{ "AGR     $op1,$op2\t # overflow check long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7011
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7012
    __ z_lgr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7013
    __ z_agr(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7014
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7015
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7016
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7017
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7018
instruct overflowAddL_reg_imm(flagsReg cr, iRegL op1, immL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7019
  match(Set cr (OverflowAddL op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7020
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7021
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7022
  format %{ "AGR     $op1,$op2\t # overflow check long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7023
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7024
    __ load_const_optimized(Z_R0_scratch, $op2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7025
    __ z_agr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7026
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7027
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7028
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7029
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7030
instruct overflowSubI_reg_reg(flagsReg cr, iRegI op1, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7031
  match(Set cr (OverflowSubI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7032
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7033
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7034
  format %{ "SR      $op1,$op2\t # overflow check int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7035
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7036
    __ z_lr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7037
    __ z_sr(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7038
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7039
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7040
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7041
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7042
instruct overflowSubI_reg_imm(flagsReg cr, iRegI op1, immI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7043
  match(Set cr (OverflowSubI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7044
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7045
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7046
  format %{ "SR      $op1,$op2\t # overflow check int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7047
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7048
    __ load_const_optimized(Z_R1_scratch, $op2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7049
    __ z_lr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7050
    __ z_sr(Z_R0_scratch, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7051
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7052
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7053
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7054
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7055
instruct overflowSubL_reg_reg(flagsReg cr, iRegL op1, iRegL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7056
  match(Set cr (OverflowSubL op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7057
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7058
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7059
  format %{ "SGR     $op1,$op2\t # overflow check long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7060
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7061
    __ z_lgr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7062
    __ z_sgr(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7063
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7064
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7065
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7066
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7067
instruct overflowSubL_reg_imm(flagsReg cr, iRegL op1, immL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7068
  match(Set cr (OverflowSubL op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7069
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7070
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7071
  format %{ "SGR     $op1,$op2\t # overflow check long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7072
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7073
    __ load_const_optimized(Z_R1_scratch, $op2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7074
    __ z_lgr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7075
    __ z_sgr(Z_R0_scratch, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7076
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7077
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7078
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7079
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7080
instruct overflowNegI_rReg(flagsReg cr, immI_0 zero, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7081
  match(Set cr (OverflowSubI zero op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7082
  effect(DEF cr, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7083
  format %{ "NEG    $op2\t# overflow check int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7084
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7085
    __ clear_reg(Z_R0_scratch, false, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7086
    __ z_sr(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7087
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7088
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7089
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7090
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7091
instruct overflowNegL_rReg(flagsReg cr, immL_0 zero, iRegL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7092
  match(Set cr (OverflowSubL zero op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7093
  effect(DEF cr, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7094
  format %{ "NEGG    $op2\t# overflow check long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7095
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7096
    __ clear_reg(Z_R0_scratch, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7097
    __ z_sgr(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7098
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7099
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7100
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7101
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7102
// No intrinsics for multiplication, since there is no easy way
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7103
// to check for overflow.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7104
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7105
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7106
//----------Floating Point Arithmetic Instructions-----------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7107
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7108
//  ADD
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7109
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7110
//  Add float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7111
instruct addF_reg_reg(regF dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7112
  match(Set dst (AddF dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7113
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7114
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7115
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7116
  format %{ "AEBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7117
  opcode(AEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7118
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7119
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7120
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7121
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7122
instruct addF_reg_mem(regF dst, memoryRX src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7123
  match(Set dst (AddF dst (LoadF src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7124
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7125
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7126
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7127
  format %{ "AEB      $dst,$src\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7128
  opcode(AEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7129
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7130
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7131
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7132
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7133
// Add float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7134
instruct addD_reg_reg(regD dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7135
  match(Set dst (AddD dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7136
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7137
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7138
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7139
  format %{ "ADBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7140
  opcode(ADBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7141
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7142
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7143
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7144
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7145
instruct addD_reg_mem(regD dst, memoryRX src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7146
  match(Set dst (AddD dst (LoadD src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7147
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7148
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7149
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7150
  format %{ "ADB      $dst,$src\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7151
  opcode(ADB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7152
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7153
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7154
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7155
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7156
// SUB
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7157
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7158
// Sub float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7159
instruct subF_reg_reg(regF dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7160
  match(Set dst (SubF dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7161
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7162
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7163
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7164
  format %{ "SEBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7165
  opcode(SEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7166
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7167
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7168
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7169
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7170
instruct subF_reg_mem(regF dst, memoryRX src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7171
  match(Set dst (SubF dst (LoadF src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7172
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7173
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7174
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7175
  format %{ "SEB      $dst,$src\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7176
  opcode(SEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7177
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7178
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7179
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7180
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7181
//  Sub float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7182
instruct subD_reg_reg(regD dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7183
  match(Set dst (SubD dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7184
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7185
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7186
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7187
  format %{ "SDBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7188
  opcode(SDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7189
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7190
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7191
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7192
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7193
instruct subD_reg_mem(regD dst, memoryRX src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7194
  match(Set dst (SubD dst (LoadD src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7195
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7196
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7197
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7198
  format %{ "SDB      $dst,$src\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7199
  opcode(SDB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7200
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7201
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7202
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7203
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7204
// MUL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7205
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7206
// Mul float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7207
instruct mulF_reg_reg(regF dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7208
  match(Set dst (MulF dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7209
  // CC unchanged by MUL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7210
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7211
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7212
  format %{ "MEEBR    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7213
  opcode(MEEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7214
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7215
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7216
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7217
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7218
instruct mulF_reg_mem(regF dst, memoryRX src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7219
  match(Set dst (MulF dst (LoadF src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7220
  // CC unchanged by MUL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7221
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7222
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7223
  format %{ "MEEB     $dst,$src\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7224
  opcode(MEEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7225
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7226
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7227
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7228
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7229
//  Mul float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7230
instruct mulD_reg_reg(regD dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7231
  match(Set dst (MulD dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7232
  // CC unchanged by MUL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7233
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7234
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7235
  format %{ "MDBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7236
  opcode(MDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7237
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7238
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7239
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7240
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7241
instruct mulD_reg_mem(regD dst, memoryRX src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7242
  match(Set dst (MulD dst (LoadD src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7243
  // CC unchanged by MUL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7244
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7245
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7246
  format %{ "MDB      $dst,$src\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7247
  opcode(MDB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7248
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7249
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7250
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7251
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7252
//  DIV
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7253
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7254
//  Div float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7255
instruct divF_reg_reg(regF dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7256
  match(Set dst (DivF dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7257
  // CC unchanged by DIV.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7258
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7259
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7260
  format %{ "DEBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7261
  opcode(DEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7262
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7263
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7264
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7265
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7266
instruct divF_reg_mem(regF dst, memoryRX src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7267
  match(Set dst (DivF dst (LoadF src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7268
  // CC unchanged by DIV.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7269
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7270
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7271
  format %{ "DEB      $dst,$src\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7272
  opcode(DEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7273
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7274
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7275
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7276
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7277
//  Div float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7278
instruct divD_reg_reg(regD dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7279
  match(Set dst (DivD dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7280
  // CC unchanged by DIV.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7281
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7282
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7283
  format %{ "DDBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7284
  opcode(DDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7285
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7286
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7287
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7288
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7289
instruct divD_reg_mem(regD dst, memoryRX src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7290
  match(Set dst (DivD dst (LoadD src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7291
  // CC unchanged by DIV.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7292
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7293
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7294
  format %{ "DDB      $dst,$src\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7295
  opcode(DDB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7296
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7297
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7298
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7299
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7300
// ABS
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7301
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7302
// Absolute float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7303
instruct absF_reg(regF dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7304
  match(Set dst (AbsF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7305
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7306
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7307
  format %{ "LPEBR    $dst,$src\t float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7308
  opcode(LPEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7309
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7310
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7311
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7312
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7313
// Absolute float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7314
instruct absD_reg(regD dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7315
  match(Set dst (AbsD src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7316
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7317
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7318
  format %{ "LPDBR    $dst,$src\t double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7319
  opcode(LPDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7320
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7321
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7322
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7323
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7324
//  NEG(ABS)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7325
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7326
// Negative absolute float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7327
instruct nabsF_reg(regF dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7328
  match(Set dst (NegF (AbsF src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7329
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7330
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7331
  format %{ "LNEBR    $dst,$src\t float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7332
  opcode(LNEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7333
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7334
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7335
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7336
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7337
// Negative absolute float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7338
instruct nabsD_reg(regD dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7339
  match(Set dst (NegD (AbsD src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7340
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7341
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7342
  format %{ "LNDBR    $dst,$src\t double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7343
  opcode(LNDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7344
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7345
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7346
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7347
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7348
// NEG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7349
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7350
instruct negF_reg(regF dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7351
  match(Set dst (NegF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7352
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7353
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7354
  format %{ "NegF     $dst,$src\t float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7355
  ins_encode %{ __ z_lcebr($dst$$FloatRegister, $src$$FloatRegister); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7356
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7357
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7358
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7359
instruct negD_reg(regD dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7360
  match(Set dst (NegD src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7361
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7362
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7363
  format %{ "NegD     $dst,$src\t double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7364
  ins_encode %{ __ z_lcdbr($dst$$FloatRegister, $src$$FloatRegister); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7365
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7366
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7367
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7368
// SQRT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7369
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7370
// Sqrt float precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7371
instruct sqrtF_reg(regF dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7372
  match(Set dst (ConvD2F (SqrtD (ConvF2D src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7373
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7374
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7375
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7376
  format %{ "SQEBR    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7377
  opcode(SQEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7378
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7379
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7380
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7381
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7382
// Sqrt double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7383
instruct sqrtD_reg(regD dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7384
  match(Set dst (SqrtD src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7385
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7386
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7387
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7388
  format %{ "SQDBR    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7389
  opcode(SQDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7390
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7391
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7392
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7393
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7394
instruct sqrtF_mem(regF dst, memoryRX src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7395
  match(Set dst (ConvD2F (SqrtD (ConvF2D src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7396
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7397
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7398
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7399
  format %{ "SQEB     $dst,$src\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7400
  opcode(SQEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7401
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7402
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7403
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7404
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7405
instruct sqrtD_mem(regD dst, memoryRX src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7406
  match(Set dst (SqrtD src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7407
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7408
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7409
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7410
  format %{ "SQDB     $dst,$src\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7411
  opcode(SQDB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7412
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7413
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7414
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7415
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7416
//----------Logical Instructions-----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7417
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7418
// Register And
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7419
instruct andI_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7420
  match(Set dst (AndI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7421
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7422
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7423
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7424
  format %{ "NR      $dst,$src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7425
  opcode(NR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7426
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7427
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7428
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7429
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7430
instruct andI_Reg_mem(iRegI dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7431
  match(Set dst (AndI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7432
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7433
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7434
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7435
  format %{ "N(Y)    $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7436
  opcode(NY_ZOPC, N_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7437
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7438
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7439
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7440
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7441
// Immediate And
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7442
instruct andI_reg_uimm32(iRegI dst, uimmI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7443
  match(Set dst (AndI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7444
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7445
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7446
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7447
  format %{ "NILF    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7448
  opcode(NILF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7449
  ins_encode(z_rilform_unsigned(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7450
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7451
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7452
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7453
instruct andI_reg_uimmI_LH1(iRegI dst, uimmI_LH1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7454
  match(Set dst (AndI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7455
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7456
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7457
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7458
  format %{ "NILH    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7459
  ins_encode %{ __ z_nilh($dst$$Register, ($src$$constant >> 16) & 0xFFFF); %}
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
instruct andI_reg_uimmI_LL1(iRegI dst, uimmI_LL1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7464
  match(Set dst (AndI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7465
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7466
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7467
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7468
  format %{ "NILL    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7469
  ins_encode %{ __ z_nill($dst$$Register, $src$$constant & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7470
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7471
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7472
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7473
// Register And Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7474
instruct andL_reg_reg(iRegL dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7475
  match(Set dst (AndL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7476
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7477
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7478
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7479
  format %{ "NGR     $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7480
  opcode(NGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7481
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7482
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7483
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7484
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7485
instruct andL_Reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7486
  match(Set dst (AndL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7487
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7488
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7489
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7490
  format %{ "NG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7491
  opcode(NG_ZOPC, NG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7492
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7493
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7494
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7495
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7496
instruct andL_reg_uimmL_LL1(iRegL dst, uimmL_LL1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7497
  match(Set dst (AndL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7498
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7499
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7500
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7501
  format %{ "NILL    $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7502
  ins_encode %{ __ z_nill($dst$$Register, $src$$constant & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7503
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7504
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7505
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7506
instruct andL_reg_uimmL_LH1(iRegL dst, uimmL_LH1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7507
  match(Set dst (AndL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7508
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7509
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7510
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7511
  format %{ "NILH    $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7512
  ins_encode %{ __ z_nilh($dst$$Register, ($src$$constant >> 16) & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7513
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7514
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7515
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7516
instruct andL_reg_uimmL_HL1(iRegL dst, uimmL_HL1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7517
  match(Set dst (AndL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7518
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7519
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7520
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7521
  format %{ "NIHL    $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7522
  ins_encode %{ __ z_nihl($dst$$Register, ($src$$constant >> 32) & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7523
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7524
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7525
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7526
instruct andL_reg_uimmL_HH1(iRegL dst, uimmL_HH1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7527
  match(Set dst (AndL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7528
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7529
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7530
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7531
  format %{ "NIHH    $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7532
  ins_encode %{ __ z_nihh($dst$$Register, ($src$$constant >> 48) & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7533
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7534
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7535
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7536
//  OR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7537
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7538
// Or Instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7539
// Register Or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7540
instruct orI_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7541
  match(Set dst (OrI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7542
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7543
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7544
  format %{ "OR      $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7545
  opcode(OR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7546
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7547
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7548
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7549
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7550
instruct orI_Reg_mem(iRegI dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7551
  match(Set dst (OrI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7552
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7553
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7554
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7555
  format %{ "O(Y)    $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7556
  opcode(OY_ZOPC, O_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7557
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7558
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7559
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7560
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7561
// Immediate Or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7562
instruct orI_reg_uimm16(iRegI dst, uimmI16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7563
  match(Set dst (OrI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7564
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7565
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7566
  format %{ "OILL    $dst,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7567
  opcode(OILL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7568
  ins_encode(z_riform_unsigned(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7569
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7570
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7571
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7572
instruct orI_reg_uimm32(iRegI dst, uimmI con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7573
  match(Set dst (OrI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7574
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7575
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7576
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7577
  format %{ "OILF    $dst,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7578
  opcode(OILF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7579
  ins_encode(z_rilform_unsigned(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7580
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7581
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7582
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7583
// Register Or Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7584
instruct orL_reg_reg(iRegL dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7585
  match(Set dst (OrL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7586
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7587
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7588
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7589
  format %{ "OGR      $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7590
  opcode(OGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7591
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7592
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7593
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7594
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7595
instruct orL_Reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7596
  match(Set dst (OrL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7597
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7598
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7599
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7600
  format %{ "OG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7601
  opcode(OG_ZOPC, OG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7602
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7603
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7604
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7605
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7606
// Immediate Or long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7607
instruct orL_reg_uimm16(iRegL dst, uimmL16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7608
  match(Set dst (OrL dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7609
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7610
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7611
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7612
  format %{ "OILL    $dst,$con\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7613
  opcode(OILL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7614
  ins_encode(z_riform_unsigned(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7615
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7616
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7617
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7618
instruct orL_reg_uimm32(iRegI dst, uimmL32 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7619
  match(Set dst (OrI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7620
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7621
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7622
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7623
  format %{ "OILF    $dst,$con\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7624
  opcode(OILF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7625
  ins_encode(z_rilform_unsigned(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7626
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7627
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7628
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7629
// XOR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7630
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7631
// Register Xor
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7632
instruct xorI_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7633
  match(Set dst (XorI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7634
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7635
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7636
  format %{ "XR      $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7637
  opcode(XR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7638
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7639
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7640
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7641
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7642
instruct xorI_Reg_mem(iRegI dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7643
  match(Set dst (XorI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7644
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7645
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7646
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7647
  format %{ "X(Y)    $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7648
  opcode(XY_ZOPC, X_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7649
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7650
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7651
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7652
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7653
// Immediate Xor
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7654
instruct xorI_reg_uimm32(iRegI dst, uimmI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7655
  match(Set dst (XorI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7656
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7657
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7658
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7659
  format %{ "XILF    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7660
  opcode(XILF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7661
  ins_encode(z_rilform_unsigned(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7662
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7663
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7664
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7665
// Register Xor Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7666
instruct xorL_reg_reg(iRegL dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7667
  match(Set dst (XorL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7668
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7669
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7670
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7671
  format %{ "XGR     $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7672
  opcode(XGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7673
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7674
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7675
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7676
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7677
instruct xorL_Reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7678
  match(Set dst (XorL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7679
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7680
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7681
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7682
  format %{ "XG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7683
  opcode(XG_ZOPC, XG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7684
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7685
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7686
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7687
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7688
// Immediate Xor Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7689
instruct xorL_reg_uimm32(iRegL dst, uimmL32 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7690
  match(Set dst (XorL dst con));
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_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7693
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7694
  format %{ "XILF    $dst,$con\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7695
  opcode(XILF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7696
  ins_encode(z_rilform_unsigned(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7697
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7698
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7699
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7700
//----------Convert to Boolean-------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7701
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7702
// Convert integer to boolean.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7703
instruct convI2B(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7704
  match(Set dst (Conv2B 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
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7707
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7708
  format %{ "convI2B $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7709
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7710
    __ z_lnr($dst$$Register, $src$$Register);  // Rdst := -|Rsrc|, i.e. Rdst == 0 <=> Rsrc == 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7711
    __ z_srl($dst$$Register, 31);              // Rdst := sign(Rdest)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7712
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7713
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7714
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7715
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7716
instruct convP2B(iRegI dst, iRegP_N2P src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7717
  match(Set dst (Conv2B src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7718
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7719
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7720
  size(10);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7721
  format %{ "convP2B $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7722
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7723
    __ z_lngr($dst$$Register, $src$$Register);     // Rdst := -|Rsrc| i.e. Rdst == 0 <=> Rsrc == 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7724
    __ z_srlg($dst$$Register, $dst$$Register, 63); // Rdst := sign(Rdest)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7725
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7726
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7727
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7728
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7729
instruct cmpLTMask_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7730
  match(Set dst (CmpLTMask dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7731
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7732
  ins_cost(2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7733
  size(18);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7734
  format %{ "Set $dst CmpLTMask $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7735
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7736
    // Avoid signed 32 bit overflow: Do sign extend and sub 64 bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7737
    __ z_lgfr(Z_R0_scratch, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7738
    __ z_lgfr($dst$$Register, $dst$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7739
    __ z_sgr($dst$$Register, Z_R0_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7740
    __ z_srag($dst$$Register, $dst$$Register, 63);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7741
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7742
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7743
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7744
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7745
instruct cmpLTMask_reg_zero(iRegI dst, immI_0 zero, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7746
  match(Set dst (CmpLTMask dst zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7747
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7748
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7749
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7750
  format %{ "Set $dst CmpLTMask $dst,$zero" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7751
  ins_encode %{ __ z_sra($dst$$Register, 31); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7752
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7753
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7754
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7755
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7756
//----------Arithmetic Conversion Instructions---------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7757
// The conversions operations are all Alpha sorted. Please keep it that way!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7758
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7759
instruct convD2F_reg(regF dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7760
  match(Set dst (ConvD2F src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7761
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7762
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7763
  format %{ "LEDBR   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7764
  opcode(LEDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7765
  ins_encode(z_rreform(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
instruct convF2I_reg(iRegI dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7770
  match(Set dst (ConvF2I src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7771
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7772
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7773
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7774
  format %{ "convF2I  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7775
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7776
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7777
    __ clear_reg($dst$$Register, false, false);  // Initialize with result for unordered: 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7778
    __ z_cebr($src$$FloatRegister, $src$$FloatRegister);   // Round.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7779
    __ z_brno(done);                             // Result is zero if unordered argument.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7780
    __ z_cfebr($dst$$Register, $src$$FloatRegister, Assembler::to_zero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7781
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7782
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7783
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7784
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7785
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7786
instruct convD2I_reg(iRegI dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7787
  match(Set dst (ConvD2I src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7788
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7789
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7790
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7791
  format %{ "convD2I  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7792
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7793
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7794
    __ clear_reg($dst$$Register, false, false);  // Initialize with result for unordered: 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7795
    __ z_cdbr($src$$FloatRegister, $src$$FloatRegister);   // Round.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7796
    __ z_brno(done);                             // Result is zero if unordered argument.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7797
    __ z_cfdbr($dst$$Register, $src$$FloatRegister, Assembler::to_zero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7798
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7799
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7800
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7801
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7802
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7803
instruct convF2L_reg(iRegL dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7804
  match(Set dst (ConvF2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7805
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7806
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7807
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7808
  format %{ "convF2L  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7809
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7810
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7811
    __ clear_reg($dst$$Register, true, false);  // Initialize with result for unordered: 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7812
    __ z_cebr($src$$FloatRegister, $src$$FloatRegister);   // Round.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7813
    __ z_brno(done);                             // Result is zero if unordered argument.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7814
    __ z_cgebr($dst$$Register, $src$$FloatRegister, Assembler::to_zero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7815
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7816
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7817
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7818
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7819
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7820
instruct convD2L_reg(iRegL dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7821
  match(Set dst (ConvD2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7822
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7823
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7824
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7825
  format %{ "convD2L  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7826
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7827
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7828
    __ clear_reg($dst$$Register, true, false);  // Initialize with result for unordered: 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7829
    __ z_cdbr($src$$FloatRegister, $src$$FloatRegister);   // Round.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7830
    __ z_brno(done);                             // Result is zero if unordered argument.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7831
    __ z_cgdbr($dst$$Register, $src$$FloatRegister, Assembler::to_zero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7832
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7833
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7834
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7835
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7836
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7837
instruct convF2D_reg(regD dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7838
  match(Set dst (ConvF2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7839
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7840
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7841
  format %{ "LDEBR   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7842
  opcode(LDEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7843
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7844
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7845
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7846
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7847
instruct convF2D_mem(regD dst, memoryRX src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7848
  match(Set dst (ConvF2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7849
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7850
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7851
  format %{ "LDEB    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7852
  opcode(LDEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7853
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7854
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7855
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7856
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7857
instruct convI2D_reg(regD dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7858
  match(Set dst (ConvI2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7859
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7860
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7861
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7862
  format %{ "CDFBR   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7863
  opcode(CDFBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7864
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7865
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7866
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7867
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7868
// Optimization that saves up to two memory operations for each conversion.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7869
instruct convI2F_ireg(regF dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7870
  match(Set dst (ConvI2F src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7871
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7872
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7873
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7874
  format %{ "CEFBR   $dst,$src\t # convert int to float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7875
  opcode(CEFBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7876
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7877
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7878
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7879
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7880
instruct convI2L_reg(iRegL dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7881
  match(Set dst (ConvI2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7882
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7883
  format %{ "LGFR    $dst,$src\t # int->long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7884
  opcode(LGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7885
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7886
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7887
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7888
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7889
// Zero-extend convert int to long.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7890
instruct convI2L_reg_zex(iRegL dst, iRegI src, immL_32bits mask) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7891
  match(Set dst (AndL (ConvI2L src) mask));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7892
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7893
  format %{ "LLGFR   $dst, $src \t # zero-extend int to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7894
  ins_encode %{ __ z_llgfr($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7895
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7896
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7897
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7898
// Zero-extend convert int to long.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7899
instruct convI2L_mem_zex(iRegL dst, memory src, immL_32bits mask) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7900
  match(Set dst (AndL (ConvI2L (LoadI src)) mask));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7901
  // Uses load_const_optmized, so size can vary.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7902
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7903
  format %{ "LLGF    $dst, $src \t # zero-extend int to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7904
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7905
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7906
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7907
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7908
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7909
// Zero-extend long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7910
instruct zeroExtend_long(iRegL dst, iRegL src, immL_32bits mask) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7911
  match(Set dst (AndL src mask));
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 %{ "LLGFR   $dst, $src \t # zero-extend long to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7914
  ins_encode %{ __ z_llgfr($dst$$Register, $src$$Register); %}
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
instruct rShiftI16_lShiftI16_reg(iRegI dst, iRegI src, immI_16 amount) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7919
  match(Set dst (RShiftI (LShiftI src amount) amount));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7920
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7921
  format %{ "LHR     $dst,$src\t short->int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7922
  opcode(LHR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7923
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7924
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7925
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7926
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7927
instruct rShiftI24_lShiftI24_reg(iRegI dst, iRegI src, immI_24 amount) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7928
  match(Set dst (RShiftI (LShiftI src amount) amount));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7929
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7930
  format %{ "LBR     $dst,$src\t byte->int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7931
  opcode(LBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7932
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7933
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7934
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7935
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7936
instruct MoveF2I_stack_reg(iRegI dst, stackSlotF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7937
  match(Set dst (MoveF2I src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7938
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7939
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7940
  format %{ "L       $dst,$src\t # MoveF2I" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7941
  opcode(L_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7942
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7943
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7944
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7945
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7946
// javax.imageio.stream.ImageInputStreamImpl.toFloats([B[FII)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7947
instruct MoveI2F_stack_reg(regF dst, stackSlotI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7948
  match(Set dst (MoveI2F src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7949
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7950
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7951
  format %{ "LE      $dst,$src\t # MoveI2F" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7952
  opcode(LE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7953
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7954
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7955
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7956
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7957
instruct MoveD2L_stack_reg(iRegL dst, stackSlotD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7958
  match(Set dst (MoveD2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7959
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7960
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7961
  format %{ "LG      $src,$dst\t # MoveD2L" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7962
  opcode(LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7963
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7964
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7965
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7966
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7967
instruct MoveL2D_stack_reg(regD dst, stackSlotL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7968
  match(Set dst (MoveL2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7969
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7970
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7971
  format %{ "LD      $dst,$src\t # MoveL2D" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7972
  opcode(LD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7973
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7974
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7975
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7976
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7977
instruct MoveI2F_reg_stack(stackSlotF dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7978
  match(Set dst (MoveI2F src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7979
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7980
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7981
  format %{ "ST      $src,$dst\t # MoveI2F" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7982
  opcode(ST_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7983
  ins_encode(z_form_rt_mem(src, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7984
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7985
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7986
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7987
instruct MoveD2L_reg_stack(stackSlotL dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7988
  match(Set dst (MoveD2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7989
  effect(DEF dst, USE src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7990
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7991
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7992
  format %{ "STD     $src,$dst\t # MoveD2L" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7993
  opcode(STD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7994
  ins_encode(z_form_rt_mem(src,dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7995
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7996
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7997
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7998
instruct MoveL2D_reg_stack(stackSlotD dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7999
  match(Set dst (MoveL2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8000
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8001
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8002
  format %{ "STG     $src,$dst\t # MoveL2D" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8003
  opcode(STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8004
  ins_encode(z_form_rt_mem(src,dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8005
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8006
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8007
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8008
instruct convL2F_reg(regF dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8009
  match(Set dst (ConvL2F src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8010
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8011
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8012
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8013
  format %{ "CEGBR   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8014
  opcode(CEGBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8015
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8016
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8017
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8018
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8019
instruct convL2D_reg(regD dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8020
  match(Set dst (ConvL2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8021
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8022
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8023
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8024
  format %{ "CDGBR   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8025
  opcode(CDGBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8026
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8027
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8028
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8029
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8030
instruct convL2I_reg(iRegI dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8031
  match(Set dst (ConvL2I src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8032
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8033
  format %{ "LR      $dst,$src\t # long->int (if needed)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8034
  ins_encode %{ __ lr_if_needed($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8035
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8036
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8037
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8038
// Register Shift Right Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8039
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
  8040
  match(Set dst (ConvL2I (RShiftL src cnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8041
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8042
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8043
  format %{ "SRAG    $dst,$src,$cnt" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8044
  opcode(SRAG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8045
  ins_encode(z_rsyform_const(dst, src, cnt));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8046
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8047
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8048
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8049
//----------TRAP based zero checks and range checks----------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8050
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8051
// SIGTRAP based implicit range checks in compiled code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8052
// A range check in the ideal world has one of the following shapes:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8053
//   - (If le (CmpU length index)), (IfTrue  throw exception)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8054
//   - (If lt (CmpU index length)), (IfFalse throw exception)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8055
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8056
// Match range check 'If le (CmpU length index)'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8057
instruct rangeCheck_iReg_uimmI16(cmpOpT cmp, iRegI length, uimmI16 index, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8058
  match(If cmp (CmpU length index));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8059
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8060
  predicate(TrapBasedRangeChecks &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8061
            _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8062
            PROB_UNLIKELY(_leaf->as_If ()->_prob) >= PROB_ALWAYS &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8063
            Matcher::branches_to_uncommon_trap(_leaf));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8064
  ins_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8065
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8066
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8067
  ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8068
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8069
  format %{ "RangeCheck len=$length cmp=$cmp idx=$index => trap $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8070
  ins_encode %{ __ z_clfit($length$$Register, $index$$constant, $cmp$$cmpcode); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8071
  ins_pipe(pipe_class_trap);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8072
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8073
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8074
// Match range check 'If lt (CmpU index length)'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8075
instruct rangeCheck_iReg_iReg(cmpOpT cmp, iRegI index, iRegI length, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8076
  match(If cmp (CmpU index length));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8077
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8078
  predicate(TrapBasedRangeChecks &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8079
            _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8080
            _leaf->as_If ()->_prob >= PROB_ALWAYS &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8081
            Matcher::branches_to_uncommon_trap(_leaf));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8082
  ins_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8083
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8084
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8085
  ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8086
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8087
  format %{ "RangeCheck idx=$index cmp=$cmp len=$length => trap $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8088
  ins_encode %{ __ z_clrt($index$$Register, $length$$Register, $cmp$$cmpcode); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8089
  ins_pipe(pipe_class_trap);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8090
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8091
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8092
// Match range check 'If lt (CmpU index length)'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8093
instruct rangeCheck_uimmI16_iReg(cmpOpT cmp, iRegI index, uimmI16 length, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8094
  match(If cmp (CmpU index length));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8095
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8096
  predicate(TrapBasedRangeChecks &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8097
            _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8098
            _leaf->as_If ()->_prob >= PROB_ALWAYS &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8099
            Matcher::branches_to_uncommon_trap(_leaf));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8100
  ins_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8101
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8102
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8103
  ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8104
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8105
  format %{ "RangeCheck idx=$index cmp=$cmp len= $length => trap $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8106
  ins_encode %{ __ z_clfit($index$$Register, $length$$constant, $cmp$$cmpcode); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8107
  ins_pipe(pipe_class_trap);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8108
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8109
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8110
// Implicit zero checks (more implicit null checks).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8111
instruct zeroCheckP_iReg_imm0(cmpOpT cmp, iRegP_N2P value, immP0 zero, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8112
  match(If cmp (CmpP value zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8113
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8114
  predicate(TrapBasedNullChecks &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8115
            _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8116
            _leaf->as_If ()->_prob >= PROB_LIKELY_MAG(4) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8117
            Matcher::branches_to_uncommon_trap(_leaf));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8118
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8119
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8120
  ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8121
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8122
  format %{ "ZeroCheckP value=$value cmp=$cmp zero=$zero => trap $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8123
  ins_encode %{ __ z_cgit($value$$Register, 0, $cmp$$cmpcode); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8124
  ins_pipe(pipe_class_trap);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8125
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8126
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8127
// Implicit zero checks (more implicit null checks).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8128
instruct zeroCheckN_iReg_imm0(cmpOpT cmp, iRegN_P2N value, immN0 zero, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8129
  match(If cmp (CmpN value zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8130
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8131
  predicate(TrapBasedNullChecks &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8132
            _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8133
            _leaf->as_If ()->_prob >= PROB_LIKELY_MAG(4) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8134
            Matcher::branches_to_uncommon_trap(_leaf));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8135
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8136
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8137
  ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8138
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8139
  format %{ "ZeroCheckN value=$value cmp=$cmp zero=$zero => trap $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8140
  ins_encode %{ __ z_cit($value$$Register, 0, $cmp$$cmpcode); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8141
  ins_pipe(pipe_class_trap);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8142
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8143
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8144
//----------Compare instructions-----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8145
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8146
// INT signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8147
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8148
// Compare Integers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8149
instruct compI_reg_reg(flagsReg cr, iRegI op1, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8150
  match(Set cr (CmpI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8151
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8152
  format %{ "CR      $op1,$op2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8153
  opcode(CR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8154
  ins_encode(z_rrform(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8155
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8156
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8157
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8158
instruct compI_reg_imm(flagsReg cr, iRegI op1, immI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8159
  match(Set cr (CmpI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8160
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8161
  format %{ "CFI     $op1,$op2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8162
  opcode(CFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8163
  ins_encode(z_rilform_signed(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8164
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8165
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8166
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8167
instruct compI_reg_imm16(flagsReg cr, iRegI op1, immI16 op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8168
  match(Set cr (CmpI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8169
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8170
  format %{ "CHI     $op1,$op2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8171
  opcode(CHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8172
  ins_encode(z_riform_signed(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8173
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8174
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8175
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8176
instruct compI_reg_imm0(flagsReg cr, iRegI op1, immI_0 zero) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8177
  match(Set cr (CmpI op1 zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8178
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8179
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8180
  format %{ "LTR     $op1,$op1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8181
  opcode(LTR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8182
  ins_encode(z_rrform(op1, op1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8183
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8184
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8185
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8186
instruct compI_reg_mem(flagsReg cr, iRegI op1, memory op2)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8187
  match(Set cr (CmpI op1 (LoadI op2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8188
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8189
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8190
  format %{ "C(Y)    $op1, $op2\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8191
  opcode(CY_ZOPC, C_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8192
  ins_encode(z_form_rt_mem_opt(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8193
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8194
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8195
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8196
// INT unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8197
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8198
instruct compU_reg_reg(flagsReg cr, iRegI op1, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8199
  match(Set cr (CmpU op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8200
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8201
  format %{ "CLR     $op1,$op2\t # unsigned" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8202
  opcode(CLR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8203
  ins_encode(z_rrform(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8204
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8205
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8206
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8207
instruct compU_reg_uimm(flagsReg cr, iRegI op1, uimmI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8208
  match(Set cr (CmpU op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8209
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8210
  format %{ "CLFI    $op1,$op2\t # unsigned" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8211
  opcode(CLFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8212
  ins_encode(z_rilform_unsigned(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8213
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8214
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8215
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8216
instruct compU_reg_imm0(flagsReg cr, iRegI op1, immI_0 zero) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8217
  match(Set cr (CmpU op1 zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8218
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8219
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8220
  format %{ "LTR     $op1,$op1\t # unsigned" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8221
  opcode(LTR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8222
  ins_encode(z_rrform(op1, op1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8223
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8224
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8225
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8226
instruct compU_reg_mem(flagsReg cr, iRegI op1, memory op2)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8227
  match(Set cr (CmpU op1 (LoadI op2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8228
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8229
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8230
  format %{ "CL(Y)   $op1, $op2\t # unsigned" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8231
  opcode(CLY_ZOPC, CL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8232
  ins_encode(z_form_rt_mem_opt(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8233
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8234
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8235
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8236
// LONG signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8237
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8238
instruct compL_reg_reg(flagsReg cr, iRegL op1, iRegL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8239
  match(Set cr (CmpL op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8240
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8241
  format %{ "CGR     $op1,$op2\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8242
  opcode(CGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8243
  ins_encode(z_rreform(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8244
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8245
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8246
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8247
instruct compL_reg_regI(flagsReg cr, iRegL op1, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8248
  match(Set cr (CmpL op1 (ConvI2L op2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8249
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8250
  format %{ "CGFR    $op1,$op2\t # long/int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8251
  opcode(CGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8252
  ins_encode(z_rreform(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8253
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8254
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8255
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8256
instruct compL_reg_imm32(flagsReg cr, iRegL op1, immL32 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8257
  match(Set cr (CmpL op1 con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8258
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8259
  format %{ "CGFI    $op1,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8260
  opcode(CGFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8261
  ins_encode(z_rilform_signed(op1, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8262
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8263
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8264
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8265
instruct compL_reg_imm16(flagsReg cr, iRegL op1, immL16 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8266
  match(Set cr (CmpL op1 con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8267
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8268
  format %{ "CGHI    $op1,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8269
  opcode(CGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8270
  ins_encode(z_riform_signed(op1, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8271
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8272
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8273
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8274
instruct compL_reg_imm0(flagsReg cr, iRegL op1, immL_0 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8275
  match(Set cr (CmpL op1 con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8276
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8277
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8278
  format %{ "LTGR    $op1,$op1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8279
  opcode(LTGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8280
  ins_encode(z_rreform(op1, op1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8281
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8282
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8283
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8284
instruct compL_conv_reg_imm0(flagsReg cr, iRegI op1, immL_0 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8285
  match(Set cr (CmpL (ConvI2L op1) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8286
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8287
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8288
  format %{ "LTGFR    $op1,$op1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8289
  opcode(LTGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8290
  ins_encode(z_rreform(op1, op1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8291
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8292
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8293
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8294
instruct compL_reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8295
  match(Set cr (CmpL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8296
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8297
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8298
  format %{ "CG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8299
  opcode(CG_ZOPC, CG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8300
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8301
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8302
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8303
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8304
instruct compL_reg_memI(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8305
  match(Set cr (CmpL dst (ConvI2L (LoadI src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8306
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8307
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8308
  format %{ "CGF     $dst, $src\t # long/int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8309
  opcode(CGF_ZOPC, CGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8310
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8311
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8312
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8313
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8314
//  LONG unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8315
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8316
//  PTR unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8317
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8318
instruct compP_reg_reg(flagsReg cr, iRegP_N2P op1, iRegP_N2P op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8319
  match(Set cr (CmpP op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8320
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8321
  format %{ "CLGR    $op1,$op2\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8322
  opcode(CLGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8323
  ins_encode(z_rreform(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8324
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8325
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8326
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8327
instruct compP_reg_imm0(flagsReg cr, iRegP_N2P op1, immP0 op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8328
  match(Set cr (CmpP op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8329
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8330
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8331
  format %{ "LTGR    $op1, $op1\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8332
  opcode(LTGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8333
  ins_encode(z_rreform(op1, op1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8334
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8335
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8336
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8337
// Don't use LTGFR which performs sign extend.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8338
instruct compP_decode_reg_imm0(flagsReg cr, iRegN op1, immP0 op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8339
  match(Set cr (CmpP (DecodeN op1) op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8340
  predicate(Universe::narrow_oop_base() == NULL && Universe::narrow_oop_shift() == 0);
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\t # ptr" %}
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 compP_reg_mem(iRegP dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8350
  match(Set cr (CmpP dst (LoadP src)));
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
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8353
  format %{ "CLG     $dst, $src\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8354
  opcode(CLG_ZOPC, CLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8355
  ins_encode(z_form_rt_mem_opt(dst, src));
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
//----------Max and Min--------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8360
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8361
// Max Register with Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8362
instruct z196_minI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8363
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8364
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8365
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8366
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8367
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8368
  format %{ "MinI $dst $src1,$src2\t MinI (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8369
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8370
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8371
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8372
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8373
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8374
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8375
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8376
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8377
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8378
    } else if (Rdst == Rsrc1) {   // Rdst preset with src1.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8379
      __ z_cr(Rsrc1, Rsrc2);      // Move src2 only if src1 is NotLow.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8380
      __ z_locr(Rdst, Rsrc2, Assembler::bcondNotLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8381
    } else if (Rdst == Rsrc2) {   // Rdst preset with src2.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8382
      __ z_cr(Rsrc2, Rsrc1);      // Move src1 only if src2 is NotLow.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8383
      __ z_locr(Rdst, Rsrc1, Assembler::bcondNotLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8384
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8385
      // Rdst is disjoint from operands, move in either case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8386
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8387
      __ z_locr(Rdst, Rsrc2, Assembler::bcondNotLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8388
      __ z_locr(Rdst, Rsrc1, Assembler::bcondLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8389
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8390
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8391
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8392
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8393
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8394
// Min Register with Register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8395
instruct z10_minI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8396
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8397
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8398
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8399
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8400
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8401
  format %{ "MinI $dst $src1,$src2\t MinI (z10 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8402
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8403
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8404
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8405
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8406
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8407
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8408
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8409
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8410
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8411
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8412
    } else if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8413
      __ z_crj(Rsrc1, Rsrc2, Assembler::bcondLow, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8414
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8415
    } else if (Rdst == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8416
      __ z_crj(Rsrc2, Rsrc1, Assembler::bcondLow, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8417
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8418
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8419
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8420
      __ z_crj(Rsrc1, Rsrc2, Assembler::bcondLow, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8421
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8422
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8423
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8424
  %}
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 minI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8429
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8430
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8431
  predicate(!VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8432
  ins_cost(3 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8433
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8434
  format %{ "MinI $dst $src1,$src2\t MinI" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8435
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8436
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8437
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8438
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8439
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8440
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8441
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8442
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8443
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8444
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8445
    } else if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8446
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8447
      __ z_brl(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8448
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8449
    } else if (Rdst == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8450
      __ z_cr(Rsrc2, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8451
      __ z_brl(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8452
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8453
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8454
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8455
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8456
      __ z_brl(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8457
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8458
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8459
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8460
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8461
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8462
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8463
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8464
instruct z196_minI_reg_imm32(iRegI dst, iRegI src1, immI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8465
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8466
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8467
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8468
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8469
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8470
  format %{ "MinI $dst $src1,$src2\t MinI const32 (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8471
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8472
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8473
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8474
    int      Isrc2 = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8475
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8476
    if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8477
      __ load_const_optimized(Z_R0_scratch, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8478
      __ z_cfi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8479
      __ z_locr(Rdst, Z_R0_scratch, Assembler::bcondNotLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8480
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8481
      __ load_const_optimized(Rdst, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8482
      __ z_cfi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8483
      __ z_locr(Rdst, Rsrc1, Assembler::bcondLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8484
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8485
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8486
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8487
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8488
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8489
instruct minI_reg_imm32(iRegI dst, iRegI src1, immI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8490
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8491
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8492
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8493
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8494
  format %{ "MinI $dst $src1,$src2\t MinI const32" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8495
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8496
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8497
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8498
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8499
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8500
    __ z_cfi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8501
    __ z_brl(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8502
    __ z_lgfi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8503
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8504
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8505
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8506
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8507
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8508
instruct z196_minI_reg_imm16(iRegI dst, iRegI src1, immI16 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8509
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8510
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8511
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8512
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8513
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8514
  format %{ "MinI $dst $src1,$src2\t MinI const16 (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8515
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8516
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8517
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8518
    int      Isrc2 = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8519
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8520
    if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8521
      __ load_const_optimized(Z_R0_scratch, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8522
      __ z_chi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8523
      __ z_locr(Rdst, Z_R0_scratch, Assembler::bcondNotLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8524
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8525
      __ load_const_optimized(Rdst, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8526
      __ z_chi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8527
      __ z_locr(Rdst, Rsrc1, Assembler::bcondLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8528
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8529
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8530
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8531
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8532
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8533
instruct minI_reg_imm16(iRegI dst, iRegI src1, immI16 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8534
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8535
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8536
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8537
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8538
  format %{ "MinI $dst $src1,$src2\t MinI const16" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8539
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8540
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8541
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8542
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8543
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8544
    __ z_chi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8545
    __ z_brl(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8546
    __ z_lghi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8547
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8548
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8549
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8550
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8551
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8552
instruct z10_minI_reg_imm8(iRegI dst, iRegI src1, immI8 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8553
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8554
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8555
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8556
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8557
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8558
  format %{ "MinI $dst $src1,$src2\t MinI const8 (z10 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8559
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8560
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8561
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8562
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8563
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8564
    __ z_cij($src1$$Register, $src2$$constant, Assembler::bcondLow, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8565
    __ z_lghi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8566
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8567
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8568
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8569
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8570
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8571
// Max Register with Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8572
instruct z196_maxI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8573
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8574
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8575
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8576
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8577
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8578
  format %{ "MaxI $dst $src1,$src2\t MaxI (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8579
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8580
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8581
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8582
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8583
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8584
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8585
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8586
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8587
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8588
    } else if (Rdst == Rsrc1) { // Rdst preset with src1.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8589
      __ z_cr(Rsrc1, Rsrc2);    // Move src2 only if src1 is NotHigh.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8590
      __ z_locr(Rdst, Rsrc2, Assembler::bcondNotHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8591
    } else if (Rdst == Rsrc2) { // Rdst preset with src2.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8592
      __ z_cr(Rsrc2, Rsrc1);    // Move src1 only if src2 is NotHigh.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8593
      __ z_locr(Rdst, Rsrc1, Assembler::bcondNotHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8594
    } else {                    // Rdst is disjoint from operands, move in either case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8595
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8596
      __ z_locr(Rdst, Rsrc2, Assembler::bcondNotHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8597
      __ z_locr(Rdst, Rsrc1, Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8598
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8599
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8600
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8601
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8602
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8603
// Max Register with Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8604
instruct z10_maxI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8605
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8606
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8607
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8608
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8609
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8610
  format %{ "MaxI $dst $src1,$src2\t MaxI (z10 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8611
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8612
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8613
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8614
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8615
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8616
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8617
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8618
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8619
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8620
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8621
    } else if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8622
      __ z_crj(Rsrc1, Rsrc2, Assembler::bcondHigh, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8623
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8624
    } else if (Rdst == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8625
      __ z_crj(Rsrc2, Rsrc1, Assembler::bcondHigh, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8626
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8627
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8628
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8629
      __ z_crj(Rsrc1, Rsrc2, Assembler::bcondHigh, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8630
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8631
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8632
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8633
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8634
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8635
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8636
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8637
instruct maxI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8638
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8639
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8640
  predicate(!VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8641
  ins_cost(3 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8642
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8643
  format %{ "MaxI $dst $src1,$src2\t MaxI" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8644
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8645
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8646
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8647
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8648
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8649
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8650
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8651
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8652
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8653
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8654
    } else if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8655
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8656
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8657
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8658
    } else if (Rdst == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8659
      __ z_cr(Rsrc2, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8660
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8661
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8662
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8663
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8664
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8665
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8666
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8667
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8668
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8669
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8670
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8671
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8672
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8673
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8674
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8675
instruct z196_maxI_reg_imm32(iRegI dst, iRegI src1, immI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8676
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8677
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8678
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8679
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8680
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8681
  format %{ "MaxI $dst $src1,$src2\t MaxI const32 (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8682
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8683
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8684
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8685
    int      Isrc2 = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8686
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8687
    if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8688
      __ load_const_optimized(Z_R0_scratch, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8689
      __ z_cfi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8690
      __ z_locr(Rdst, Z_R0_scratch, Assembler::bcondNotHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8691
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8692
      __ load_const_optimized(Rdst, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8693
      __ z_cfi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8694
      __ z_locr(Rdst, Rsrc1, Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8695
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8696
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8697
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8698
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8699
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8700
instruct maxI_reg_imm32(iRegI dst, iRegI src1, immI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8701
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8702
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8703
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8704
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8705
  format %{ "MaxI $dst $src1,$src2\t MaxI const32" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8706
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8707
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8708
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8709
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8710
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8711
    __ z_cfi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8712
    __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8713
    __ z_lgfi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8714
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8715
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8716
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8717
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8718
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8719
instruct z196_maxI_reg_imm16(iRegI dst, iRegI src1, immI16 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8720
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8721
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8722
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8723
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8724
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8725
  format %{ "MaxI $dst $src1,$src2\t MaxI const16 (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8726
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8727
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8728
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8729
    int      Isrc2 = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8730
    if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8731
      __ load_const_optimized(Z_R0_scratch, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8732
      __ z_chi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8733
      __ z_locr(Rdst, Z_R0_scratch, Assembler::bcondNotHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8734
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8735
      __ load_const_optimized(Rdst, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8736
      __ z_chi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8737
      __ z_locr(Rdst, Rsrc1, Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8738
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8739
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8740
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8741
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8742
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8743
instruct maxI_reg_imm16(iRegI dst, iRegI src1, immI16 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8744
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8745
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8746
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8747
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8748
  format %{ "MaxI $dst $src1,$src2\t MaxI const16" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8749
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8750
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8751
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8752
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8753
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8754
    __ z_chi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8755
    __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8756
    __ z_lghi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8757
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8758
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8759
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8760
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8761
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8762
instruct z10_maxI_reg_imm8(iRegI dst, iRegI src1, immI8 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8763
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8764
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8765
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8766
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8767
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8768
  format %{ "MaxI $dst $src1,$src2\t MaxI const8" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8769
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8770
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8771
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8772
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8773
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8774
    __ z_cij($src1$$Register, $src2$$constant, Assembler::bcondHigh, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8775
    __ z_lghi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8776
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8777
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8778
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8779
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8780
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8781
//----------Abs---------------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8782
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8783
instruct absI_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8784
  match(Set dst (AbsI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8785
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8786
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8787
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8788
  format %{ "LPR     $dst, $src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8789
  opcode(LPR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8790
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8791
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8792
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8793
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8794
instruct negabsI_reg(iRegI dst, iRegI src, immI_0 zero, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8795
  match(Set dst (SubI zero (AbsI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8796
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8797
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8798
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8799
  format %{ "LNR     $dst, $src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8800
  opcode(LNR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8801
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8802
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8803
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8804
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8805
//----------Float Compares----------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8806
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8807
// Compare floating, generate condition code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8808
instruct cmpF_cc(flagsReg cr, regF src1, regF src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8809
  match(Set cr (CmpF src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8810
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8811
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8812
  format %{ "FCMPcc   $src1,$src2\t # float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8813
  ins_encode %{ __ z_cebr($src1$$FloatRegister, $src2$$FloatRegister); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8814
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8815
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8816
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8817
instruct cmpD_cc(flagsReg cr, regD src1, regD src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8818
  match(Set cr (CmpD src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8819
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8820
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8821
  format %{ "FCMPcc   $src1,$src2 \t # double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8822
  ins_encode %{ __ z_cdbr($src1$$FloatRegister, $src2$$FloatRegister); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8823
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8824
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8825
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8826
instruct cmpF_cc_mem(flagsReg cr, regF src1, memoryRX src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8827
  match(Set cr (CmpF src1 (LoadF src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8828
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8829
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8830
  format %{ "FCMPcc_mem $src1,$src2\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8831
  opcode(CEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8832
  ins_encode(z_form_rt_memFP(src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8833
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8834
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8835
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8836
instruct cmpD_cc_mem(flagsReg cr, regD src1, memoryRX src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8837
  match(Set cr (CmpD src1 (LoadD src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8838
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8839
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8840
  format %{ "DCMPcc_mem $src1,$src2\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8841
  opcode(CDB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8842
  ins_encode(z_form_rt_memFP(src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8843
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8844
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8845
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8846
// Compare floating, generate condition code
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8847
instruct cmpF0_cc(flagsReg cr, regF src1, immFpm0 src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8848
  match(Set cr (CmpF src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8849
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8850
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8851
  format %{ "LTEBR    $src1,$src1\t # float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8852
  opcode(LTEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8853
  ins_encode(z_rreform(src1, src1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8854
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8855
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8856
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8857
instruct cmpD0_cc(flagsReg cr, regD src1, immDpm0 src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8858
  match(Set cr (CmpD src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8859
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8860
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8861
  format %{ "LTDBR    $src1,$src1 \t # double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8862
  opcode(LTDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8863
  ins_encode(z_rreform(src1, src1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8864
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8865
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8866
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8867
// Compare floating, generate -1,0,1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8868
instruct cmpF_reg(iRegI dst, regF src1, regF src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8869
  match(Set dst (CmpF3 src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8870
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8871
  ins_cost(DEFAULT_COST * 5 + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8872
  size(24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8873
  format %{ "CmpF3    $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8874
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8875
    // compare registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8876
    __ z_cebr($src1$$FloatRegister, $src2$$FloatRegister);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8877
    // Convert condition code into -1,0,1, where
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8878
    // -1 means unordered or less
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8879
    //  0 means equal
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8880
    //  1 means greater.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8881
    if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8882
      Register one       = Z_R0_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8883
      Register minus_one = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8884
      __ z_lghi(minus_one, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8885
      __ z_lghi(one, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8886
      __ z_lghi( $dst$$Register, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8887
      __ z_locgr($dst$$Register, one,       Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8888
      __ z_locgr($dst$$Register, minus_one, Assembler::bcondLowOrNotOrdered);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8889
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8890
      Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8891
      __ clear_reg($dst$$Register, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8892
      __ z_bre(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8893
      __ z_lhi($dst$$Register, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8894
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8895
      __ z_lhi($dst$$Register, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8896
      __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8897
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8898
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8899
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8900
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8901
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8902
instruct cmpD_reg(iRegI dst, regD src1, regD src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8903
  match(Set dst (CmpD3 src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8904
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8905
  ins_cost(DEFAULT_COST * 5 + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8906
  size(24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8907
  format %{ "CmpD3    $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8908
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8909
    // compare registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8910
    __ z_cdbr($src1$$FloatRegister, $src2$$FloatRegister);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8911
    // Convert condition code into -1,0,1, where
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8912
    // -1 means unordered or less
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8913
    //  0 means equal
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8914
    //  1 means greater.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8915
    if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8916
      Register one       = Z_R0_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8917
      Register minus_one = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8918
      __ z_lghi(minus_one, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8919
      __ z_lghi(one, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8920
      __ z_lghi( $dst$$Register, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8921
      __ z_locgr($dst$$Register, one,       Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8922
      __ z_locgr($dst$$Register, minus_one, Assembler::bcondLowOrNotOrdered);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8923
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8924
      Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8925
      // indicate unused result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8926
      (void) __ clear_reg($dst$$Register, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8927
      __ z_bre(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8928
      __ z_lhi($dst$$Register, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8929
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8930
      __ z_lhi($dst$$Register, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8931
      __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8932
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8933
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8934
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8935
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8936
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8937
//----------Branches---------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8938
// Jump
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8939
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8940
// Direct Branch.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8941
instruct branch(label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8942
  match(Goto);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8943
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8944
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8945
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8946
  format %{ "BRU     $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8947
  ins_encode(z_enc_bru(labl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8948
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8949
  // If set to 1 this indicates that the current instruction is a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8950
  // short variant of a long branch. This avoids using this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8951
  // instruction in first-pass matching. It will then only be used in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8952
  // the `Shorten_branches' pass.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8953
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8954
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8955
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8956
// Direct Branch.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8957
instruct branchFar(label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8958
  match(Goto);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8959
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8960
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8961
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8962
  format %{ "BRUL   $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8963
  ins_encode(z_enc_brul(labl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8964
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8965
  // This is not a short variant of a branch, but the long variant.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8966
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8967
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8968
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8969
// Conditional Near Branch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8970
instruct branchCon(cmpOp cmp, flagsReg cr, label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8971
  // Same match rule as `branchConFar'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8972
  match(If cmp cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8973
  effect(USE lbl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8974
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8975
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8976
  format %{ "branch_con_short,$cmp   $cr, $lbl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8977
  ins_encode(z_enc_branch_con_short(cmp, lbl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8978
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8979
  // If set to 1 this indicates that the current instruction is a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8980
  // short variant of a long branch. This avoids using this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8981
  // instruction in first-pass matching. It will then only be used in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8982
  // the `Shorten_branches' pass.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8983
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8984
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8985
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8986
// This is for cases when the z/Architecture conditional branch instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8987
// does not reach far enough. So we emit a far branch here, which is
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8988
// more expensive.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8989
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8990
// Conditional Far Branch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8991
instruct branchConFar(cmpOp cmp, flagsReg cr, label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8992
  // Same match rule as `branchCon'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8993
  match(If cmp cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8994
  effect(USE cr, USE lbl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8995
  // Make more expensive to prefer compare_and_branch over separate instructions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8996
  ins_cost(2 * BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8997
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8998
  format %{ "branch_con_far,$cmp   $cr, $lbl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8999
  ins_encode(z_enc_branch_con_far(cmp, lbl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9000
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9001
  // This is not a short variant of a branch, but the long variant..
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9002
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9003
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9004
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9005
instruct branchLoopEnd(cmpOp cmp, flagsReg cr, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9006
  match(CountedLoopEnd cmp cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9007
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9008
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9009
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9010
  format %{ "branch_con_short,$cmp   $labl\t # counted loop end" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9011
  ins_encode(z_enc_branch_con_short(cmp, labl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9012
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9013
  // If set to 1 this indicates that the current instruction is a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9014
  // short variant of a long branch. This avoids using this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9015
  // instruction in first-pass matching. It will then only be used in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9016
  // the `Shorten_branches' pass.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9017
  ins_short_branch(1);
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 branchLoopEndFar(cmpOp cmp, flagsReg cr, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9021
  match(CountedLoopEnd cmp cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9022
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9023
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9024
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9025
  format %{ "branch_con_far,$cmp   $labl\t # counted loop end" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9026
  ins_encode(z_enc_branch_con_far(cmp, labl));
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
  // This is not a short variant of a branch, but the long variant.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9029
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9030
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9031
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9032
//----------Compare and Branch (short distance)------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9033
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9034
// INT REG operands for loop counter processing.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9035
instruct testAndBranchLoopEnd_Reg(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9036
  match(CountedLoopEnd boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9037
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9038
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9039
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9040
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9041
  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
  9042
  opcode(CRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9043
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9044
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9045
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9046
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9047
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9048
// INT REG operands.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9049
instruct cmpb_RegI(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9050
  match(If boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9051
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9052
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9053
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9054
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9055
  format %{ "CRJ,$boolnode  $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9056
  opcode(CRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9057
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9058
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9059
  ins_short_branch(1);
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
// Unsigned INT REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9063
instruct cmpbU_RegI(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9064
  match(If boolnode (CmpU src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9065
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9066
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9067
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9068
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9069
  format %{ "CLRJ,$boolnode  $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9070
  opcode(CLRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9071
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9072
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9073
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9074
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9075
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9076
// LONG REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9077
instruct cmpb_RegL(cmpOpT boolnode, iRegL src1, iRegL src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9078
  match(If boolnode (CmpL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9079
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9080
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9081
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9082
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9083
  format %{ "CGRJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9084
  opcode(CGRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9085
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9086
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9087
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9088
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9089
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9090
//  PTR REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9091
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9092
// Separate rules for regular and narrow oops.  ADLC can't recognize
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9093
// rules with polymorphic operands to be sisters -> shorten_branches
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9094
// will not shorten.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9095
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9096
instruct cmpb_RegPP(cmpOpT boolnode, iRegP src1, iRegP src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9097
  match(If boolnode (CmpP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9098
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9099
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9100
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9101
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9102
  format %{ "CLGRJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9103
  opcode(CLGRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9104
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9105
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9106
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9107
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9108
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9109
instruct cmpb_RegNN(cmpOpT boolnode, iRegN src1, iRegN src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9110
  match(If boolnode (CmpP (DecodeN src1) (DecodeN src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9111
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9112
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9113
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9114
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9115
  format %{ "CLGRJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9116
  opcode(CLGRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9117
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9118
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9119
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9120
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9121
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9122
// INT REG/IMM operands for loop counter processing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9123
instruct testAndBranchLoopEnd_Imm(cmpOpT boolnode, iRegI src1, immI8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9124
  match(CountedLoopEnd boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9125
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9126
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9127
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9128
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9129
  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
  9130
  opcode(CIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9131
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9132
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9133
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9134
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9135
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9136
// INT REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9137
instruct cmpb_RegI_imm(cmpOpT boolnode, iRegI src1, immI8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9138
  match(If boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9139
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9140
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9141
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9142
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9143
  format %{ "CIJ,$boolnode  $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9144
  opcode(CIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9145
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9146
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9147
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9148
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9149
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9150
// INT REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9151
instruct cmpbU_RegI_imm(cmpOpT boolnode, iRegI src1, uimmI8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9152
  match(If boolnode (CmpU src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9153
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9154
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9155
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9156
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9157
  format %{ "CLIJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9158
  opcode(CLIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9159
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9160
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9161
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9162
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9163
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9164
// LONG REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9165
instruct cmpb_RegL_imm(cmpOpT boolnode, iRegL src1, immL8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9166
  match(If boolnode (CmpL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9167
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9168
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9169
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9170
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9171
  format %{ "CGIJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9172
  opcode(CGIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9173
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9174
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9175
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9176
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9177
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9178
// PTR REG-imm operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9179
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9180
// Separate rules for regular and narrow oops. ADLC can't recognize
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9181
// rules with polymorphic operands to be sisters -> shorten_branches
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9182
// will not shorten.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9183
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9184
instruct cmpb_RegP_immP(cmpOpT boolnode, iRegP src1, immP8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9185
  match(If boolnode (CmpP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9186
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9187
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9188
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9189
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9190
  format %{ "CLGIJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9191
  opcode(CLGIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9192
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9193
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9194
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9195
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9197
// Compare against zero only, do not mix N and P oops (encode/decode required).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9198
instruct cmpb_RegN_immP0(cmpOpT boolnode, iRegN src1, immP0 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9199
  match(If boolnode (CmpP (DecodeN 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 %{ "CLGIJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9205
  opcode(CLGIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9206
  ins_encode(z_enc_cmpb_regimm(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
instruct cmpb_RegN_imm(cmpOpT boolnode, iRegN src1, immN8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9212
  match(If boolnode (CmpP (DecodeN src1) (DecodeN src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9213
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9214
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9215
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9216
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9217
  format %{ "CLGIJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9218
  opcode(CLGIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9219
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9220
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9221
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9222
%}
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
//----------Compare and Branch (far distance)------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9226
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9227
// INT REG operands for loop counter processing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9228
instruct testAndBranchLoopEnd_RegFar(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9229
  match(CountedLoopEnd boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9230
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9231
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9232
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9233
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9234
  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
  9235
  opcode(CR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9236
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9237
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9238
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9239
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9240
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9241
// INT REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9242
instruct cmpb_RegI_Far(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9243
  match(If boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9244
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9245
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9246
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9247
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9248
  format %{ "CRJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9249
  opcode(CR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9250
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9251
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9252
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9253
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9254
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9255
// INT REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9256
instruct cmpbU_RegI_Far(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9257
  match(If boolnode (CmpU src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9258
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9259
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9260
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9261
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9262
  format %{ "CLRJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9263
  opcode(CLR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9264
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9265
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9266
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9267
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9268
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9269
// LONG REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9270
instruct cmpb_RegL_Far(cmpOpT boolnode, iRegL src1, iRegL src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9271
  match(If boolnode (CmpL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9272
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9273
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9274
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9275
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9276
  format %{ "CGRJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9277
  opcode(CGR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9278
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9279
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9280
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9281
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9282
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9283
// PTR REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9284
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9285
// Separate rules for regular and narrow oops. ADLC can't recognize
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9286
// rules with polymorphic operands to be sisters -> shorten_branches
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9287
// will not shorten.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9288
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9289
instruct cmpb_RegPP_Far(cmpOpT boolnode, iRegP src1, iRegP src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9290
  match(If boolnode (CmpP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9291
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9292
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9293
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9294
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9295
  format %{ "CLGRJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9296
  opcode(CLGR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9297
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9298
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9299
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9300
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9301
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9302
instruct cmpb_RegNN_Far(cmpOpT boolnode, iRegN src1, iRegN src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9303
  match(If boolnode (CmpP (DecodeN src1) (DecodeN src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9304
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9305
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9306
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9307
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9308
  format %{ "CLGRJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9309
  opcode(CLGR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9310
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9311
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9312
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9313
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9314
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9315
// INT REG/IMM operands for loop counter processing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9316
instruct testAndBranchLoopEnd_ImmFar(cmpOpT boolnode, iRegI src1, immI8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9317
  match(CountedLoopEnd boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9318
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9319
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9320
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9321
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9322
  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
  9323
  opcode(CHI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9324
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9325
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9326
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9327
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9328
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9329
// INT REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9330
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
  9331
  match(If boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9332
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9333
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9334
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9335
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9336
  format %{ "CIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9337
  opcode(CHI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9338
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9339
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9340
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9341
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9342
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9343
// INT REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9344
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
  9345
  match(If boolnode (CmpU src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9346
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9347
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9348
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9349
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9350
  format %{ "CLIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9351
  opcode(CLFI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9352
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9353
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9354
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9355
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9356
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9357
// LONG REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9358
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
  9359
  match(If boolnode (CmpL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9360
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9361
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9362
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9363
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9364
  format %{ "CGIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9365
  opcode(CGHI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9366
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9367
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9368
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9369
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9370
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9371
// PTR REG-imm operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9372
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9373
// Separate rules for regular and narrow oops. ADLC can't recognize
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9374
// rules with polymorphic operands to be sisters -> shorten_branches
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9375
// will not shorten.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9376
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9377
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
  9378
  match(If boolnode (CmpP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9379
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9380
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9381
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9382
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9383
  format %{ "CLGIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9384
  opcode(CLGFI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9385
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9386
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9387
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9388
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9389
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9390
// Compare against zero only, do not mix N and P oops (encode/decode required).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9391
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
  9392
  match(If boolnode (CmpP (DecodeN 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 %{ "CLGIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9398
  opcode(CLGFI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9399
  ins_encode(z_enc_cmpb_regimmFar(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
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
  9405
  match(If boolnode (CmpP (DecodeN src1) (DecodeN src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9406
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9407
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9408
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9409
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9410
  format %{ "CLGIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9411
  opcode(CLGFI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9412
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9413
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9414
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9415
%}
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
// Long Compare
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9419
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9420
// Due to a shortcoming in the ADLC, it mixes up expressions like:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9421
// (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
  9422
// difference between 'Y' and '0L'. The tree-matches for the CmpI sections
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9423
// are collapsed internally in the ADLC's dfa-gen code. The match for
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9424
// (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
  9425
// 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
  9426
// reg-reg and reg-zero forms of long-compare. This is unfortunate because
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9427
// both forms beat the trinary form of long-compare and both are very useful
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9428
// on platforms which have few registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9429
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9430
// Manifest a CmpL3 result in an integer register. Very painful.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9431
// This is the test to avoid.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9432
instruct cmpL3_reg_reg(iRegI dst, iRegL src1, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9433
  match(Set dst (CmpL3 src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9434
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9435
  ins_cost(DEFAULT_COST * 5 + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9436
  size(24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9437
  format %{ "CmpL3 $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9438
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9439
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9440
    // compare registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9441
    __ z_cgr($src1$$Register, $src2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9442
    // Convert condition code into -1,0,1, where
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9443
    // -1 means less
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9444
    //  0 means equal
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9445
    //  1 means greater.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9446
    if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9447
      Register one       = Z_R0_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9448
      Register minus_one = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9449
      __ z_lghi(minus_one, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9450
      __ z_lghi(one, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9451
      __ z_lghi( $dst$$Register, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9452
      __ z_locgr($dst$$Register, one,       Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9453
      __ z_locgr($dst$$Register, minus_one, Assembler::bcondLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9454
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9455
      __ clear_reg($dst$$Register, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9456
      __ z_bre(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9457
      __ z_lhi($dst$$Register, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9458
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9459
      __ z_lhi($dst$$Register, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9460
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9461
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9462
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9463
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9464
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9465
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9466
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9467
// Safepoint Instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9468
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9469
instruct safePoint() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9470
  match(SafePoint);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9471
  predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9472
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9473
  format %{ "UNIMPLEMENTED Safepoint_ " %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9474
  ins_encode(enc_unimplemented());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9475
  ins_pipe(pipe_class_dummy);
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
instruct safePoint_poll(iRegP poll, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9479
  match(SafePoint poll);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9480
  effect(USE poll, KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9481
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9482
  format %{ "TM      #0[,$poll],#111\t # Safepoint: poll for GC" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9483
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9484
    // Mark the code position where the load from the safepoint
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9485
    // polling page was emitted as relocInfo::poll_type.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9486
    __ relocate(relocInfo::poll_type);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9487
    __ load_from_polling_page($poll$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9488
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9489
  ins_pipe(pipe_class_dummy);
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
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9493
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9494
// Call Instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9495
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9496
// Call Java Static Instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9497
instruct CallStaticJavaDirect_dynTOC(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9498
  match(CallStaticJava);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9499
  effect(USE meth);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9500
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9501
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9502
  format %{ "CALL,static dynTOC $meth; ==> " %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9503
  ins_encode( z_enc_java_static_call(meth) );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9504
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9505
  ins_alignment(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9506
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9507
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9508
// Call Java Dynamic Instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9509
instruct CallDynamicJavaDirect_dynTOC(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9510
  match(CallDynamicJava);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9511
  effect(USE meth);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9512
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9513
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9514
  format %{ "CALL,dynamic dynTOC $meth; ==> " %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9515
  ins_encode(z_enc_java_dynamic_call(meth));
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_alignment(2);
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
// Call Runtime Instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9521
instruct CallRuntimeDirect(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9522
  match(CallRuntime);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9523
  effect(USE meth);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9524
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9525
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9526
  ins_num_consts(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9527
  ins_alignment(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9528
  format %{ "CALL,runtime" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9529
  ins_encode( z_enc_java_to_runtime_call(meth) );
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
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9532
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9533
// Call runtime without safepoint - same as CallRuntime
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9534
instruct CallLeafDirect(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9535
  match(CallLeaf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9536
  effect(USE meth);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9537
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9538
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9539
  ins_num_consts(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9540
  ins_alignment(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9541
  format %{ "CALL,runtime leaf $meth" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9542
  ins_encode( z_enc_java_to_runtime_call(meth) );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9543
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9544
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9545
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9546
// Call runtime without safepoint - same as CallLeaf
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9547
instruct CallLeafNoFPDirect(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9548
  match(CallLeafNoFP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9549
  effect(USE meth);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9550
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9551
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9552
  ins_num_consts(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9553
  format %{ "CALL,runtime leaf nofp $meth" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9554
  ins_encode( z_enc_java_to_runtime_call(meth) );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9555
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9556
  ins_alignment(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9557
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9558
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9559
// Tail Call; Jump from runtime stub to Java code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9560
// Also known as an 'interprocedural jump'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9561
// Target of jump will eventually return to caller.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9562
// TailJump below removes the return address.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9563
instruct TailCalljmpInd(iRegP jump_target, inline_cache_regP method_oop) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9564
  match(TailCall jump_target method_oop);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9565
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9566
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9567
  format %{ "Jmp     $jump_target\t# $method_oop holds method oop" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9568
  ins_encode %{ __ z_br($jump_target$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9569
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9570
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9571
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9572
// Return Instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9573
instruct Ret() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9574
  match(Return);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9575
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9576
  format %{ "BR(Z_R14) // branch to link register" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9577
  ins_encode %{ __ z_br(Z_R14); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9578
  ins_pipe(pipe_class_dummy);
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
// Tail Jump; remove the return address; jump to target.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9582
// TailCall above leaves the return address around.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9583
// TailJump is used in only one place, the rethrow_Java stub (fancy_jump=2).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9584
// 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
  9585
// "restore" before this instruction (in Epilogue), we need to materialize it
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9586
// in %i0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9587
instruct tailjmpInd(iRegP jump_target, rarg1RegP ex_oop) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9588
  match(TailJump jump_target ex_oop);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9589
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9590
  size(8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9591
  format %{ "TailJump $jump_target" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9592
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9593
    __ z_lg(Z_ARG2/* issuing pc */, _z_abi(return_pc), Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9594
    __ z_br($jump_target$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9595
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9596
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9597
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9598
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9599
// Create exception oop: created by stack-crawling runtime code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9600
// Created exception is now available to this handler, and is setup
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9601
// just prior to jumping to this handler. No code emitted.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9602
instruct CreateException(rarg1RegP ex_oop) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9603
  match(Set ex_oop (CreateEx));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9604
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9605
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9606
  format %{ "# exception oop; no code emitted" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9607
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9608
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9609
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9610
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9611
// Rethrow exception: The exception oop will come in the first
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9612
// argument position. Then JUMP (not call) to the rethrow stub code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9613
instruct RethrowException() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9614
  match(Rethrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9615
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9616
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9617
  format %{ "Jmp    rethrow_stub" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9618
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9619
    cbuf.set_insts_mark();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9620
    __ load_const_optimized(Z_R1_scratch, (address)OptoRuntime::rethrow_stub());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9621
    __ z_br(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9622
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9623
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9624
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9625
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9626
// Die now.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9627
instruct ShouldNotReachHere() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9628
  match(Halt);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9629
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9630
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9631
  format %{ "ILLTRAP; ShouldNotReachHere" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9632
  ins_encode %{ __ z_illtrap(); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9633
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9634
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9635
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9636
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9637
// The 2nd slow-half of a subtype check. Scan the subklass's 2ndary superklass
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9638
// array for an instance of the superklass. Set a hidden internal cache on a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9639
// hit (cache is checked with exposed code in gen_subtype_check()). Return
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9640
// 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
  9641
instruct partialSubtypeCheck(rarg1RegP index, rarg2RegP sub, rarg3RegP super, flagsReg pcc,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9642
                             rarg4RegP scratch1, rarg5RegP scratch2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9643
  match(Set index (PartialSubtypeCheck sub super));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9644
  effect(KILL pcc, KILL scratch1, KILL scratch2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9645
  ins_cost(10 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9646
  size(12);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9647
  format %{ "  CALL   PartialSubtypeCheck\n" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9648
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9649
    AddressLiteral stub_address(StubRoutines::zarch::partial_subtype_check());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9650
    __ load_const_optimized(Z_ARG4, stub_address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9651
    __ z_basr(Z_R14, Z_ARG4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9652
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9653
  ins_pipe(pipe_class_dummy);
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
instruct partialSubtypeCheck_vs_zero(flagsReg pcc, rarg2RegP sub, rarg3RegP super, immP0 zero,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9657
                                     rarg1RegP index, rarg4RegP scratch1, rarg5RegP scratch2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9658
  match(Set pcc (CmpI (PartialSubtypeCheck sub super) zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9659
  effect(KILL scratch1, KILL scratch2, KILL index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9660
  ins_cost(10 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9661
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9662
  format %{ "CALL   PartialSubtypeCheck_vs_zero\n" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9663
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9664
    AddressLiteral stub_address(StubRoutines::zarch::partial_subtype_check());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9665
    __ load_const_optimized(Z_ARG4, stub_address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9666
    __ z_basr(Z_R14, Z_ARG4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9667
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9668
  ins_pipe(pipe_class_dummy);
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
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9672
// inlined locking and unlocking
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9673
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9674
instruct cmpFastLock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9675
  match(Set pcc (FastLock oop box));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9676
  effect(TEMP tmp1, TEMP tmp2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9677
  ins_cost(100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9678
  // TODO: s390 port size(VARIABLE_SIZE); // Uses load_const_optimized.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9679
  format %{ "FASTLOCK  $oop, $box; KILL Z_ARG4, Z_ARG5" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9680
  ins_encode %{ __ compiler_fast_lock_object($oop$$Register, $box$$Register, $tmp1$$Register, $tmp2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9681
                                             UseBiasedLocking && !UseOptoBiasInlining); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9682
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9683
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9684
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9685
instruct cmpFastUnlock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9686
  match(Set pcc (FastUnlock oop box));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9687
  effect(TEMP tmp1, TEMP tmp2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9688
  ins_cost(100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9689
  // TODO: s390 port size(FIXED_SIZE);  // emitted code depends on UseBiasedLocking being on/off.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9690
  format %{ "FASTUNLOCK  $oop, $box; KILL Z_ARG4, Z_ARG5" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9691
  ins_encode %{ __ compiler_fast_unlock_object($oop$$Register, $box$$Register, $tmp1$$Register, $tmp2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9692
                                               UseBiasedLocking && !UseOptoBiasInlining); %}
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
instruct inlineCallClearArrayConst(SSlenDW cnt, iRegP_N2P base, Universe dummy, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9697
  match(Set dummy (ClearArray cnt base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9698
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9699
  ins_cost(100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9700
  // TODO: s390 port size(VARIABLE_SIZE);       // Variable in size due to varying #instructions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9701
  format %{ "ClearArrayConst $cnt,$base" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9702
  ins_encode %{ __ Clear_Array_Const($cnt$$constant, $base$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9703
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9704
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9705
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9706
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
  9707
  match(Set dummy (ClearArray cnt base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9708
  effect(TEMP srcA, TEMP srcL, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9709
  ins_cost(200);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9710
  // TODO: s390 port size(VARIABLE_SIZE);       // Variable in size due to optimized constant loader.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9711
  format %{ "ClearArrayConstBig $cnt,$base" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9712
  ins_encode %{ __ Clear_Array_Const_Big($cnt$$constant, $base$$Register, $srcA$$Register, $srcL$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9713
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9714
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9715
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9716
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
  9717
  match(Set dummy (ClearArray cnt base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9718
  effect(TEMP srcA, TEMP srcL, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9719
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9720
  // 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
  9721
  format %{ "ClearArrayVar $cnt,$base" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9722
  ins_encode %{ __ Clear_Array($cnt$$Register, $base$$Register, $srcA$$Register, $srcL$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9723
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9724
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9725
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9726
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9727
// CompactStrings
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9728
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9729
// String equals
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9730
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
  9731
  match(Set result (StrEquals (Binary str1 str2) cnt));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9732
  effect(TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9733
  predicate(((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9734
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9735
  format %{ "String Equals byte[] $str1,$str2,$cnt -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9736
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9737
    __ array_equals(false, $str1$$Register, $str2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9738
                    $cnt$$Register, $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9739
                    $result$$Register, true /* byte */);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9740
  %}
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
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
  9745
  match(Set result (StrEquals (Binary str1 str2) cnt));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9746
  effect(TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9747
  predicate(((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::UU || ((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9748
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9749
  format %{ "String Equals char[] $str1,$str2,$cnt -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9750
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9751
    __ array_equals(false, $str1$$Register, $str2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9752
                    $cnt$$Register, $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9753
                    $result$$Register, false /* byte */);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9754
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9755
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9756
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9757
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9758
instruct string_equals_imm(iRegP str1, iRegP str2, uimmI8 cnt, iRegI result, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9759
  match(Set result (StrEquals (Binary str1 str2) cnt));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9760
  effect(KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9761
  predicate(((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::LL || ((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::UU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9762
  ins_cost(100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9763
  format %{ "String Equals byte[] $str1,$str2,$cnt -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9764
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9765
    const int cnt_imm = $cnt$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9766
    if (cnt_imm) { __ z_clc(0, cnt_imm - 1, $str1$$Register, 0, $str2$$Register); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9767
    __ z_lhi($result$$Register, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9768
    if (cnt_imm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9769
      if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9770
        __ z_lhi(Z_R0_scratch, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9771
        __ z_locr($result$$Register, Z_R0_scratch, Assembler::bcondNotEqual);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9772
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9773
        Label Lskip;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9774
        __ z_bre(Lskip);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9775
        __ clear_reg($result$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9776
        __ bind(Lskip);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9777
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9778
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9779
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9780
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9781
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9782
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9783
instruct string_equalsC_imm(iRegP str1, iRegP str2, immI8 cnt, iRegI result, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9784
  match(Set result (StrEquals (Binary str1 str2) cnt));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9785
  effect(KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9786
  predicate(((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9787
  ins_cost(100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9788
  format %{ "String Equals $str1,$str2,$cnt -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9789
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9790
    const int cnt_imm = $cnt$$constant; // positive immI8 (7 bits used)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9791
    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
  9792
    __ z_lhi($result$$Register, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9793
    if (cnt_imm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9794
      if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9795
        __ z_lhi(Z_R0_scratch, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9796
        __ z_locr($result$$Register, Z_R0_scratch, Assembler::bcondNotEqual);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9797
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9798
        Label Lskip;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9799
        __ z_bre(Lskip);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9800
        __ clear_reg($result$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9801
        __ bind(Lskip);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9802
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9803
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9804
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9805
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9806
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9807
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9808
// Array equals
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9809
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
  9810
  match(Set result (AryEq ary1 ary2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9811
  effect(TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9812
  predicate(((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9813
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9814
  format %{ "Array Equals $ary1,$ary2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9815
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9816
    __ array_equals(true, $ary1$$Register, $ary2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9817
                    noreg, $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9818
                    $result$$Register, true /* byte */);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9819
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9820
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9821
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9822
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9823
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
  9824
  match(Set result (AryEq ary1 ary2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9825
  effect(TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9826
  predicate(((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9827
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9828
  format %{ "Array Equals $ary1,$ary2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9829
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9830
    __ array_equals(true, $ary1$$Register, $ary2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9831
                    noreg, $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9832
                    $result$$Register, false /* byte */);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9833
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9834
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9835
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9836
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9837
// String CompareTo
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9838
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
  9839
  match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9840
  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
  9841
  predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9842
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9843
  format %{ "String Compare byte[] $str1,$cnt1,$str2,$cnt2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9844
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9845
    __ string_compare($str1$$Register, $str2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9846
                      $cnt1$$Register, $cnt2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9847
                      $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9848
                      $result$$Register, StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9849
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9850
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9851
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9852
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9853
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
  9854
  match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9855
  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
  9856
  predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU || ((StrCompNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9857
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9858
  format %{ "String Compare char[] $str1,$cnt1,$str2,$cnt2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9859
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9860
    __ string_compare($str1$$Register, $str2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9861
                      $cnt1$$Register, $cnt2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9862
                      $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9863
                      $result$$Register, StrIntrinsicNode::UU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9864
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9865
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9866
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9867
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9868
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
  9869
  match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9870
  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
  9871
  predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9872
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9873
  format %{ "String Compare byte[],char[] $str1,$cnt1,$str2,$cnt2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9874
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9875
    __ string_compare($str1$$Register, $str2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9876
                      $cnt1$$Register, $cnt2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9877
                      $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9878
                      $result$$Register, StrIntrinsicNode::LU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9879
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9880
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9881
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9882
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9883
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
  9884
  match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9885
  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
  9886
  predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9887
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9888
  format %{ "String Compare char[],byte[] $str1,$cnt1,$str2,$cnt2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9889
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9890
    __ string_compare($str2$$Register, $str1$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9891
                      $cnt2$$Register, $cnt1$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9892
                      $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9893
                      $result$$Register, StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9894
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9895
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9896
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9897
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9898
// String IndexOfChar
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9899
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
  9900
  match(Set result (StrIndexOfChar (Binary haystack haycnt) ch));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9901
  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
  9902
  ins_cost(200);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9903
  format %{ "String IndexOfChar [0..$haycnt]($haystack), $ch -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9904
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9905
    __ string_indexof_char($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9906
                           $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9907
                           $ch$$Register, 0 /* unused, ch is in register */,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9908
                           $oddReg$$Register, $evenReg$$Register, false /*is_byte*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9909
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9910
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9911
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9912
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9913
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
  9914
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9915
  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
  9916
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU || ((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9917
  ins_cost(200);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9918
  format %{ "String IndexOf UL [0..$haycnt]($haystack), [0]($needle) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9919
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9920
    immPOper *needleOper = (immPOper *)$needle;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9921
    const TypeOopPtr *t = needleOper->type()->isa_oopptr();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9922
    ciTypeArray* needle_values = t->const_oop()->as_type_array();  // Pointer to live char *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9923
    jchar chr;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9924
#ifdef VM_LITTLE_ENDIAN
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9925
    Unimplemented();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9926
#else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9927
    chr = (((jchar)(unsigned char)needle_values->element_value(0).as_byte()) << 8) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9928
           ((jchar)(unsigned char)needle_values->element_value(1).as_byte());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9929
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9930
    __ string_indexof_char($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9931
                           $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9932
                           noreg, chr,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9933
                           $oddReg$$Register, $evenReg$$Register, false /*is_byte*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9934
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9935
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9936
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9937
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9938
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
  9939
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9940
  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
  9941
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9942
  ins_cost(200);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9943
  format %{ "String IndexOf L [0..$haycnt]($haystack), [0]($needle) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9944
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9945
    immPOper *needleOper = (immPOper *)$needle;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9946
    const TypeOopPtr *t = needleOper->type()->isa_oopptr();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9947
    ciTypeArray* needle_values = t->const_oop()->as_type_array();  // Pointer to live char *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9948
    jchar chr = (jchar)needle_values->element_value(0).as_byte();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9949
    __ string_indexof_char($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9950
                           $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9951
                           noreg, chr,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9952
                           $oddReg$$Register, $evenReg$$Register, true /*is_byte*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9953
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9954
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9955
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9956
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9957
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
  9958
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9959
  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
  9960
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9961
  ins_cost(200);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9962
  format %{ "String IndexOf UL [0..$haycnt]($haystack), [0]($needle) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9963
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9964
    immPOper *needleOper = (immPOper *)$needle;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9965
    const TypeOopPtr *t = needleOper->type()->isa_oopptr();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9966
    ciTypeArray* needle_values = t->const_oop()->as_type_array();  // Pointer to live char *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9967
    jchar chr = (jchar)needle_values->element_value(0).as_byte();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9968
    __ string_indexof_char($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9969
                           $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9970
                           noreg, chr,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9971
                           $oddReg$$Register, $evenReg$$Register, false /*is_byte*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9972
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9973
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9974
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9975
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9976
// String IndexOf
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9977
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
  9978
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecntImm)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9979
  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
  9980
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU || ((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9981
  ins_cost(250);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9982
  format %{ "String IndexOf U [0..$needlecntImm]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9983
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9984
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9985
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9986
                      $needle$$Register, noreg, $needlecntImm$$constant,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9987
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::UU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9988
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9989
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9990
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9991
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9992
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
  9993
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecntImm)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9994
  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
  9995
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9996
  ins_cost(250);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9997
  format %{ "String IndexOf L [0..$needlecntImm]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9998
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9999
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10000
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10001
                      $needle$$Register, noreg, $needlecntImm$$constant,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10002
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10003
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10004
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10005
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10006
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10007
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
 10008
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecntImm)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10009
  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
 10010
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10011
  ins_cost(250);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10012
  format %{ "String IndexOf UL [0..$needlecntImm]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10013
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10014
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10015
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10016
                      $needle$$Register, noreg, $needlecntImm$$constant,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10017
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10018
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10019
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10020
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10021
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10022
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
 10023
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10024
  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
 10025
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU || ((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10026
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10027
  format %{ "String IndexOf U [0..$needlecnt]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10028
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10029
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10030
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10031
                      $needle$$Register, $needlecnt$$Register, 0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10032
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::UU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10033
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10034
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10035
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10036
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10037
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
 10038
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10039
  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
 10040
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10041
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10042
  format %{ "String IndexOf L [0..$needlecnt]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10043
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10044
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10045
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10046
                      $needle$$Register, $needlecnt$$Register, 0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10047
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10048
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10049
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10050
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10051
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10052
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
 10053
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10054
  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
 10055
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10056
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10057
  format %{ "String IndexOf UL [0..$needlecnt]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10058
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10059
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10060
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10061
                      $needle$$Register, $needlecnt$$Register, 0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10062
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10063
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10064
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10065
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10066
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10067
// char[] to byte[] compression
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10068
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
 10069
  match(Set result (StrCompressedCopy src (Binary dst len)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10070
  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
 10071
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10072
  format %{ "String Compress $src->$dst($len) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10073
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10074
    __ string_compress($result$$Register, $src$$Register, $dst$$Register, $len$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10075
                       $evenReg$$Register, $tmp$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10076
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10077
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10078
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10079
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10080
// 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
 10081
//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
 10082
//  match(Set dummy (StrInflatedCopy src (Binary dst len)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10083
//  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
 10084
//  predicate(VM_Version::has_ETF2Enhancements());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10085
//  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10086
//  format %{ "String Inflate (trot) $dst,$src($len)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10087
//  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10088
//    __ string_inflate_trot($src$$Register, $dst$$Register, $len$$Register, $tmp$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10089
//  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10090
//  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10091
//%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10092
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10093
// byte[] to char[] inflation
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10094
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
 10095
  match(Set dummy (StrInflatedCopy src (Binary dst len)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10096
  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
 10097
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10098
  format %{ "String Inflate $src->$dst($len)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10099
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10100
    __ string_inflate($src$$Register, $dst$$Register, $len$$Register, $evenReg$$Register, $tmp$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10101
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10102
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10103
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10104
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10105
// StringCoding.java intrinsics
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10106
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
 10107
  match(Set result (HasNegatives ary1 len));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10108
  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
 10109
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10110
  format %{ "has negatives byte[] $ary1($len) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10111
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10112
    __ has_negatives($result$$Register, $ary1$$Register, $len$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10113
                     $oddReg$$Register, $evenReg$$Register, $tmp$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10114
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10115
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10116
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10117
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10118
// encode char[] to byte[] in ISO_8859_1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10119
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
 10120
  match(Set result (EncodeISOArray src (Binary dst len)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10121
  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
 10122
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10123
  format %{ "Encode array $src->$dst($len) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10124
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10125
    __ string_compress($result$$Register, $src$$Register, $dst$$Register, $len$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10126
                       $evenReg$$Register, $tmp$$Register, $tmp2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10127
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10128
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10129
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10130
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10131
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10132
//----------PEEPHOLE RULES-----------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10133
// These must follow all instruction definitions as they use the names
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10134
// defined in the instructions definitions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10135
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10136
// peepmatch (root_instr_name [preceeding_instruction]*);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10137
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10138
// peepconstraint %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10139
// (instruction_number.operand_name relational_op instruction_number.operand_name
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10140
//  [, ...]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10141
// // instruction numbers are zero-based using left to right order in peepmatch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10142
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10143
// peepreplace (instr_name([instruction_number.operand_name]*));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10144
// // provide an instruction_number.operand_name for each operand that appears
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10145
// // in the replacement instruction's match rule
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10146
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10147
// ---------VM FLAGS---------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10148
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10149
// All peephole optimizations can be turned off using -XX:-OptoPeephole
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10150
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10151
// Each peephole rule is given an identifying number starting with zero and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10152
// increasing by one in the order seen by the parser. An individual peephole
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10153
// can be enabled, and all others disabled, by using -XX:OptoPeepholeAt=#
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10154
// on the command-line.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10155
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10156
// ---------CURRENT LIMITATIONS----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10157
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10158
// Only match adjacent instructions in same basic block
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10159
// Only equality constraints
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10160
// Only constraints between operands, not (0.dest_reg == EAX_enc)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10161
// Only one replacement instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10162
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10163
// ---------EXAMPLE----------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10164
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10165
// // pertinent parts of existing instructions in architecture description
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10166
// instruct movI(eRegI dst, eRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10167
//   match(Set dst (CopyI src));
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 incI_eReg(eRegI dst, immI1 src, eFlagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10171
//   match(Set dst (AddI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10172
//   effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10173
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10174
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10175
// // Change (inc mov) to lea
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10176
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10177
//   // increment preceeded by register-register move
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10178
//   peepmatch (incI_eReg movI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10179
//   // require that the destination register of the increment
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10180
//   // match the destination register of the move
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10181
//   peepconstraint (0.dst == 1.dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10182
//   // construct a replacement instruction that sets
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10183
//   // the destination to (move's source register + one)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10184
//   peepreplace (leaI_eReg_immI(0.dst 1.src 0.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10185
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10186
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10187
// Implementation no longer uses movX instructions since
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10188
// machine-independent system no longer uses CopyX nodes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10189
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10190
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10191
//   peepmatch (incI_eReg movI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10192
//   peepconstraint (0.dst == 1.dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10193
//   peepreplace (leaI_eReg_immI(0.dst 1.src 0.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10194
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10195
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10196
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10197
//   peepmatch (decI_eReg movI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10198
//   peepconstraint (0.dst == 1.dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10199
//   peepreplace (leaI_eReg_immI(0.dst 1.src 0.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10200
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10201
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10202
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10203
//   peepmatch (addI_eReg_imm movI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10204
//   peepconstraint (0.dst == 1.dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10205
//   peepreplace (leaI_eReg_immI(0.dst 1.src 0.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10206
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10207
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10208
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10209
//   peepmatch (addP_eReg_imm movP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10210
//   peepconstraint (0.dst == 1.dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10211
//   peepreplace (leaP_eReg_immI(0.dst 1.src 0.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10212
// %}
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
//  This peephole rule does not work, probably because ADLC can't handle two effects:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10216
//  Effect 1 is defining 0.op1 and effect 2 is setting CC
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10217
// condense a load from memory and subsequent test for zero
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10218
// into a single, more efficient ICM instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10219
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10220
//   peepmatch (compI_iReg_imm0 loadI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10221
//   peepconstraint (1.dst == 0.op1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10222
//   peepreplace (loadtest15_iReg_mem(0.op1 0.op1 1.mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10223
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10224
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10225
// // Change load of spilled value to only a spill
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10226
// instruct storeI(memory mem, eRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10227
//   match(Set mem (StoreI mem src));
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
// instruct loadI(eRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10231
//   match(Set dst (LoadI mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10232
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10233
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10234
peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10235
  peepmatch (loadI storeI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10236
  peepconstraint (1.src == 0.dst, 1.mem == 0.mem);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10237
  peepreplace (storeI(1.mem 1.mem 1.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10238
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10239
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10240
peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10241
  peepmatch (loadL storeL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10242
  peepconstraint (1.src == 0.dst, 1.mem == 0.mem);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10243
  peepreplace (storeL(1.mem 1.mem 1.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10244
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10245
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10246
peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10247
  peepmatch (loadP storeP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10248
  peepconstraint (1.src == 0.dst, 1.dst == 0.mem);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10249
  peepreplace (storeP(1.dst 1.dst 1.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10250
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10251
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10252
//----------SUPERWORD RULES---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10253
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10254
//  Expand rules for special cases
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10255
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10256
instruct expand_storeF(stackSlotF mem, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10257
  // No match rule, false predicate, for expand only.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10258
  effect(DEF mem, USE src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10259
  predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10260
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10261
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10262
  format %{ "STE      $src,$mem\t # replicate(float2stack)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10263
  opcode(STE_ZOPC, STE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10264
  ins_encode(z_form_rt_mem(src, mem));
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
instruct expand_LoadLogical_I2L(iRegL dst, stackSlotF mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10269
  // No match rule, false predicate, for expand only.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10270
  effect(DEF dst, USE mem);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10271
  predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10272
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10273
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10274
  format %{ "LLGF     $dst,$mem\t # replicate(stack2reg(unsigned))" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10275
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10276
  ins_encode(z_form_rt_mem(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10277
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10278
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10279
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10280
// Replicate scalar int to packed int values (8 Bytes)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10281
instruct expand_Repl2I_reg(iRegL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10282
  // Dummy match rule, false predicate, for expand only.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10283
  match(Set dst (ConvI2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10284
  predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10285
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10286
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10287
  format %{ "REPLIC2F $dst,$src\t # replicate(pack2F)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10288
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10289
    if ($dst$$Register == $src$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10290
      __ z_sllg(Z_R0_scratch, $src$$Register, 64-32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10291
      __ z_ogr($dst$$Register, Z_R0_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10292
    }  else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10293
      __ z_sllg($dst$$Register, $src$$Register, 64-32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10294
      __ z_ogr( $dst$$Register, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10295
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10296
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10297
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10298
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10299
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10300
// Replication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10301
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10302
// Exploit rotate_then_insert, if available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10303
// Replicate scalar byte to packed byte values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10304
instruct Repl8B_reg_risbg(iRegL dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10305
  match(Set dst (ReplicateB src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10306
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10307
  predicate((n->as_Vector()->length() == 8));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10308
  format %{ "REPLIC8B $dst,$src\t # pack8B" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10309
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10310
    if ($dst$$Register != $src$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10311
      __ z_lgr($dst$$Register, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10312
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10313
    __ rotate_then_insert($dst$$Register, $dst$$Register, 48, 55,  8, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10314
    __ rotate_then_insert($dst$$Register, $dst$$Register, 32, 47, 16, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10315
    __ rotate_then_insert($dst$$Register, $dst$$Register,  0, 31, 32, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10316
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10317
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10318
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10319
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10320
// Replicate scalar byte to packed byte values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10321
instruct Repl8B_imm(iRegL dst, immB_n0m1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10322
  match(Set dst (ReplicateB src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10323
  predicate(n->as_Vector()->length() == 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10324
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10325
  format %{ "REPLIC8B $dst,$src\t # pack8B imm" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10326
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10327
    int64_t  Isrc8 = $src$$constant & 0x000000ff;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10328
    int64_t Isrc16 =  Isrc8 <<  8 |  Isrc8;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10329
    int64_t Isrc32 = Isrc16 << 16 | Isrc16;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10330
    assert(Isrc8 != 0x000000ff && Isrc8 != 0, "should be handled by other match rules.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10331
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10332
    __ z_llilf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10333
    __ z_iihf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10334
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10335
  ins_pipe(pipe_class_dummy);
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
// Replicate scalar byte to packed byte values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10339
instruct Repl8B_imm0(iRegL dst, immI_0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10340
  match(Set dst (ReplicateB src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10341
  predicate(n->as_Vector()->length() == 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10342
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10343
  format %{ "REPLIC8B $dst,$src\t # pack8B imm0" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10344
  ins_encode %{ __ z_laz($dst$$Register, 0, Z_R0); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10345
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10346
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10347
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10348
// Replicate scalar byte to packed byte values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10349
instruct Repl8B_immm1(iRegL dst, immB_minus1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10350
  match(Set dst (ReplicateB src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10351
  predicate(n->as_Vector()->length() == 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10352
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10353
  format %{ "REPLIC8B $dst,$src\t # pack8B immm1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10354
  ins_encode %{ __ z_lghi($dst$$Register, -1); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10355
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10356
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10357
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10358
// Exploit rotate_then_insert, if available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10359
// Replicate scalar short to packed short values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10360
instruct Repl4S_reg_risbg(iRegL dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10361
  match(Set dst (ReplicateS src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10362
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10363
  predicate((n->as_Vector()->length() == 4));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10364
  format %{ "REPLIC4S $dst,$src\t # pack4S" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10365
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10366
    if ($dst$$Register != $src$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10367
      __ z_lgr($dst$$Register, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10368
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10369
    __ rotate_then_insert($dst$$Register, $dst$$Register, 32, 47, 16, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10370
    __ rotate_then_insert($dst$$Register, $dst$$Register,  0, 31, 32, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10371
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10372
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10373
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10374
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10375
// Replicate scalar short to packed short values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10376
instruct Repl4S_imm(iRegL dst, immS_n0m1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10377
  match(Set dst (ReplicateS src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10378
  predicate(n->as_Vector()->length() == 4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10379
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10380
  format %{ "REPLIC4S $dst,$src\t # pack4S imm" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10381
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10382
    int64_t Isrc16 = $src$$constant & 0x0000ffff;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10383
    int64_t Isrc32 = Isrc16 << 16 | Isrc16;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10384
    assert(Isrc16 != 0x0000ffff && Isrc16 != 0, "Repl4S_imm: (src == " INT64_FORMAT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10385
           ") should be handled by other match rules.", $src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10386
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10387
    __ z_llilf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10388
    __ z_iihf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10389
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10390
  ins_pipe(pipe_class_dummy);
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
// Replicate scalar short to packed short values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10394
instruct Repl4S_imm0(iRegL dst, immI_0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10395
  match(Set dst (ReplicateS src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10396
  predicate(n->as_Vector()->length() == 4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10397
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10398
  format %{ "REPLIC4S $dst,$src\t # pack4S imm0" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10399
  ins_encode %{ __ z_laz($dst$$Register, 0, Z_R0); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10400
  ins_pipe(pipe_class_dummy);
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
// Replicate scalar short to packed short values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10404
instruct Repl4S_immm1(iRegL dst, immS_minus1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10405
  match(Set dst (ReplicateS src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10406
  predicate(n->as_Vector()->length() == 4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10407
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10408
  format %{ "REPLIC4S $dst,$src\t # pack4S immm1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10409
  ins_encode %{ __ z_lghi($dst$$Register, -1); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10410
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10411
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10412
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10413
// Exploit rotate_then_insert, if available.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10414
// Replicate scalar int to packed int values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10415
instruct Repl2I_reg_risbg(iRegL dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10416
  match(Set dst (ReplicateI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10417
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10418
  predicate((n->as_Vector()->length() == 2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10419
  format %{ "REPLIC2I $dst,$src\t # pack2I" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10420
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10421
    if ($dst$$Register != $src$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10422
      __ z_lgr($dst$$Register, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10423
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10424
    __ rotate_then_insert($dst$$Register, $dst$$Register, 0, 31, 32, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10425
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10426
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10427
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10428
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10429
// Replicate scalar int to packed int values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10430
instruct Repl2I_imm(iRegL dst, immI_n0m1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10431
  match(Set dst (ReplicateI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10432
  predicate(n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10433
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10434
  format %{ "REPLIC2I $dst,$src\t # pack2I imm" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10435
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10436
    int64_t Isrc32 = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10437
    assert(Isrc32 != -1 && Isrc32 != 0, "should be handled by other match rules.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10438
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10439
    __ z_llilf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10440
    __ z_iihf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10441
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10442
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10443
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10444
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10445
// Replicate scalar int to packed int values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10446
instruct Repl2I_imm0(iRegL dst, immI_0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10447
  match(Set dst (ReplicateI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10448
  predicate(n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10449
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10450
  format %{ "REPLIC2I $dst,$src\t # pack2I imm0" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10451
  ins_encode %{ __ z_laz($dst$$Register, 0, Z_R0); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10452
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10453
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10454
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10455
// Replicate scalar int to packed int values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10456
instruct Repl2I_immm1(iRegL dst, immI_minus1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10457
  match(Set dst (ReplicateI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10458
  predicate(n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10459
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10460
  format %{ "REPLIC2I $dst,$src\t # pack2I immm1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10461
  ins_encode %{ __ z_lghi($dst$$Register, -1); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10462
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10463
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10464
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10465
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10466
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10467
instruct Repl2F_reg_indirect(iRegL dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10468
  match(Set dst (ReplicateF 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(!VM_Version::has_FPSupportEnhancements() && n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10471
  format %{ "REPLIC2F $dst,$src\t # pack2F indirect" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10472
  expand %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10473
    stackSlotF tmp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10474
    iRegL      tmp2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10475
    expand_storeF(tmp, src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10476
    expand_LoadLogical_I2L(tmp2, tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10477
    expand_Repl2I_reg(dst, tmp2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10478
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10479
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10480
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10481
// Replicate scalar float to packed float values in GREG (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10482
instruct Repl2F_reg_direct(iRegL dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10483
  match(Set dst (ReplicateF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10484
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10485
  predicate(VM_Version::has_FPSupportEnhancements() && n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10486
  format %{ "REPLIC2F $dst,$src\t # pack2F direct" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10487
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10488
    assert(VM_Version::has_FPSupportEnhancements(), "encoder should never be called on old H/W");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10489
    __ z_lgdr($dst$$Register, $src$$FloatRegister);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10490
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10491
    __ 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
 10492
    __ z_iilf($dst$$Register, 0);                 // Save a "result not ready" stall.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10493
    __ z_ogr($dst$$Register, Z_R0_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10494
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10495
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10496
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10497
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10498
// Replicate scalar float immediate to packed float values in GREG (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10499
instruct Repl2F_imm(iRegL dst, immF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10500
  match(Set dst (ReplicateF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10501
  predicate(n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10502
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10503
  format %{ "REPLIC2F $dst,$src\t # pack2F imm" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10504
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10505
    union {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10506
      int   Isrc32;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10507
      float Fsrc32;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10508
    };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10509
    Fsrc32 = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10510
    __ z_llilf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10511
    __ z_iihf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10512
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10513
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10514
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10515
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10516
// Replicate scalar float immediate zeroes to packed float values in GREG (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10517
// Do this only for 'real' zeroes, especially don't loose sign of negative zeroes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10518
instruct Repl2F_imm0(iRegL dst, immFp0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10519
  match(Set dst (ReplicateF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10520
  predicate(n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10521
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10522
  format %{ "REPLIC2F $dst,$src\t # pack2F imm0" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10523
  ins_encode %{ __ z_laz($dst$$Register, 0, Z_R0); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10524
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10525
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10526
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10527
// Store
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10528
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10529
// Store Aligned Packed Byte register to memory (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10530
instruct storeA8B(memory mem, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10531
  match(Set mem (StoreVector mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10532
  predicate(n->as_StoreVector()->memory_size() == 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10533
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10534
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10535
  format %{ "STG     $src,$mem\t # ST(packed8B)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10536
  opcode(STG_ZOPC, STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10537
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10538
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10539
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10540
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10541
// Load
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10542
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10543
instruct loadV8(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10544
  match(Set dst (LoadVector mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10545
  predicate(n->as_LoadVector()->memory_size() == 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10546
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10547
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10548
  format %{ "LG      $dst,$mem\t # L(packed8B)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10549
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10550
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10551
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10552
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10553
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10554
//----------POPULATION COUNT RULES--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10555
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10556
// Byte reverse
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10557
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10558
instruct bytes_reverse_int(iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10559
  match(Set dst (ReverseBytesI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10560
  predicate(UseByteReverseInstruction);  // See Matcher::match_rule_supported
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10561
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10562
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10563
  format %{ "LRVR    $dst,$src\t# byte reverse int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10564
  opcode(LRVR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10565
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10566
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10567
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10568
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10569
instruct bytes_reverse_long(iRegL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10570
  match(Set dst (ReverseBytesL src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10571
  predicate(UseByteReverseInstruction);  // See Matcher::match_rule_supported
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10572
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10573
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10574
  format %{ "LRVGR   $dst,$src\t# byte reverse long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10575
  opcode(LRVGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10576
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10577
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10578
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10579
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10580
// Leading zeroes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10581
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10582
// The instruction FLOGR (Find Leftmost One in Grande (64bit) Register)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10583
// returns the bit position of the leftmost 1 in the 64bit source register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10584
// As the bits are numbered from left to right (0..63), the returned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10585
// position index is equivalent to the number of leading zeroes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10586
// If no 1-bit is found (i.e. the regsiter contains zero), the instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10587
// returns position 64. That's exactly what we need.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10588
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10589
instruct countLeadingZerosI(revenRegI dst, iRegI src, roddRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10590
  match(Set dst (CountLeadingZerosI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10591
  effect(KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10592
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10593
  size(14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10594
  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
 10595
            "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
 10596
            "FLOGR   $dst,$dst"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10597
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10598
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10599
    // Performance experiments indicate that "FLOGR" is using some kind of
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10600
    // iteration to find the leftmost "1" bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10601
    //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10602
    // The prior implementation zero-extended the 32-bit argument to 64 bit,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10603
    // thus forcing "FLOGR" to count 32 bits of which we know they are zero.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10604
    // We could gain measurable speedup in micro benchmark:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10605
    //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10606
    //               leading   trailing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10607
    //   z10:   int     2.04       1.68
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10608
    //         long     1.00       1.02
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10609
    //   z196:  int     0.99       1.23
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10610
    //         long     1.00       1.11
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10611
    //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10612
    // By shifting the argument into the high-word instead of zero-extending it.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10613
    // The add'l branch on condition (taken for a zero argument, very infrequent,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10614
    // good prediction) is well compensated for by the savings.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10615
    //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10616
    // We leave the previous implementation in for some time in the future when
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10617
    // the "FLOGR" instruction may become less iterative.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10618
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10619
    // Version 2: shows 62%(z9), 204%(z10), -1%(z196) improvement over original
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10620
    __ 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
 10621
    __ 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
 10622
    __ z_flogr($dst$$Register, $dst$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10623
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10624
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10625
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10626
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10627
instruct countLeadingZerosL(revenRegI dst, iRegL src, roddRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10628
  match(Set dst (CountLeadingZerosL src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10629
  effect(KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10630
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10631
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10632
  format %{ "FLOGR   $dst,$src \t# count leading zeros (long)\n\t" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10633
  ins_encode %{ __ z_flogr($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10634
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10635
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10636
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10637
// trailing zeroes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10638
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10639
// We transform the trailing zeroes problem to a leading zeroes problem
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10640
// such that can use the FLOGR instruction to our advantage.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10641
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10642
// With
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10643
//   tmp1 = src - 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10644
// we flip all trailing zeroes to ones and the rightmost one to zero.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10645
// All other bits remain unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10646
// With the complement
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10647
//   tmp2 = ~src
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10648
// we get all ones in the trailing zeroes positions. Thus,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10649
//   tmp3 = tmp1 & tmp2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10650
// yields ones in the trailing zeroes positions and zeroes elsewhere.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10651
// Now we can apply FLOGR and get 64-(trailing zeroes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10652
instruct countTrailingZerosI(revenRegI dst, iRegI src, roddRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10653
  match(Set dst (CountTrailingZerosI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10654
  effect(TEMP_DEF dst, TEMP tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10655
  ins_cost(8 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10656
  // TODO: s390 port size(FIXED_SIZE);  // Emitted code depends on PreferLAoverADD being on/off.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10657
  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
 10658
            "LCGFR   $tmp,$src  \t# load 2's complement (32->64 bit)\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10659
            "AGHI    $dst,-1    \t# tmp1 = src-1\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10660
            "AGHI    $tmp,-1    \t# tmp2 = -src-1 = ~src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10661
            "NGR     $dst,$tmp  \t# tmp3 = tmp1&tmp2\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10662
            "FLOGR   $dst,$dst  \t# count trailing zeros (int)\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10663
            "AHI     $dst,-64   \t# tmp4 = 64-(trailing zeroes)-64\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10664
            "LCR     $dst,$dst  \t# res = -tmp4"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10665
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10666
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10667
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10668
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10669
    // Rtmp only needed for for zero-argument shortcut. With kill effect in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10670
    // match rule Rsrc = roddReg would be possible, saving one register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10671
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10672
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10673
    assert_different_registers(Rdst, Rsrc, Rtmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10674
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10675
    // Algorithm:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10676
    // - Isolate the least significant (rightmost) set bit using (src & (-src)).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10677
    //   All other bits in the result are zero.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10678
    // - Find the "leftmost one" bit position in the single-bit result from previous step.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10679
    // - 63-("leftmost one" bit position) gives the # of trailing zeros.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10680
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10681
    // Version 2: shows 79%(z9), 68%(z10), 23%(z196) improvement over original.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10682
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10683
    __ load_const_optimized(Rdst, 32); // Prepare for shortcut (zero argument), result will be 32.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10684
    __ z_lcgfr(Rtmp, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10685
    __ z_bre(done);                    // Taken very infrequently, good prediction, no BHT entry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10686
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10687
    __ z_nr(Rtmp, Rsrc);               // (src) & (-src) leaves nothing but least significant bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10688
    __ z_ahi(Rtmp,  -1);               // Subtract one to fill all trailing zero positions with ones.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10689
                                       // Use 32bit op to prevent borrow propagation (case Rdst = 0x80000000)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10690
                                       // into upper half of reg. Not relevant with sllg below.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10691
    __ z_sllg(Rdst, Rtmp, 32);         // Shift interesting contents to upper half of register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10692
    __ z_bre(done);                    // Shortcut for argument = 1, result will be 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10693
                                       // Depends on CC set by ahi above.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10694
                                       // Taken very infrequently, good prediction, no BHT entry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10695
                                       // Branch delayed to have Rdst set correctly (Rtmp == 0(32bit)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10696
                                       // after SLLG Rdst == 0(64bit)).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10697
    __ z_flogr(Rdst, Rdst);            // Kills tmp which is the oddReg for dst.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10698
    __ add2reg(Rdst,  -32);            // 32-pos(leftmost1) is #trailing zeros
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10699
    __ z_lcgfr(Rdst, Rdst);            // Provide 64bit result at no cost.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10700
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10701
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10702
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10703
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10704
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10705
instruct countTrailingZerosL(revenRegI dst, iRegL src, roddRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10706
  match(Set dst (CountTrailingZerosL src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10707
  effect(TEMP_DEF dst, KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10708
  ins_cost(8 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10709
  // TODO: s390 port size(FIXED_SIZE);  // Emitted code depends on PreferLAoverADD being on/off.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10710
  format %{ "LCGR    $dst,$src  \t# preserve src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10711
            "NGR     $dst,$src  \t#"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10712
            "AGHI    $dst,-1    \t# tmp1 = src-1\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10713
            "FLOGR   $dst,$dst  \t# count trailing zeros (long), kill $tmp\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10714
            "AHI     $dst,-64   \t# tmp4 = 64-(trailing zeroes)-64\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10715
            "LCR     $dst,$dst  \t#"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10716
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10717
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10718
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10719
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10720
    assert_different_registers(Rdst, Rsrc); // Rtmp == Rsrc allowed.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10721
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10722
    // New version: shows 5%(z9), 2%(z10), 11%(z196) improvement over original.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10723
    __ z_lcgr(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10724
    __ z_ngr(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10725
    __ add2reg(Rdst,   -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10726
    __ z_flogr(Rdst, Rdst); // Kills tmp which is the oddReg for dst.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10727
    __ add2reg(Rdst,  -64);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10728
    __ z_lcgfr(Rdst, Rdst); // Provide 64bit result at no cost.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10729
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10730
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10731
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10732
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10733
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10734
// bit count
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10735
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10736
instruct popCountI(iRegI dst, iRegI src, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10737
  match(Set dst (PopCountI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10738
  effect(TEMP_DEF dst, TEMP tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10739
  predicate(UsePopCountInstruction && VM_Version::has_PopCount());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10740
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10741
  size(24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10742
  format %{ "POPCNT  $dst,$src\t# pop count int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10743
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10744
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10745
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10746
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10747
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10748
    // Prefer compile-time assertion over run-time SIGILL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10749
    assert(VM_Version::has_PopCount(), "bad predicate for countLeadingZerosI");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10750
    assert_different_registers(Rdst, Rtmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10751
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10752
    // Version 2: shows 10%(z196) improvement over original.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10753
    __ z_popcnt(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10754
    __ z_srlg(Rtmp, Rdst, 16); // calc  byte4+byte6 and byte5+byte7
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10755
    __ z_alr(Rdst, Rtmp);      //   into byte6 and byte7
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10756
    __ z_srlg(Rtmp, Rdst,  8); // calc (byte4+byte6) + (byte5+byte7)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10757
    __ z_alr(Rdst, Rtmp);      //   into byte7
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10758
    __ z_llgcr(Rdst, Rdst);    // zero-extend sum
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10759
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10760
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10761
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10762
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10763
instruct popCountL(iRegI dst, iRegL src, iRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10764
  match(Set dst (PopCountL src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10765
  effect(TEMP_DEF dst, TEMP tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10766
  predicate(UsePopCountInstruction && VM_Version::has_PopCount());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10767
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10768
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10769
  format %{ "POPCNT  $dst,$src\t# pop count long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10770
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10771
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10772
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10773
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10774
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10775
    // Prefer compile-time assertion over run-time SIGILL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10776
    assert(VM_Version::has_PopCount(), "bad predicate for countLeadingZerosI");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10777
    assert_different_registers(Rdst, Rtmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10778
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10779
    // 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
 10780
    __ z_popcnt(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10781
    __ z_ahhlr(Rdst, Rdst, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10782
    __ z_sllg(Rtmp, Rdst, 16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10783
    __ z_algr(Rdst, Rtmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10784
    __ z_sllg(Rtmp, Rdst,  8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10785
    __ z_algr(Rdst, Rtmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10786
    __ z_srlg(Rdst, Rdst, 56);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10787
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10788
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10789
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10790
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10791
//----------SMARTSPILL RULES---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10792
// These must follow all instruction definitions as they use the names
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10793
// defined in the instructions definitions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10794
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10795
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10796
// TYPE PROFILING RULES
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10797