src/hotspot/cpu/s390/s390.ad
author chegar
Thu, 17 Oct 2019 20:54:25 +0100
branchdatagramsocketimpl-branch
changeset 58679 9c3209ff7550
parent 58678 9cf78a70fa4f
parent 58019 86b95fc6ca32
permissions -rw-r--r--
datagramsocketimpl-branch: merge with default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     1
//
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
     2
// Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
     3
// Copyright (c) 2017, 2019 SAP SE. All rights reserved.
42065
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
54542
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
   477
// z_long_reg without even registers
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
   478
reg_class z_long_odd_reg(
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
   479
/*Z_R0_H,Z_R0*/     // R0
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
   480
/*Z_R1_H,Z_R1*/
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
   481
  Z_R3_H,Z_R3,
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
   482
  Z_R5_H,Z_R5,
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
   483
  Z_R7_H,Z_R7,
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
   484
  Z_R9_H,Z_R9,
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
   485
  Z_R11_H,Z_R11,
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
   486
  Z_R13_H,Z_R13
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
   487
/*Z_R14_H,Z_R14,*/  // return_pc
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
   488
/*Z_R15_H,Z_R15*/   // SP
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
   489
);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   490
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   491
// Special Class for Condition Code Flags Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   492
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   493
reg_class z_condition_reg(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   494
  Z_CR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   495
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   496
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   497
// Scratch register for late profiling. Callee saved.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   498
reg_class z_rscratch2_bits64_reg(Z_R2_H, Z_R2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   499
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   500
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   501
// Float Register Classes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   502
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   503
reg_class z_flt_reg(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   504
  Z_F0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   505
/*Z_F1,*/ // scratch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   506
  Z_F2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   507
  Z_F3,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   508
  Z_F4,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   509
  Z_F5,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   510
  Z_F6,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   511
  Z_F7,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   512
  Z_F8,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   513
  Z_F9,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   514
  Z_F10,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   515
  Z_F11,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   516
  Z_F12,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   517
  Z_F13,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   518
  Z_F14,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   519
  Z_F15
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   520
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   521
reg_class z_rscratch1_flt_reg(Z_F1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   522
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   523
// Double precision float registers have virtual `high halves' that
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   524
// are needed by the allocator.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   525
reg_class z_dbl_reg(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   526
  Z_F0,Z_F0_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   527
/*Z_F1,Z_F1_H,*/ // scratch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   528
  Z_F2,Z_F2_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   529
  Z_F3,Z_F3_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   530
  Z_F4,Z_F4_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   531
  Z_F5,Z_F5_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   532
  Z_F6,Z_F6_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   533
  Z_F7,Z_F7_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   534
  Z_F8,Z_F8_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   535
  Z_F9,Z_F9_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   536
  Z_F10,Z_F10_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   537
  Z_F11,Z_F11_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   538
  Z_F12,Z_F12_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   539
  Z_F13,Z_F13_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   540
  Z_F14,Z_F14_H,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   541
  Z_F15,Z_F15_H
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   542
);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   543
reg_class z_rscratch1_dbl_reg(Z_F1,Z_F1_H);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   544
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   545
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   546
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   547
//----------DEFINITION BLOCK---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   548
// Define 'name --> value' mappings to inform the ADLC of an integer valued name.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   549
// Current support includes integer values in the range [0, 0x7FFFFFFF].
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   550
// Format:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   551
//        int_def  <name>         (<int_value>, <expression>);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   552
// Generated Code in ad_<arch>.hpp
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   553
//        #define  <name>   (<expression>)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   554
//        // value == <int_value>
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   555
// Generated code in ad_<arch>.cpp adlc_verification()
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   556
//        assert(<name> == <int_value>, "Expect (<expression>) to equal <int_value>");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   557
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   558
definitions %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   559
  // The default cost (of an ALU instruction).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   560
  int_def DEFAULT_COST      (   100,     100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   561
  int_def DEFAULT_COST_LOW  (    80,      80);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   562
  int_def DEFAULT_COST_HIGH (   120,     120);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   563
  int_def HUGE_COST         (1000000, 1000000);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   564
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   565
  // Put an advantage on REG_MEM vs. MEM+REG_REG operations.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   566
  int_def ALU_REG_COST      (   100, DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   567
  int_def ALU_MEMORY_COST   (   150,          150);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   568
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   569
  // Memory refs are twice as expensive as run-of-the-mill.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   570
  int_def MEMORY_REF_COST_HI (   220, 2 * DEFAULT_COST+20);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   571
  int_def MEMORY_REF_COST    (   200, 2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   572
  int_def MEMORY_REF_COST_LO (   180, 2 * DEFAULT_COST-20);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   573
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   574
  // Branches are even more expensive.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   575
  int_def BRANCH_COST       (   300, DEFAULT_COST * 3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   576
  int_def CALL_COST         (   300, DEFAULT_COST * 3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   577
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   578
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   579
source %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   580
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   581
#ifdef PRODUCT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   582
#define BLOCK_COMMENT(str)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   583
#define BIND(label)        __ bind(label)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   584
#else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   585
#define BLOCK_COMMENT(str) __ block_comment(str)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   586
#define BIND(label)        __ bind(label); BLOCK_COMMENT(#label ":")
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   587
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   588
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   589
#define __ _masm.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   590
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   591
#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
   592
#define Z_DISP3_SIZE 6
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   593
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   594
// Tertiary op of a LoadP or StoreP encoding.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   595
#define REGP_OP true
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   596
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   597
// Given a register encoding, produce an Integer Register object.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   598
static Register reg_to_register_object(int register_encoding);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   599
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
// REQUIRED FUNCTIONALITY
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   603
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   604
// !!!!! Special hack to get all type of calls to specify the byte offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   605
//       from the start of the call to the point where the return address
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   606
//       will point.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   607
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   608
int MachCallStaticJavaNode::ret_addr_offset() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   609
  if (_method) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   610
    return 8;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   611
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   612
    return MacroAssembler::call_far_patchable_ret_addr_offset();
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 MachCallDynamicJavaNode::ret_addr_offset() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   617
  // Consider size of receiver type profiling (C2 tiers).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   618
  int profile_receiver_type_size = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   619
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   620
  int vtable_index = this->_vtable_index;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   621
  if (vtable_index == -4) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   622
    return 14 + profile_receiver_type_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   623
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   624
    assert(!UseInlineCaches, "expect vtable calls only if not using ICs");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   625
    return 36 + profile_receiver_type_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   626
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   627
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   628
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   629
int MachCallRuntimeNode::ret_addr_offset() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   630
  return 12 + MacroAssembler::call_far_patchable_ret_addr_offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   631
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   632
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   633
// Compute padding required for nodes which need alignment
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   634
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   635
// The addresses of the call instructions needs to be 4-byte aligned to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   636
// 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
   637
// The actual calls get emitted at different offsets within the node emitters.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   638
// 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
   639
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   640
int CallStaticJavaDirect_dynTOCNode::compute_padding(int current_offset) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   641
  return (0 - current_offset) & 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   642
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   643
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   644
int CallDynamicJavaDirect_dynTOCNode::compute_padding(int current_offset) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   645
  return (6 - current_offset) & 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   646
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   647
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   648
int CallRuntimeDirectNode::compute_padding(int current_offset) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   649
  return (12 - current_offset) & 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   650
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   651
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   652
int CallLeafDirectNode::compute_padding(int current_offset) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   653
  return (12 - current_offset) & 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   654
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   655
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   656
int CallLeafNoFPDirectNode::compute_padding(int current_offset) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   657
  return (12 - current_offset) & 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   658
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   659
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   660
// Indicate if the safepoint node needs the polling page as an input.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   661
// Since z/Architecture does not have absolute addressing, it does.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   662
bool SafePointNode::needs_polling_address_input() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   663
  return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   664
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   665
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   666
void emit_nop(CodeBuffer &cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   667
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   668
  __ z_nop();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   669
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   670
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   671
// Emit an interrupt that is caught by the debugger (for debugging compiler).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   672
void emit_break(CodeBuffer &cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   673
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   674
  __ z_illtrap();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   675
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   676
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   677
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   678
void MachBreakpointNode::format(PhaseRegAlloc *, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   679
  os->print("TA");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   680
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   681
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   682
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   683
void MachBreakpointNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   684
  emit_break(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   685
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   686
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   687
uint MachBreakpointNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   688
  return MachNode::size(ra_);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   689
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   690
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   691
static inline void z_emit16(CodeBuffer &cbuf, long value) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   692
  // 32bit instructions may become sign extended.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   693
  assert(value >= 0, "unintended sign extension (int->long)");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   694
  assert(value < (1L << 16), "instruction too large");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   695
  *((unsigned short*)(cbuf.insts_end())) = (unsigned short)value;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   696
  cbuf.set_insts_end(cbuf.insts_end() + sizeof(unsigned short));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   697
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   698
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   699
static inline void z_emit32(CodeBuffer &cbuf, long value) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   700
  // 32bit instructions may become sign extended.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   701
  assert(value < (1L << 32), "instruction too large");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   702
  *((unsigned int*)(cbuf.insts_end())) = (unsigned int)value;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   703
  cbuf.set_insts_end(cbuf.insts_end() + sizeof(unsigned int));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   704
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   705
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   706
static inline void z_emit48(CodeBuffer &cbuf, long value) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   707
  // 32bit instructions may become sign extended.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   708
  assert(value >= 0, "unintended sign extension (int->long)");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   709
  assert(value < (1L << 48), "instruction too large");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   710
  value = value<<16;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   711
  memcpy(cbuf.insts_end(), (unsigned char*)&value, 6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   712
  cbuf.set_insts_end(cbuf.insts_end() + 6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   713
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   714
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   715
static inline unsigned int z_emit_inst(CodeBuffer &cbuf, long value) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   716
  if (value < 0) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   717
    // There obviously has been an unintended sign extension (int->long). Revert it.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   718
    value = (long)((unsigned long)((unsigned int)value));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   719
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   720
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   721
  if (value < (1L << 16)) { // 2-byte instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   722
    z_emit16(cbuf, value);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   723
    return 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   724
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   725
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   726
  if (value < (1L << 32)) { // 4-byte instruction, might be unaligned store
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   727
    z_emit32(cbuf, value);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   728
    return 4;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   729
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   730
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   731
  // 6-byte instruction, probably unaligned store.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   732
  z_emit48(cbuf, value);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   733
  return 6;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   734
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   735
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   736
// Check effective address (at runtime) for required alignment.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   737
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
   738
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   739
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   740
  __ z_lay(Z_R0, disp, index, base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   741
  __ z_nill(Z_R0, alignment-1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   742
  __ z_brc(Assembler::bcondEqual, +3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   743
  __ z_illtrap();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   744
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   745
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   746
int emit_call_reloc(MacroAssembler &_masm, intptr_t entry_point, relocInfo::relocType rtype,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   747
                    PhaseRegAlloc* ra_, bool is_native_call = false) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   748
  __ 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
   749
  address old_mark = __ inst_mark();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   750
  unsigned int start_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   751
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   752
  if (is_native_call) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   753
    ShouldNotReachHere();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   754
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   755
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   756
  if (rtype == relocInfo::runtime_call_w_cp_type) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   757
    assert((__ offset() & 2) == 0, "misaligned emit_call_reloc");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   758
    address call_addr = __ call_c_opt((address)entry_point);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   759
    if (call_addr == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   760
      Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   761
      return -1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   762
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   763
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   764
    assert(rtype == relocInfo::none || rtype == relocInfo::opt_virtual_call_type ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   765
           rtype == relocInfo::static_call_type, "unexpected rtype");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   766
    __ relocate(rtype);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   767
    // BRASL must be prepended with a nop to identify it in the instruction stream.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   768
    __ z_nop();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   769
    __ z_brasl(Z_R14, (address)entry_point);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   770
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   771
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   772
  unsigned int ret_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   773
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   774
  return (ret_off - start_off);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   775
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   776
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   777
static int emit_call_reloc(MacroAssembler &_masm, intptr_t entry_point, RelocationHolder const& rspec) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   778
  __ 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
   779
  address old_mark = __ inst_mark();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   780
  unsigned int start_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   781
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   782
  relocInfo::relocType rtype = rspec.type();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   783
  assert(rtype == relocInfo::opt_virtual_call_type || rtype == relocInfo::static_call_type,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   784
         "unexpected rtype");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   785
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   786
  __ relocate(rspec);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   787
  __ z_nop();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   788
  __ z_brasl(Z_R14, (address)entry_point);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   789
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   790
  unsigned int ret_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   791
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   792
  return (ret_off - start_off);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   793
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   794
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   795
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   796
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   797
const RegMask& MachConstantBaseNode::_out_RegMask = _Z_PTR_REG_mask;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   798
int Compile::ConstantTable::calculate_table_base_offset() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   799
  return 0;  // absolute addressing, no offset
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
bool MachConstantBaseNode::requires_postalloc_expand() const { return false; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   803
void MachConstantBaseNode::postalloc_expand(GrowableArray <Node *> *nodes, PhaseRegAlloc *ra_) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   804
  ShouldNotReachHere();
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
// Even with PC-relative TOC addressing, we still need this node.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   808
// Float loads/stores do not support PC-relative addresses.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   809
void MachConstantBaseNode::emit(CodeBuffer& cbuf, PhaseRegAlloc* ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   810
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   811
  Register Rtoc = as_Register(ra_->get_encode(this));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   812
  __ load_toc(Rtoc);
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
uint MachConstantBaseNode::size(PhaseRegAlloc* ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   816
  // PCrelative TOC access.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   817
  return 6;   // sizeof(LARL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   818
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   819
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   820
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   821
void MachConstantBaseNode::format(PhaseRegAlloc* ra_, outputStream* st) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   822
  Register r = as_Register(ra_->get_encode(this));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   823
  st->print("LARL    %s,&constant_pool # MachConstantBaseNode", r->name());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   824
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   825
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   826
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   827
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   828
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   829
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   830
void MachPrologNode::format(PhaseRegAlloc *ra_, outputStream *st) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   831
  Compile* C = ra_->C;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   832
  st->print_cr("--- MachPrologNode ---");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   833
  st->print("\t");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   834
  for (int i = 0; i < OptoPrologueNops; i++) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   835
    st->print_cr("NOP"); st->print("\t");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   836
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   837
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   838
  if (VerifyThread) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   839
    st->print_cr("Verify_Thread");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   840
    st->print("\t");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   841
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   842
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   843
  long framesize = C->frame_size_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   844
  int bangsize   = C->bang_size_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   845
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   846
  // Calls to C2R adapters often do not accept exceptional returns.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   847
  // We require that their callers must bang for them. But be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   848
  // careful, because some VM calls (such as call site linkage) can
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   849
  // use several kilobytes of stack. But the stack safety zone should
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   850
  // account for that. See bugs 4446381, 4468289, 4497237.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   851
  if (C->need_stack_bang(bangsize) && UseStackBanging) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   852
    st->print_cr("# stack bang"); st->print("\t");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   853
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   854
  st->print_cr("push_frame %d", (int)-framesize);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   855
  st->print("\t");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   856
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   857
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   858
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   859
void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   860
  Compile* C = ra_->C;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   861
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   862
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   863
  __ verify_thread();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   864
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   865
  size_t framesize = C->frame_size_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   866
  size_t bangsize  = C->bang_size_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   867
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   868
  assert(framesize % wordSize == 0, "must preserve wordSize alignment");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   869
55343
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   870
  if (C->clinit_barrier_on_entry()) {
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   871
    assert(!C->method()->holder()->is_not_initialized(), "initialization should have been started");
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   872
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   873
    Label L_skip_barrier;
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   874
    Register klass = Z_R1_scratch;
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   875
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   876
    // Notify OOP recorder (don't need the relocation)
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   877
    AddressLiteral md = __ constant_metadata_address(C->method()->holder()->constant_encoding());
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   878
    __ load_const_optimized(klass, md.value());
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   879
    __ clinit_barrier(klass, Z_thread, &L_skip_barrier /*L_fast_path*/);
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   880
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   881
    __ load_const_optimized(klass, SharedRuntime::get_handle_wrong_method_stub());
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   882
    __ z_br(klass);
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   883
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   884
    __ bind(L_skip_barrier);
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   885
  }
03d417fd7d9a 8224827: Implement fast class initialization checks on s390
mdoerr
parents: 54960
diff changeset
   886
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   887
  // Calls to C2R adapters often do not accept exceptional returns.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   888
  // We require that their callers must bang for them. But be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   889
  // careful, because some VM calls (such as call site linkage) can
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   890
  // use several kilobytes of stack. But the stack safety zone should
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   891
  // account for that. See bugs 4446381, 4468289, 4497237.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   892
  if (C->need_stack_bang(bangsize) && UseStackBanging) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   893
    __ generate_stack_overflow_check(bangsize);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   894
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   895
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   896
  assert(Immediate::is_uimm32((long)framesize), "to do: choose suitable types!");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   897
  __ save_return_pc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   898
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   899
  // The z/Architecture abi is already accounted for in `framesize' via the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   900
  // 'out_preserve_stack_slots' declaration.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   901
  __ push_frame((unsigned int)framesize/*includes JIT ABI*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   902
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   903
  if (C->has_mach_constant_base_node()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   904
    // NOTE: We set the table base offset here because users might be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   905
    // emitted before MachConstantBaseNode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   906
    Compile::ConstantTable& constant_table = C->constant_table();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   907
    constant_table.set_table_base_offset(constant_table.calculate_table_base_offset());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   908
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   909
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   910
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   911
uint MachPrologNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   912
  // Variable size. Determine dynamically.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   913
  return MachNode::size(ra_);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   914
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   915
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   916
int MachPrologNode::reloc() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   917
  // Return number of relocatable values contained in this instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   918
  return 1; // One reloc entry for load_const(toc).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   919
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   920
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   921
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   922
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   923
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   924
void MachEpilogNode::format(PhaseRegAlloc *ra_, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   925
  os->print_cr("epilog");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   926
  os->print("\t");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   927
  if (do_polling() && ra_->C->is_method_compilation()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   928
    os->print_cr("load_from_polling_page Z_R1_scratch");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   929
    os->print("\t");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   930
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   931
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   932
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   933
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   934
void MachEpilogNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   935
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   936
  Compile* C = ra_->C;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   937
  __ verify_thread();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   938
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   939
  // If this does safepoint polling, then do it here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   940
  bool need_polling = do_polling() && C->is_method_compilation();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   941
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   942
  // Pop frame, restore return_pc, and all stuff needed by interpreter.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   943
  int frame_size_in_bytes = Assembler::align((C->frame_slots() << LogBytesPerInt), frame::alignment_in_bytes);
46726
7801367e3cc9 8180659: [s390] micro-optimization in resize_frame_absolute()
lucy
parents: 46378
diff changeset
   944
  __ pop_frame_restore_retPC(frame_size_in_bytes);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   945
43420
a056d6465ef9 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
goetz
parents: 42897
diff changeset
   946
  if (StackReservedPages > 0 && C->has_reserved_stack_access()) {
a056d6465ef9 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
goetz
parents: 42897
diff changeset
   947
    __ reserved_stack_check(Z_R14);
a056d6465ef9 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
goetz
parents: 42897
diff changeset
   948
  }
a056d6465ef9 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
goetz
parents: 42897
diff changeset
   949
a056d6465ef9 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
goetz
parents: 42897
diff changeset
   950
  // Touch the polling page.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   951
  if (need_polling) {
48332
651a95f30dfb 8193257: PPC64, s390 implementation for Thread-local handshakes
mdoerr
parents: 48094
diff changeset
   952
    if (SafepointMechanism::uses_thread_local_poll()) {
651a95f30dfb 8193257: PPC64, s390 implementation for Thread-local handshakes
mdoerr
parents: 48094
diff changeset
   953
      __ z_lg(Z_R1_scratch, Address(Z_thread, Thread::polling_page_offset()));
651a95f30dfb 8193257: PPC64, s390 implementation for Thread-local handshakes
mdoerr
parents: 48094
diff changeset
   954
    } else {
651a95f30dfb 8193257: PPC64, s390 implementation for Thread-local handshakes
mdoerr
parents: 48094
diff changeset
   955
      AddressLiteral pp(os::get_polling_page());
651a95f30dfb 8193257: PPC64, s390 implementation for Thread-local handshakes
mdoerr
parents: 48094
diff changeset
   956
      __ load_const_optimized(Z_R1_scratch, pp);
651a95f30dfb 8193257: PPC64, s390 implementation for Thread-local handshakes
mdoerr
parents: 48094
diff changeset
   957
    }
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   958
    // We need to mark the code position where the load from the safepoint
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   959
    // polling page was emitted as relocInfo::poll_return_type here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   960
    __ relocate(relocInfo::poll_return_type);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   961
    __ load_from_polling_page(Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   962
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   963
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   964
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   965
uint MachEpilogNode::size(PhaseRegAlloc *ra_) const {
43420
a056d6465ef9 8172049: [s390] Implement "JEP 270: Reserved Stack Areas for Critical Sections".
goetz
parents: 42897
diff changeset
   966
  // Variable size. determine dynamically.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   967
  return MachNode::size(ra_);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   968
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   969
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   970
int MachEpilogNode::reloc() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   971
  // Return number of relocatable values contained in this instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   972
  return 1; // One for load_from_polling_page.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   973
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   974
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   975
const Pipeline * MachEpilogNode::pipeline() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   976
  return MachNode::pipeline_class();
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
int MachEpilogNode::safepoint_offset() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   980
  assert(do_polling(), "no return for this epilog node");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   981
  return 0;
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
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   985
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   986
// Figure out which register class each belongs in: rc_int, rc_float, rc_stack.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   987
enum RC { rc_bad, rc_int, rc_float, rc_stack };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   988
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   989
static enum RC rc_class(OptoReg::Name reg) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   990
  // Return the register class for the given register. The given register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   991
  // reg is a <register>_num value, which is an index into the MachRegisterNumbers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   992
  // enumeration in adGlobals_s390.hpp.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   993
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   994
  if (reg == OptoReg::Bad) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   995
    return rc_bad;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   996
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   997
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   998
  // We have 32 integer register halves, starting at index 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   999
  if (reg < 32) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1000
    return rc_int;
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
  // We have 32 floating-point register halves, starting at index 32.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1004
  if (reg < 32+32) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1005
    return rc_float;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1006
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1007
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1008
  // Between float regs & stack are the flags regs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1009
  assert(reg >= OptoReg::stack0(), "blow up if spilling flags");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1010
  return rc_stack;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1011
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1012
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1013
// Returns size as obtained from z_emit_instr.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1014
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
  1015
                                   int reg, int offset, bool do_print, outputStream *os) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1016
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1017
  if (cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1018
    if (opcode > (1L<<32)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1019
      return z_emit_inst(*cbuf, opcode | Assembler::reg(Matcher::_regEncode[reg], 8, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1020
                         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
  1021
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1022
      return z_emit_inst(*cbuf, opcode | Assembler::reg(Matcher::_regEncode[reg], 8, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1023
                         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
  1024
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1025
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1026
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1027
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1028
  if (do_print) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1029
    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
  1030
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1031
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1032
  return (opcode > (1L << 32)) ? 6 : 4;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1033
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1034
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1035
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
  1036
  if (cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1037
    MacroAssembler _masm(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1038
    __ z_mvc(dst_off, len-1, Z_SP, src_off, Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1039
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1040
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1041
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1042
  else if (do_print) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1043
    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
  1044
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1045
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1046
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1047
  return 6;
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
uint MachSpillCopyNode::implementation(CodeBuffer *cbuf, PhaseRegAlloc *ra_, bool do_size, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1051
  // Get registers to move.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1052
  OptoReg::Name src_hi = ra_->get_reg_second(in(1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1053
  OptoReg::Name src_lo = ra_->get_reg_first(in(1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1054
  OptoReg::Name dst_hi = ra_->get_reg_second(this);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1055
  OptoReg::Name dst_lo = ra_->get_reg_first(this);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1056
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1057
  enum RC src_hi_rc = rc_class(src_hi);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1058
  enum RC src_lo_rc = rc_class(src_lo);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1059
  enum RC dst_hi_rc = rc_class(dst_hi);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1060
  enum RC dst_lo_rc = rc_class(dst_lo);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1061
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1062
  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
  1063
  bool is64 = (src_hi_rc != rc_bad);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1064
  assert(!is64 ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1065
         ((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
  1066
         "expected aligned-adjacent pairs");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1067
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1068
  // Generate spill code!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1069
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1070
  if (src_lo == dst_lo && src_hi == dst_hi) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1071
    return 0;            // Self copy, no move.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1072
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1073
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1074
  int  src_offset = ra_->reg2offset(src_lo);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1075
  int  dst_offset = ra_->reg2offset(dst_lo);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1076
  bool print = !do_size;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1077
  bool src12 = Immediate::is_uimm12(src_offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1078
  bool dst12 = Immediate::is_uimm12(dst_offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1079
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1080
  const char   *mnemo = NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1081
  unsigned long opc = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1082
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1083
  // Memory->Memory Spill. Use Z_R0 to hold the value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1084
  if (src_lo_rc == rc_stack && dst_lo_rc == rc_stack) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1085
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1086
    assert(!is64 || (src_hi_rc==rc_stack && dst_hi_rc==rc_stack),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1087
           "expected same type of move for high parts");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1088
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1089
    if (src12 && dst12) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1090
      return z_mvc_helper(cbuf, is64 ? 8 : 4, dst_offset, src_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1091
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1092
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1093
    int r0 = Z_R0_num;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1094
    if (is64) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1095
      return z_ld_st_helper(cbuf, "LG  ", LG_ZOPC, r0, src_offset, print, os) +
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1096
             z_ld_st_helper(cbuf, "STG ", STG_ZOPC, r0, dst_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1097
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1098
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1099
    return z_ld_st_helper(cbuf, "LY   ", LY_ZOPC, r0, src_offset, print, os) +
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1100
           z_ld_st_helper(cbuf, "STY  ", STY_ZOPC, r0, dst_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1101
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1102
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1103
  // Check for float->int copy. Requires a trip through memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1104
  if (src_lo_rc == rc_float && dst_lo_rc == rc_int) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1105
    Unimplemented();  // Unsafe, do not remove!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1106
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1107
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1108
  // Check for integer reg-reg copy.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1109
  if (src_lo_rc == rc_int && dst_lo_rc == rc_int) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1110
    if (cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1111
      MacroAssembler _masm(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1112
      Register Rsrc = as_Register(Matcher::_regEncode[src_lo]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1113
      Register Rdst = as_Register(Matcher::_regEncode[dst_lo]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1114
      __ z_lgr(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1115
      return 4;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1116
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1117
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1118
    // else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1119
    if (print) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1120
      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
  1121
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1122
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1123
    return 4;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1124
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1125
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1126
  // Check for integer store.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1127
  if (src_lo_rc == rc_int && dst_lo_rc == rc_stack) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1128
    assert(!is64 || (src_hi_rc==rc_int && dst_hi_rc==rc_stack),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1129
           "expected same type of move for high parts");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1130
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1131
    if (is64) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1132
      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
  1133
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1134
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1135
    // else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1136
    mnemo = dst12 ? "ST  " : "STY ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1137
    opc = dst12 ? ST_ZOPC : STY_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1138
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1139
    return z_ld_st_helper(cbuf, mnemo, opc, src_lo, dst_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1140
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1141
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1142
  // Check for integer load
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1143
  // Always load cOops zero-extended. That doesn't hurt int loads.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1144
  if (dst_lo_rc == rc_int && src_lo_rc == rc_stack) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1145
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1146
    assert(!is64 || (dst_hi_rc==rc_int && src_hi_rc==rc_stack),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1147
           "expected same type of move for high parts");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1148
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1149
    mnemo = is64 ? "LG  " : "LLGF";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1150
    opc = is64 ? LG_ZOPC : LLGF_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1151
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1152
    return z_ld_st_helper(cbuf, mnemo, opc, dst_lo, src_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1153
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1154
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1155
  // Check for float reg-reg copy.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1156
  if (src_lo_rc == rc_float && dst_lo_rc == rc_float) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1157
    if (cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1158
      MacroAssembler _masm(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1159
      FloatRegister Rsrc = as_FloatRegister(Matcher::_regEncode[src_lo]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1160
      FloatRegister Rdst = as_FloatRegister(Matcher::_regEncode[dst_lo]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1161
      __ z_ldr(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1162
      return 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1163
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1164
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1165
    // else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1166
    if (print) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1167
      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
  1168
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1169
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1170
    return 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1171
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1172
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1173
  // Check for float store.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1174
  if (src_lo_rc == rc_float && dst_lo_rc == rc_stack) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1175
    assert(!is64 || (src_hi_rc==rc_float && dst_hi_rc==rc_stack),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1176
           "expected same type of move for high parts");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1177
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1178
    if (is64) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1179
      mnemo = dst12 ? "STD  " : "STDY ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1180
      opc = dst12 ? STD_ZOPC : STDY_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1181
      return z_ld_st_helper(cbuf, mnemo, opc, src_lo, dst_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1182
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1183
    // else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1184
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1185
    mnemo = dst12 ? "STE  " : "STEY ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1186
    opc = dst12 ? STE_ZOPC : STEY_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1187
    return z_ld_st_helper(cbuf, mnemo, opc, src_lo, dst_offset, print, os);
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
  // Check for float load.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1191
  if (dst_lo_rc == rc_float && src_lo_rc == rc_stack) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1192
    assert(!is64 || (dst_hi_rc==rc_float && src_hi_rc==rc_stack),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1193
           "expected same type of move for high parts");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1194
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1195
    if (is64) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1196
      mnemo = src12 ? "LD   " : "LDY  ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1197
      opc = src12 ? LD_ZOPC : LDY_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1198
      return z_ld_st_helper(cbuf, mnemo, opc, dst_lo, src_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1199
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1200
    // else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1201
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1202
    mnemo = src12 ? "LE   " : "LEY  ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1203
    opc = src12 ? LE_ZOPC : LEY_ZOPC;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1204
    return z_ld_st_helper(cbuf, mnemo, opc, dst_lo, src_offset, print, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1205
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1206
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1207
  // --------------------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1208
  // Check for hi bits still needing moving. Only happens for misaligned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1209
  // arguments to native calls.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1210
  if (src_hi == dst_hi) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1211
    return 0;               // Self copy, no move.
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
  assert(is64 && dst_hi_rc != rc_bad, "src_hi & dst_hi cannot be Bad");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1215
  Unimplemented();  // Unsafe, do not remove!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1216
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1217
  return 0; // never reached, but make the compiler shut up!
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
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1221
void MachSpillCopyNode::format(PhaseRegAlloc *ra_, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1222
  if (ra_ && ra_->node_regs_max_index() > 0) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1223
    implementation(NULL, ra_, false, os);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1224
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1225
    if (req() == 2 && in(1)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1226
      os->print("N%d = N%d\n", _idx, in(1)->_idx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1227
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1228
      const char *c = "(";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1229
      os->print("N%d = ", _idx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1230
      for (uint i = 1; i < req(); ++i) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1231
        os->print("%sN%d", c, in(i)->_idx);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1232
        c = ", ";
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1233
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1234
      os->print(")");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1235
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1236
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1237
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1238
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1239
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1240
void MachSpillCopyNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1241
  implementation(&cbuf, ra_, false, NULL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1242
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1243
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1244
uint MachSpillCopyNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1245
  return implementation(NULL, ra_, true, NULL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1246
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1247
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1248
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1249
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1250
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1251
void MachNopNode::format(PhaseRegAlloc *, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1252
  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
  1253
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1254
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1255
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1256
void MachNopNode::emit(CodeBuffer &cbuf, PhaseRegAlloc * ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1257
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1258
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1259
  int rem_space = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1260
  if (!(ra_->C->in_scratch_emit_size())) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1261
    rem_space = cbuf.insts()->remaining();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1262
    if (rem_space <= _count*2 + 8) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1263
      tty->print("NopNode: _count = %3.3d, remaining space before = %d", _count, rem_space);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1264
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1265
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1266
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1267
  for (int i = 0; i < _count; i++) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1268
    __ z_nop();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1269
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1270
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1271
  if (!(ra_->C->in_scratch_emit_size())) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1272
    if (rem_space <= _count*2 + 8) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1273
      int rem_space2 = cbuf.insts()->remaining();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1274
      tty->print_cr(", after = %d", rem_space2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1275
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1276
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1277
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1278
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1279
uint MachNopNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1280
   return 2 * _count;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1281
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1282
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1283
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1284
void BoxLockNode::format(PhaseRegAlloc *ra_, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1285
  int offset = ra_->reg2offset(in_RegMask(0).find_first_elem());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1286
  if (ra_ && ra_->node_regs_max_index() > 0) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1287
    int reg = ra_->get_reg_first(this);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1288
    os->print("ADDHI  %s, SP, %d\t//box node", Matcher::regName[reg], offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1289
  } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1290
    os->print("ADDHI  N%d = SP + %d\t// box node", _idx, offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1291
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1292
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1293
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1294
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1295
// Take care of the size function, if you make changes here!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1296
void BoxLockNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1297
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1298
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1299
  int offset = ra_->reg2offset(in_RegMask(0).find_first_elem());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1300
  int reg = ra_->get_encode(this);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1301
  __ z_lay(as_Register(reg), offset, Z_SP);
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
uint BoxLockNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1305
  // BoxLockNode is not a MachNode, so we can't just call MachNode::size(ra_)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1306
  return 6;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1307
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1308
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1309
 %} // end source section
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1310
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1311
//----------SOURCE BLOCK-------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1312
// This is a block of C++ code which provides values, functions, and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1313
// definitions necessary in the rest of the architecture description
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1314
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1315
source_hpp %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1316
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1317
// Header information of the source block.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1318
// Method declarations/definitions which are used outside
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1319
// the ad-scope can conveniently be defined here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1320
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1321
// To keep related declarations/definitions/uses close together,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1322
// we switch between source %{ }% and source_hpp %{ }% freely as needed.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1323
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1324
//--------------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1325
// Used for optimization in Compile::Shorten_branches
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1326
//--------------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1327
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1328
class CallStubImpl {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1329
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1330
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1331
  // call trampolines
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1332
  // Size of call trampoline stub. For add'l comments, see size_java_to_interp().
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1333
  static uint size_call_trampoline() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1334
    return 0; // no call trampolines on this platform
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1335
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1336
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1337
  // call trampolines
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1338
  // Number of relocations needed by a call trampoline stub.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1339
  static uint reloc_call_trampoline() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1340
    return 0; // No call trampolines on this platform.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1341
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1342
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1343
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1344
%} // end source_hpp section
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1345
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1346
source %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1347
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1348
#if !defined(PRODUCT)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1349
void MachUEPNode::format(PhaseRegAlloc *ra_, outputStream *os) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1350
  os->print_cr("---- MachUEPNode ----");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1351
  os->print_cr("\tTA");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1352
  os->print_cr("\tload_const Z_R1, SharedRuntime::get_ic_miss_stub()");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1353
  os->print_cr("\tBR(Z_R1)");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1354
  os->print_cr("\tTA  # pad with illtraps");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1355
  os->print_cr("\t...");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1356
  os->print_cr("\tTA");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1357
  os->print_cr("\tLTGR    Z_R2, Z_R2");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1358
  os->print_cr("\tBRU     ic_miss");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1359
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1360
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1361
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1362
void MachUEPNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1363
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1364
  const int ic_miss_offset = 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1365
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1366
  // Inline_cache contains a klass.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1367
  Register ic_klass = as_Register(Matcher::inline_cache_reg_encode());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1368
  // ARG1 is the receiver oop.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1369
  Register R2_receiver = Z_ARG1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1370
  int      klass_offset = oopDesc::klass_offset_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1371
  AddressLiteral icmiss(SharedRuntime::get_ic_miss_stub());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1372
  Register R1_ic_miss_stub_addr = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1373
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1374
  // Null check of receiver.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1375
  // This is the null check of the receiver that actually should be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1376
  // done in the caller. It's here because in case of implicit null
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1377
  // checks we get it for free.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1378
  assert(!MacroAssembler::needs_explicit_null_check(oopDesc::klass_offset_in_bytes()),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1379
         "second word in oop should not require explicit null check.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1380
  if (!ImplicitNullChecks) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1381
    Label valid;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1382
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1383
      __ z_cgij(R2_receiver, 0, Assembler::bcondNotEqual, valid);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1384
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1385
      __ z_ltgr(R2_receiver, R2_receiver);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1386
      __ z_bre(valid);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1387
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1388
    // The ic_miss_stub will handle the null pointer exception.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1389
    __ load_const_optimized(R1_ic_miss_stub_addr, icmiss);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1390
    __ z_br(R1_ic_miss_stub_addr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1391
    __ bind(valid);
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
  // Check whether this method is the proper implementation for the class of
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1395
  // the receiver (ic miss check).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1396
  {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1397
    Label valid;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1398
    // Compare cached class against klass from receiver.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1399
    // This also does an implicit null check!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1400
    __ compare_klass_ptr(ic_klass, klass_offset, R2_receiver, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1401
    __ z_bre(valid);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1402
    // The inline cache points to the wrong method. Call the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1403
    // ic_miss_stub to find the proper method.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1404
    __ load_const_optimized(R1_ic_miss_stub_addr, icmiss);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1405
    __ z_br(R1_ic_miss_stub_addr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1406
    __ bind(valid);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1407
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1408
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1409
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1410
uint MachUEPNode::size(PhaseRegAlloc *ra_) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1411
  // Determine size dynamically.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1412
  return MachNode::size(ra_);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1413
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1414
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1415
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1416
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1417
%} // interrupt source section
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1418
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1419
source_hpp %{ // Header information of the source block.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1420
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1421
class HandlerImpl {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1422
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1423
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1424
  static int emit_exception_handler(CodeBuffer &cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1425
  static int emit_deopt_handler(CodeBuffer& cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1426
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1427
  static uint size_exception_handler() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1428
    return NativeJump::max_instruction_size();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1429
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1430
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1431
  static uint size_deopt_handler() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1432
    return NativeCall::max_instruction_size();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1433
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1434
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1435
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1436
%} // end source_hpp section
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1437
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1438
source %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1439
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1440
// This exception handler code snippet is placed after the method's
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1441
// code. It is the return point if an exception occurred. it jumps to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1442
// the exception blob.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1443
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1444
// If the method gets deoptimized, the method and this code snippet
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1445
// get patched.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1446
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1447
// 1) Trampoline code gets patched into the end of this exception
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1448
//   handler. the trampoline code jumps to the deoptimization blob.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1449
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1450
// 2) The return address in the method's code will get patched such
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1451
//   that it jumps to the trampoline.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1452
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1453
// 3) The handler will get patched such that it does not jump to the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1454
//   exception blob, but to an entry in the deoptimization blob being
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1455
//   aware of the exception.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1456
int HandlerImpl::emit_exception_handler(CodeBuffer &cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1457
  Register temp_reg = Z_R1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1458
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1459
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1460
  address base = __ start_a_stub(size_exception_handler());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1461
  if (base == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1462
    return 0;          // CodeBuffer::expand failed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1463
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1464
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1465
  int offset = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1466
  // Use unconditional pc-relative jump with 32-bit range here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1467
  __ load_const_optimized(temp_reg, (address)OptoRuntime::exception_blob()->content_begin());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1468
  __ z_br(temp_reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1469
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1470
  assert(__ offset() - offset <= (int) size_exception_handler(), "overflow");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1471
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1472
  __ end_a_stub();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1473
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1474
  return offset;
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
// Emit deopt handler code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1478
int HandlerImpl::emit_deopt_handler(CodeBuffer& cbuf) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1479
  MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1480
  address        base = __ start_a_stub(size_deopt_handler());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1481
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1482
  if (base == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1483
    return 0;  // CodeBuffer::expand failed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1484
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1485
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1486
  int offset = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1487
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1488
  // Size_deopt_handler() must be exact on zarch, so for simplicity
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1489
  // we do not use load_const_opt here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1490
  __ load_const(Z_R1, SharedRuntime::deopt_blob()->unpack());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1491
  __ call(Z_R1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1492
  assert(__ offset() - offset == (int) size_deopt_handler(), "must be fixed size");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1493
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1494
  __ end_a_stub();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1495
  return offset;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1496
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1497
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1498
//=============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1499
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1500
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1501
// Given a register encoding, produce an Integer Register object.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1502
static Register reg_to_register_object(int register_encoding) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1503
  assert(Z_R12->encoding() == Z_R12_enc, "wrong coding");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1504
  return as_Register(register_encoding);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1505
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1506
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1507
const bool Matcher::match_rule_supported(int opcode) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1508
  if (!has_match_rule(opcode)) return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1509
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1510
  switch (opcode) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1511
    case Op_CountLeadingZerosI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1512
    case Op_CountLeadingZerosL:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1513
    case Op_CountTrailingZerosI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1514
    case Op_CountTrailingZerosL:
42556
c03d98321ad1 8169317: [s390] Various minor bug fixes and adaptions.
goetz
parents: 42065
diff changeset
  1515
      // Implementation requires FLOGR instruction, which is available since z9.
c03d98321ad1 8169317: [s390] Various minor bug fixes and adaptions.
goetz
parents: 42065
diff changeset
  1516
      return true;
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1517
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1518
    case Op_ReverseBytesI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1519
    case Op_ReverseBytesL:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1520
      return UseByteReverseInstruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1521
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1522
    // PopCount supported by H/W from z/Architecture G5 (z196) on.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1523
    case Op_PopCountI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1524
    case Op_PopCountL:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1525
      return UsePopCountInstruction && VM_Version::has_PopCount();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1526
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1527
    case Op_StrComp:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1528
      return SpecialStringCompareTo;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1529
    case Op_StrEquals:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1530
      return SpecialStringEquals;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1531
    case Op_StrIndexOf:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1532
    case Op_StrIndexOfChar:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1533
      return SpecialStringIndexOf;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1534
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1535
    case Op_GetAndAddI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1536
    case Op_GetAndAddL:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1537
      return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1538
      // return VM_Version::has_AtomicMemWithImmALUOps();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1539
    case Op_GetAndSetI:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1540
    case Op_GetAndSetL:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1541
    case Op_GetAndSetP:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1542
    case Op_GetAndSetN:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1543
      return true;  // General CAS implementation, always available.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1544
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1545
    default:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1546
      return true;  // Per default match rules are supported.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1547
                    // BUT: make sure match rule is not disabled by a false predicate!
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
  return true;  // Per default match rules are supported.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1551
                // BUT: make sure match rule is not disabled by a false predicate!
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::match_rule_supported_vector(int opcode, int vlen) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1555
  // TODO
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1556
  // Identify extra cases that we might want to provide match rules for
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1557
  // e.g. Op_ vector nodes and other intrinsics while guarding with vlen.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1558
  bool ret_value = match_rule_supported(opcode);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1559
  // Add rules here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1560
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1561
  return ret_value;  // Per default match rules are supported.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1562
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1563
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1564
int Matcher::regnum_to_fpu_offset(int regnum) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1565
  ShouldNotReachHere();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1566
  return regnum - 32; // The FP registers are in the second chunk.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1567
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1568
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1569
const bool Matcher::has_predicated_vectors(void) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1570
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1571
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1572
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1573
const int Matcher::float_pressure(int default_pressure_threshold) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1574
  return default_pressure_threshold;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1575
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1576
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1577
const bool Matcher::convL2FSupported(void) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1578
  return true; // False means that conversion is done by runtime call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1579
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1580
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1581
//----------SUPERWORD HELPERS----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1582
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1583
// Vector width in bytes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1584
const int Matcher::vector_width_in_bytes(BasicType bt) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1585
  assert(MaxVectorSize == 8, "");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1586
  return 8;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1587
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1588
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1589
// Vector ideal reg.
46378
4ccca1fdf627 8160748: Inconsistent types for ideal_reg
kbarrett
parents: 46289
diff changeset
  1590
const uint Matcher::vector_ideal_reg(int size) {
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1591
  assert(MaxVectorSize == 8 && size == 8, "");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1592
  return Op_RegL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1593
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1594
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1595
// Limits on vector size (number of elements) loaded into vector.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1596
const int Matcher::max_vector_size(const BasicType bt) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1597
  assert(is_java_primitive(bt), "only primitive type vectors");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1598
  return vector_width_in_bytes(bt)/type2aelembytes(bt);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1599
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1600
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1601
const int Matcher::min_vector_size(const BasicType bt) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1602
  return max_vector_size(bt); // Same as max.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1603
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1604
46378
4ccca1fdf627 8160748: Inconsistent types for ideal_reg
kbarrett
parents: 46289
diff changeset
  1605
const uint Matcher::vector_shift_count_ideal_reg(int size) {
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1606
  fatal("vector shift is not supported");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1607
  return Node::NotAMachineReg;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1608
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1609
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1610
// z/Architecture does support misaligned store/load at minimal extra cost.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1611
const bool Matcher::misaligned_vectors_ok() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1612
  return true;
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
// Not yet ported to z/Architecture.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1616
const bool Matcher::pass_original_key_for_aes() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1617
  return false;
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
// RETURNS: whether this branch offset is short enough that a short
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1621
// branch can be used.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1622
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1623
// If the platform does not provide any short branch variants, then
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1624
// this method should return `false' for offset 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1625
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1626
// `Compile::Fill_buffer' will decide on basis of this information
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1627
// whether to do the pass `Compile::Shorten_branches' at all.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1628
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1629
// And `Compile::Shorten_branches' will decide on basis of this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1630
// information whether to replace particular branch sites by short
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1631
// ones.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1632
bool Matcher::is_short_branch_offset(int rule, int br_size, int offset) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1633
  // On zarch short branches use a 16 bit signed immediate that
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1634
  // is the pc-relative offset in halfword (= 2 bytes) units.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1635
  return Assembler::is_within_range_of_RelAddr16((address)((long)offset), (address)0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1636
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1637
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1638
const bool Matcher::isSimpleConstant64(jlong value) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1639
  // Probably always true, even if a temp register is required.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1640
  return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1641
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1642
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1643
// Should correspond to setting above
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1644
const bool Matcher::init_array_count_is_in_bytes = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1645
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1646
// 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
  1647
const int Matcher::long_cmove_cost() { return ConditionalMoveLimit; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1648
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1649
// 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
  1650
const int Matcher::float_cmove_cost() { return ConditionalMoveLimit; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1651
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1652
// Does the CPU require postalloc expand (see block.cpp for description of postalloc expand)?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1653
const bool Matcher::require_postalloc_expand = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1654
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1655
// Do we need to mask the count passed to shift instructions or does
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1656
// the cpu only look at the lower 5/6 bits anyway?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1657
// 32bit shifts mask in emitter, 64bit shifts need no mask.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1658
// Constant shift counts are handled in Ideal phase.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1659
const bool Matcher::need_masked_shift_count = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1660
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1661
// Set this as clone_shift_expressions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1662
bool Matcher::narrow_oop_use_complex_address() {
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  1663
  if (CompressedOops::base() == NULL && CompressedOops::shift() == 0) return true;
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1664
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1665
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1666
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1667
bool Matcher::narrow_klass_use_complex_address() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1668
  NOT_LP64(ShouldNotCallThis());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1669
  assert(UseCompressedClassPointers, "only for compressed klass code");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1670
  // TODO HS25: z port if (MatchDecodeNodes) return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1671
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1672
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1673
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1674
bool Matcher::const_oop_prefer_decode() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1675
  // Prefer ConN+DecodeN over ConP in simple compressed oops mode.
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  1676
  return CompressedOops::base() == NULL;
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1677
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1678
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1679
bool Matcher::const_klass_prefer_decode() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1680
  // Prefer ConNKlass+DecodeNKlass over ConP in simple compressed klass mode.
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  1681
  return CompressedKlassPointers::base() == NULL;
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1682
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1683
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1684
// Is it better to copy float constants, or load them directly from memory?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1685
// Most RISCs will have to materialize an address into a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1686
// register first, so they would do better to copy the constant from stack.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1687
const bool Matcher::rematerialize_float_constants = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1688
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1689
// If CPU can load and store mis-aligned doubles directly then no fixup is
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1690
// needed. Else we split the double into 2 integer pieces and move it
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1691
// piece-by-piece. Only happens when passing doubles into C code as the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1692
// Java calling convention forces doubles to be aligned.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1693
const bool Matcher::misaligned_doubles_ok = true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1694
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1695
// Advertise here if the CPU requires explicit rounding operations
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1696
// to implement the UseStrictFP mode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1697
const bool Matcher::strict_fp_requires_explicit_rounding = false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1698
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1699
// Do floats take an entire double register or just half?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1700
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1701
// A float in resides in a zarch double register. When storing it by
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1702
// 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
  1703
// and casting it into a float afterwards.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1704
bool Matcher::float_in_double() { return false; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1705
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1706
// Do ints take an entire long register or just half?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1707
// The relevant question is how the int is callee-saved:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1708
// the whole long is written but de-opt'ing will have to extract
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1709
// the relevant 32 bits.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1710
const bool Matcher::int_in_long = true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1711
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1712
// Constants for c2c and c calling conventions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1713
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1714
const MachRegisterNumbers z_iarg_reg[5] = {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1715
  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
  1716
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1717
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1718
const MachRegisterNumbers z_farg_reg[4] = {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1719
  Z_F0_num, Z_F2_num, Z_F4_num, Z_F6_num
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1720
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1721
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1722
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
  1723
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1724
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
  1725
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1726
// Return whether or not this register is ever used as an argument. This
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1727
// function is used on startup to build the trampoline stubs in generateOptoStub.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1728
// Registers not mentioned will be killed by the VM call in the trampoline, and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1729
// arguments in those registers not be available to the callee.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1730
bool Matcher::can_be_java_arg(int reg) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1731
  // We return true for all registers contained in z_iarg_reg[] and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1732
  // z_farg_reg[] and their virtual halves.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1733
  // We must include the virtual halves in order to get STDs and LDs
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1734
  // instead of STWs and LWs in the trampoline stubs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1735
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1736
  if (reg == Z_R2_num || reg == Z_R2_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1737
      reg == Z_R3_num || reg == Z_R3_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1738
      reg == Z_R4_num || reg == Z_R4_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1739
      reg == Z_R5_num || reg == Z_R5_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1740
      reg == Z_R6_num || reg == Z_R6_H_num) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1741
    return true;
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
  if (reg == Z_F0_num || reg == Z_F0_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1745
      reg == Z_F2_num || reg == Z_F2_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1746
      reg == Z_F4_num || reg == Z_F4_H_num ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1747
      reg == Z_F6_num || reg == Z_F6_H_num) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1748
    return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1749
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1750
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1751
  return false;
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
bool Matcher::is_spillable_arg(int reg) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1755
  return can_be_java_arg(reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1756
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1757
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1758
bool Matcher::use_asm_for_ldiv_by_con(jlong divisor) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1759
  return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1760
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1761
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1762
// Register for DIVI projection of divmodI
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1763
RegMask Matcher::divI_proj_mask() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1764
  return _Z_RARG4_INT_REG_mask;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1765
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1766
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1767
// Register for MODI projection of divmodI
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1768
RegMask Matcher::modI_proj_mask() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1769
  return _Z_RARG3_INT_REG_mask;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1770
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1771
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1772
// Register for DIVL projection of divmodL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1773
RegMask Matcher::divL_proj_mask() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1774
  return _Z_RARG4_LONG_REG_mask;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1775
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1776
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1777
// Register for MODL projection of divmodL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1778
RegMask Matcher::modL_proj_mask() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1779
  return _Z_RARG3_LONG_REG_mask;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1780
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1781
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1782
// Copied from sparc.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1783
const RegMask Matcher::method_handle_invoke_SP_save_mask() {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1784
  return RegMask();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1785
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1786
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1787
const bool Matcher::convi2l_type_required = true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1788
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1789
// Should the Matcher clone shifts on addressing modes, expecting them
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1790
// to be subsumed into complex addressing expressions or compute them
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1791
// into registers?
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1792
bool Matcher::clone_address_expressions(AddPNode* m, Matcher::MStack& mstack, VectorSet& address_visited) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1793
  return clone_base_plus_offset_address(m, mstack, address_visited);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1794
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1795
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1796
void Compile::reshape_address(AddPNode* addp) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1797
}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1798
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1799
%} // source
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1800
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1801
//----------ENCODING BLOCK-----------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1802
// This block specifies the encoding classes used by the compiler to output
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1803
// byte streams. Encoding classes are parameterized macros used by
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1804
// Machine Instruction Nodes in order to generate the bit encoding of the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1805
// instruction. Operands specify their base encoding interface with the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1806
// interface keyword. There are currently supported four interfaces,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1807
// REG_INTER, CONST_INTER, MEMORY_INTER, & COND_INTER. REG_INTER causes an
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1808
// operand to generate a function which returns its register number when
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1809
// queried. CONST_INTER causes an operand to generate a function which
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1810
// returns the value of the constant when queried. MEMORY_INTER causes an
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1811
// operand to generate four functions which return the Base Register, the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1812
// Index Register, the Scale Value, and the Offset Value of the operand when
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1813
// queried. COND_INTER causes an operand to generate six functions which
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1814
// return the encoding code (ie - encoding bits for the instruction)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1815
// associated with each basic boolean condition for a conditional instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1816
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1817
// Instructions specify two basic values for encoding. Again, a function
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1818
// is available to check if the constant displacement is an oop. They use the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1819
// ins_encode keyword to specify their encoding classes (which must be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1820
// a sequence of enc_class names, and their parameters, specified in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1821
// the encoding block), and they use the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1822
// opcode keyword to specify, in order, their primary, secondary, and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1823
// tertiary opcode. Only the opcode sections which a particular instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1824
// needs for encoding need to be specified.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1825
encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1826
  enc_class enc_unimplemented %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1827
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1828
    __ unimplemented("Unimplemented mach node encoding in AD file.", 13);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1829
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1830
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1831
  enc_class enc_untested %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1832
#ifdef ASSERT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1833
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1834
    __ untested("Untested mach node encoding in AD file.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1835
#endif
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_rrform(iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1839
    assert((($primary >> 14) & 0x03) == 0, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1840
    assert( ($primary >> 16)         == 0, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1841
    z_emit16(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1842
             Assembler::reg($dst$$reg,8,16) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1843
             Assembler::reg($src$$reg,12,16));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1844
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1845
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1846
  enc_class z_rreform(iRegI dst1, iRegI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1847
    assert((($primary >> 30) & 0x03) == 2, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1848
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1849
             Assembler::reg($dst1$$reg,24,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1850
             Assembler::reg($src2$$reg,28,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1851
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1852
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1853
  enc_class z_rrfform(iRegI dst1, iRegI src2, iRegI src3) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1854
    assert((($primary >> 30) & 0x03) == 2, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1855
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1856
             Assembler::reg($dst1$$reg,24,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1857
             Assembler::reg($src2$$reg,28,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1858
             Assembler::reg($src3$$reg,16,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1859
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1860
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1861
  enc_class z_riform_signed(iRegI dst, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1862
    assert((($primary>>30) & 0x03) == 2, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1863
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1864
             Assembler::reg($dst$$reg,8,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1865
             Assembler::simm16($src$$constant,16,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1866
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1867
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1868
  enc_class z_riform_unsigned(iRegI dst, uimmI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1869
    assert((($primary>>30) & 0x03) == 2, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1870
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1871
             Assembler::reg($dst$$reg,8,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1872
             Assembler::uimm16($src$$constant,16,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1873
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1874
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1875
  enc_class z_rieform_d(iRegI dst1, iRegI src3, immI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1876
    assert((($primary>>46) & 0x03) == 3, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1877
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1878
             Assembler::reg($dst1$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1879
             Assembler::reg($src3$$reg,12,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1880
             Assembler::simm16($src2$$constant,16,48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1881
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1882
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1883
  enc_class z_rilform_signed(iRegI dst, immL32 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1884
    assert((($primary>>46) & 0x03) == 3, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1885
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1886
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1887
             Assembler::simm32($src$$constant,16,48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1888
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1889
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1890
  enc_class z_rilform_unsigned(iRegI dst, uimmL32 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1891
    assert((($primary>>46) & 0x03) == 3, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1892
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1893
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1894
             Assembler::uimm32($src$$constant,16,48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1895
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1896
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1897
  enc_class z_rsyform_const(iRegI dst, iRegI src1, immI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1898
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1899
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1900
             Assembler::reg($src1$$reg,12,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1901
             Assembler::simm20($src2$$constant));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1902
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1903
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1904
  enc_class z_rsyform_reg_reg(iRegI dst, iRegI src, iRegI shft) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1905
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1906
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1907
             Assembler::reg($src$$reg,12,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1908
             Assembler::reg($shft$$reg,16,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1909
             Assembler::simm20(0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1910
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1911
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1912
  enc_class z_rxform_imm_reg_reg(iRegL dst, immL con, iRegL src1, iRegL src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1913
    assert((($primary>>30) & 0x03) == 1, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1914
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1915
             Assembler::reg($dst$$reg,8,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1916
             Assembler::reg($src1$$reg,12,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1917
             Assembler::reg($src2$$reg,16,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1918
             Assembler::uimm12($con$$constant,20,32));
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
  enc_class z_rxform_imm_reg(iRegL dst, immL con, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1922
    assert((($primary>>30) & 0x03) == 1, "Instruction format error");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1923
    z_emit32(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1924
             Assembler::reg($dst$$reg,8,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1925
             Assembler::reg($src$$reg,16,32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1926
             Assembler::uimm12($con$$constant,20,32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1927
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1928
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1929
  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
  1930
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1931
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1932
             Assembler::reg($src1$$reg,12,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1933
             Assembler::reg($src2$$reg,16,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1934
             Assembler::simm20($con$$constant));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1935
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1936
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1937
  enc_class z_rxyform_imm_reg(iRegL dst, immL con, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1938
    z_emit48(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1939
             Assembler::reg($dst$$reg,8,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1940
             Assembler::reg($src$$reg,16,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1941
             Assembler::simm20($con$$constant));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1942
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1943
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1944
  // Direct memory arithmetic.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1945
  enc_class z_siyform(memoryRSY mem, immI8 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1946
    int      disp = $mem$$disp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1947
    Register base = reg_to_register_object($mem$$base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1948
    int      con  = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1949
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1950
    assert(VM_Version::has_MemWithImmALUOps(), "unsupported CPU");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1951
    z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1952
                Assembler::regz(base,16,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1953
                Assembler::simm20(disp) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1954
                Assembler::simm8(con,8,48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1955
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1956
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1957
  enc_class z_silform(memoryRS mem, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1958
    z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1959
                Assembler::regz(reg_to_register_object($mem$$base),16,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1960
                Assembler::uimm12($mem$$disp,20,48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1961
                Assembler::simm16($src$$constant,32,48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1962
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1963
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1964
  // Encoder for FP ALU reg/mem instructions (support only short displacements).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1965
  enc_class z_form_rt_memFP(RegF dst, memoryRX mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1966
    Register Ridx = $mem$$index$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1967
    if (Ridx == noreg) { Ridx = Z_R0; } // Index is 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1968
    if ($primary > (1L << 32)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1969
      z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1970
                  Assembler::reg($dst$$reg, 8, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1971
                  Assembler::uimm12($mem$$disp, 20, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1972
                  Assembler::reg(Ridx, 12, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1973
                  Assembler::regz(reg_to_register_object($mem$$base), 16, 48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1974
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1975
      z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1976
                  Assembler::reg($dst$$reg, 8, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1977
                  Assembler::uimm12($mem$$disp, 20, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1978
                  Assembler::reg(Ridx, 12, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1979
                  Assembler::regz(reg_to_register_object($mem$$base), 16, 32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1980
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1981
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1982
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1983
  enc_class z_form_rt_mem(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1984
    Register Ridx = $mem$$index$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1985
    if (Ridx == noreg) { Ridx = Z_R0; } // Index is 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1986
    if ($primary > (1L<<32)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1987
      z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1988
                  Assembler::reg($dst$$reg, 8, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1989
                  Assembler::simm20($mem$$disp) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1990
                  Assembler::reg(Ridx, 12, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1991
                  Assembler::regz(reg_to_register_object($mem$$base), 16, 48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1992
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1993
      z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1994
                  Assembler::reg($dst$$reg, 8, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1995
                  Assembler::uimm12($mem$$disp, 20, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1996
                  Assembler::reg(Ridx, 12, 32) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1997
                  Assembler::regz(reg_to_register_object($mem$$base), 16, 32));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1998
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1999
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2000
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2001
  enc_class z_form_rt_mem_opt(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2002
    int isize = $secondary > 1L << 32 ? 48 : 32;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2003
    Register Ridx = $mem$$index$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2004
    if (Ridx == noreg) { Ridx = Z_R0; } // Index is 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2005
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2006
    if (Displacement::is_shortDisp((long)$mem$$disp)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2007
      z_emit_inst(cbuf, $secondary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2008
                  Assembler::reg($dst$$reg, 8, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2009
                  Assembler::uimm12($mem$$disp, 20, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2010
                  Assembler::reg(Ridx, 12, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2011
                  Assembler::regz(reg_to_register_object($mem$$base), 16, isize));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2012
    } else if (Displacement::is_validDisp((long)$mem$$disp)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2013
      z_emit_inst(cbuf, $primary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2014
                  Assembler::reg($dst$$reg, 8, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2015
                  Assembler::simm20($mem$$disp) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2016
                  Assembler::reg(Ridx, 12, 48) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2017
                  Assembler::regz(reg_to_register_object($mem$$base), 16, 48));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2018
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2019
        MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2020
        __ load_const_optimized(Z_R1_scratch, $mem$$disp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2021
        if (Ridx != Z_R0) { __ z_agr(Z_R1_scratch, Ridx); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2022
        z_emit_inst(cbuf, $secondary |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2023
                    Assembler::reg($dst$$reg, 8, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2024
                    Assembler::uimm12(0, 20, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2025
                    Assembler::reg(Z_R1_scratch, 12, isize) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2026
                    Assembler::regz(reg_to_register_object($mem$$base), 16, isize));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2027
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2028
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2029
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2030
  enc_class z_enc_brul(Label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2031
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2032
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2033
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2034
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2035
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2036
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2037
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2038
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2039
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2040
    __ z_brul(l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2041
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2042
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2043
  enc_class z_enc_bru(Label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2044
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2045
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2046
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2047
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2048
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2049
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2050
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2051
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2052
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2053
    __ z_bru(l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2054
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2055
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2056
  enc_class z_enc_branch_con_far(cmpOp cmp, Label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2057
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2058
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2059
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2060
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2061
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2062
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2063
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2064
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2065
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2066
    __ z_brcl((Assembler::branch_condition)$cmp$$cmpcode, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2067
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2068
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2069
  enc_class z_enc_branch_con_short(cmpOp cmp, Label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2070
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2071
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2072
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2073
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2074
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2075
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2076
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2077
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2078
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2079
    __ z_brc((Assembler::branch_condition)$cmp$$cmpcode, 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
  enc_class z_enc_cmpb_regreg(iRegI src1, iRegI src2, Label lbl, cmpOpT cmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2083
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2084
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2085
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2086
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2087
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2088
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2089
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2090
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2091
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2092
    Assembler::branch_condition cc = (Assembler::branch_condition)$cmp$$cmpcode;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2093
    unsigned long instr = $primary;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2094
    if (instr == CRJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2095
      __ z_crj($src1$$Register, $src2$$Register, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2096
    } else if (instr == CLRJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2097
      __ z_clrj($src1$$Register, $src2$$Register, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2098
    } else if (instr == CGRJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2099
      __ z_cgrj($src1$$Register, $src2$$Register, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2100
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2101
      guarantee(instr == CLGRJ_ZOPC, "opcode not implemented");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2102
      __ z_clgrj($src1$$Register, $src2$$Register, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2103
    }
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
  enc_class z_enc_cmpb_regregFar(iRegI src1, iRegI src2, Label lbl, cmpOpT cmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2107
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2108
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2109
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2110
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2111
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2112
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2113
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2114
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2115
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2116
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2117
    unsigned long instr = $primary;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2118
    if (instr == CR_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2119
      __ z_cr($src1$$Register, $src2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2120
    } else if (instr == CLR_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2121
      __ z_clr($src1$$Register, $src2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2122
    } else if (instr == CGR_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2123
      __ z_cgr($src1$$Register, $src2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2124
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2125
      guarantee(instr == CLGR_ZOPC, "opcode not implemented");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2126
      __ z_clgr($src1$$Register, $src2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2127
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2128
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2129
    __ z_brcl((Assembler::branch_condition)$cmp$$cmpcode, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2130
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2131
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2132
  enc_class z_enc_cmpb_regimm(iRegI src1, immI8 src2, Label lbl, cmpOpT cmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2133
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2134
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2135
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2136
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2137
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2138
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2139
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2140
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2141
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2142
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2143
    Assembler::branch_condition cc = (Assembler::branch_condition)$cmp$$cmpcode;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2144
    unsigned long instr = $primary;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2145
    if (instr == CIJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2146
      __ z_cij($src1$$Register, $src2$$constant, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2147
    } else if (instr == CLIJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2148
      __ z_clij($src1$$Register, $src2$$constant, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2149
    } else if (instr == CGIJ_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2150
      __ z_cgij($src1$$Register, $src2$$constant, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2151
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2152
      guarantee(instr == CLGIJ_ZOPC, "opcode not implemented");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2153
      __ z_clgij($src1$$Register, $src2$$constant, cc, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2154
    }
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
  enc_class z_enc_cmpb_regimmFar(iRegI src1, immI8 src2, Label lbl, cmpOpT cmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2158
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2159
    Label* p = $lbl$$label;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2160
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2161
    // 'p' is `NULL' when this encoding class is used only to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2162
    // determine the size of the encoded instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2163
    // Use a bound dummy label in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2164
    Label d;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2165
    __ bind(d);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2166
    Label& l = (NULL == p) ? d : *(p);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2167
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2168
    unsigned long instr = $primary;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2169
    if (instr == CHI_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2170
      __ z_chi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2171
    } else if (instr == CLFI_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2172
      __ z_clfi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2173
    } else if (instr == CGHI_ZOPC) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2174
      __ z_cghi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2175
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2176
      guarantee(instr == CLGFI_ZOPC, "opcode not implemented");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2177
      __ z_clgfi($src1$$Register, $src2$$constant);
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
    __ z_brcl((Assembler::branch_condition)$cmp$$cmpcode, l);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2181
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2182
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2183
  // Call from Java to runtime.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2184
  enc_class z_enc_java_to_runtime_call(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2185
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2186
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2187
    // Save return pc before call to the place where we need it, since
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2188
    // callee doesn't.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2189
    unsigned int start_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2190
    // Compute size of "larl + stg + call_c_opt".
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2191
    const int size_of_code = 6 + 6 + MacroAssembler::call_far_patchable_size();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2192
    __ get_PC(Z_R14, size_of_code);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2193
    __ save_return_pc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2194
    assert(__ offset() - start_off == 12, "bad prelude len: %d", __ offset() - start_off);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2195
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2196
    assert((__ offset() & 2) == 0, "misaligned z_enc_java_to_runtime_call");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2197
    address call_addr = __ call_c_opt((address)$meth$$method);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2198
    if (call_addr == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2199
      Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2200
      return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2201
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2202
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2203
#ifdef ASSERT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2204
    // Plausibility check for size_of_code assumptions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2205
    unsigned int actual_ret_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2206
    assert(start_off + size_of_code == actual_ret_off, "wrong return_pc");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2207
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2208
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2209
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2210
  enc_class z_enc_java_static_call(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2211
    // Call to fixup routine. Fixup routine uses ScopeDesc info to determine
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2212
    // whom we intended to call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2213
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2214
    int ret_offset = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2215
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2216
    if (!_method) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2217
      ret_offset = emit_call_reloc(_masm, $meth$$method,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2218
                                   relocInfo::runtime_call_w_cp_type, ra_);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2219
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2220
      int method_index = resolved_method_index(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2221
      if (_optimized_virtual) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2222
        ret_offset = emit_call_reloc(_masm, $meth$$method,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2223
                                     opt_virtual_call_Relocation::spec(method_index));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2224
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2225
        ret_offset = emit_call_reloc(_masm, $meth$$method,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2226
                                     static_call_Relocation::spec(method_index));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2227
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2228
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2229
    assert(__ inst_mark() != NULL, "emit_call_reloc must set_inst_mark()");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2230
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2231
    if (_method) { // Emit stub for static call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2232
      address stub = CompiledStaticCall::emit_to_interp_stub(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2233
      if (stub == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2234
        ciEnv::current()->record_failure("CodeCache is full");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2235
        return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2236
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2237
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2238
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2239
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2240
  // Java dynamic call
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2241
  enc_class z_enc_java_dynamic_call(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2242
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2243
    unsigned int start_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2244
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2245
    int vtable_index = this->_vtable_index;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2246
    if (vtable_index == -4) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2247
      Register ic_reg = reg_to_register_object(Matcher::inline_cache_reg_encode());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2248
      address virtual_call_oop_addr = NULL;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2249
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2250
      AddressLiteral empty_ic((address) Universe::non_oop_word());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2251
      virtual_call_oop_addr = __ pc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2252
      bool success = __ load_const_from_toc(ic_reg, empty_ic);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2253
      if (!success) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2254
        Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2255
        return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2256
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2257
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2258
      // Call to fixup routine. Fixup routine uses ScopeDesc info
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2259
      // to determine who we intended to call.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2260
      int method_index = resolved_method_index(cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2261
      __ relocate(virtual_call_Relocation::spec(virtual_call_oop_addr, method_index));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2262
      unsigned int ret_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2263
      assert(__ offset() - start_off == 6, "bad prelude len: %d", __ offset() - start_off);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2264
      ret_off += emit_call_reloc(_masm, $meth$$method, relocInfo::none, ra_);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2265
      assert(_method, "lazy_constant may be wrong when _method==null");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2266
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2267
      assert(!UseInlineCaches, "expect vtable calls only if not using ICs");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2268
      // Go through the vtable. Get receiver klass. Receiver already
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2269
      // checked for non-null. If we'll go thru a C2I adapter, the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2270
      // interpreter expects method in Z_method.
50162
f9fe56417050 8202713: Create a MacroAssembler::access_load/store_at wrapper for S390 and PPC
mdoerr
parents: 49943
diff changeset
  2271
      // Use Z_method to temporarily hold the klass oop.
f9fe56417050 8202713: Create a MacroAssembler::access_load/store_at wrapper for S390 and PPC
mdoerr
parents: 49943
diff changeset
  2272
      // Z_R1_scratch is destroyed.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2273
      __ load_klass(Z_method, Z_R2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2274
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2275
      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
  2276
      int v_off        = entry_offset + vtableEntry::method_offset_in_bytes();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2277
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2278
      if (Displacement::is_validDisp(v_off) ) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2279
        // Can use load instruction with large offset.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2280
        __ z_lg(Z_method, Address(Z_method /*class oop*/, v_off /*method offset*/));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2281
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2282
        // Worse case, must load offset into register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2283
        __ load_const(Z_R1_scratch, v_off);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2284
        __ z_lg(Z_method, Address(Z_method /*class oop*/, Z_R1_scratch /*method offset*/));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2285
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2286
      // NOTE: for vtable dispatches, the vtable entry will never be
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2287
      // null. However it may very well end up in handle_wrong_method
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2288
      // if the method is abstract for the particular class.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2289
      __ z_lg(Z_R1_scratch, Address(Z_method, Method::from_compiled_offset()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2290
      // Call target. Either compiled code or C2I adapter.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2291
      __ z_basr(Z_R14, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2292
      unsigned int ret_off = __ offset();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2293
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2294
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2295
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2296
  enc_class z_enc_cmov_reg(cmpOp cmp, iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2297
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2298
    Register Rdst = reg_to_register_object($dst$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2299
    Register Rsrc = reg_to_register_object($src$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2300
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2301
    // Don't emit code if operands are identical (same register).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2302
    if (Rsrc != Rdst) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2303
      Assembler::branch_condition cc = (Assembler::branch_condition)$cmp$$cmpcode;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2304
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2305
      if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2306
        __ z_locgr(Rdst, Rsrc, cc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2307
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2308
        // Branch if not (cmp cr).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2309
        Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2310
        __ z_brc(Assembler::inverse_condition(cc), done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2311
        __ z_lgr(Rdst, Rsrc); // Used for int and long+ptr.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2312
        __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2313
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2314
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2315
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2316
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2317
  enc_class z_enc_cmov_imm(cmpOp cmp, iRegI dst, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2318
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2319
    Register Rdst = reg_to_register_object($dst$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2320
    int      Csrc = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2321
    Assembler::branch_condition cc = (Assembler::branch_condition)$cmp$$cmpcode;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2322
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2323
    // Branch if not (cmp cr).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2324
    __ z_brc(Assembler::inverse_condition(cc), done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2325
    if (Csrc == 0) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2326
      // Don't set CC.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2327
      __ clear_reg(Rdst, true, false);  // Use for int, long & ptr.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2328
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2329
      __ z_lghi(Rdst, Csrc); // Use for int, long & ptr.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2330
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2331
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2332
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2333
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2334
  enc_class z_enc_cctobool(iRegI res) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2335
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2336
    Register Rres = reg_to_register_object($res$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2337
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2338
    if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2339
      __ load_const_optimized(Z_R0_scratch, 0L); // false (failed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2340
      __ load_const_optimized(Rres, 1L);         // true  (succeed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2341
      __ z_locgr(Rres, Z_R0_scratch, Assembler::bcondNotEqual);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2342
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2343
      Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2344
      __ load_const_optimized(Rres, 0L); // false (failed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2345
      __ z_brne(done);                   // Assume true to be the common case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2346
      __ load_const_optimized(Rres, 1L); // true  (succeed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2347
      __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2348
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2349
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2350
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2351
  enc_class z_enc_casI(iRegI compare_value, iRegI exchange_value, iRegP addr_ptr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2352
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2353
    Register Rcomp = reg_to_register_object($compare_value$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2354
    Register Rnew  = reg_to_register_object($exchange_value$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2355
    Register Raddr = reg_to_register_object($addr_ptr$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2356
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2357
    __ z_cs(Rcomp, Rnew, 0, Raddr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2358
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2359
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2360
  enc_class z_enc_casL(iRegL compare_value, iRegL exchange_value, iRegP addr_ptr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2361
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2362
    Register Rcomp = reg_to_register_object($compare_value$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2363
    Register Rnew  = reg_to_register_object($exchange_value$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2364
    Register Raddr = reg_to_register_object($addr_ptr$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2365
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2366
    __ z_csg(Rcomp, Rnew, 0, Raddr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2367
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2368
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2369
  enc_class z_enc_SwapI(memoryRSY mem, iRegI dst, iRegI tmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2370
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2371
    Register Rdst = reg_to_register_object($dst$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2372
    Register Rtmp = reg_to_register_object($tmp$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2373
    guarantee(Rdst != Rtmp, "Fix match rule to use TEMP_DEF");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2374
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2375
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2376
    // Iterate until swap succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2377
    __ z_llgf(Rtmp, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2378
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2379
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2380
      __ z_csy(Rtmp, Rdst, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2381
      __ z_brne(retry);                    // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2382
    __ z_lgr(Rdst, Rtmp);                  // Exchanged value from memory is return value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2383
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2384
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2385
  enc_class z_enc_SwapL(memoryRSY mem, iRegL dst, iRegL tmp) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2386
    MacroAssembler _masm(&cbuf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2387
    Register Rdst = reg_to_register_object($dst$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2388
    Register Rtmp = reg_to_register_object($tmp$$reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2389
    guarantee(Rdst != Rtmp, "Fix match rule to use TEMP_DEF");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2390
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2391
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2392
    // Iterate until swap succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2393
    __ z_lg(Rtmp, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2394
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2395
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2396
      __ z_csg(Rtmp, Rdst, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2397
      __ z_brne(retry);                    // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2398
    __ z_lgr(Rdst, Rtmp);                  // Exchanged value from memory is return value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2399
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2400
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2401
%} // encode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2402
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2403
source %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2404
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2405
  // Check whether outs are all Stores. If so, we can omit clearing the upper
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2406
  // 32 bits after encoding.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2407
  static bool all_outs_are_Stores(const Node *n) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2408
    for (DUIterator_Fast imax, k = n->fast_outs(imax); k < imax; k++) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2409
      Node *out = n->fast_out(k);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2410
      if (!out->is_Mach() || out->as_Mach()->ideal_Opcode() != Op_StoreN) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2411
        // Most other outs are SpillCopy, but there are various other.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2412
        // jvm98 has arond 9% Encodes where we return false.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2413
        return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2414
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2415
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2416
    return true;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2417
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2418
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2419
%} // source
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2420
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2421
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2422
//----------FRAME--------------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2423
// Definition of frame structure and management information.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2424
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2425
frame %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2426
  // What direction does stack grow in (assumed to be same for native & Java).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2427
  stack_direction(TOWARDS_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2428
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2429
  // These two registers define part of the calling convention between
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2430
  // compiled code and the interpreter.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2431
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2432
  // Inline Cache Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2433
  inline_cache_reg(Z_R9); // Z_inline_cache
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2434
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2435
  // Argument pointer for I2C adapters
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2436
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2437
  // Tos is loaded in run_compiled_code to Z_ARG5=Z_R6.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2438
  // interpreter_arg_ptr_reg(Z_R6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2439
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2440
  // Temporary in compiled entry-points
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2441
  // compiler_method_oop_reg(Z_R1);//Z_R1_scratch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2442
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2443
  // Method Oop Register when calling interpreter
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2444
  interpreter_method_oop_reg(Z_R9);//Z_method
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2445
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2446
  // Optional: name the operand used by cisc-spilling to access
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2447
  // [stack_pointer + offset].
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2448
  cisc_spilling_operand_name(indOffset12);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2449
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2450
  // Number of stack slots consumed by a Monitor enter.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2451
  sync_stack_slots(frame::jit_monitor_size_in_4_byte_units);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2452
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2453
  // Compiled code's Frame Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2454
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2455
  // z/Architecture stack pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2456
  frame_pointer(Z_R15); // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2457
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2458
  // Interpreter stores its frame pointer in a register which is
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2459
  // stored to the stack by I2CAdaptors. I2CAdaptors convert from
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2460
  // interpreted java to compiled java.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2461
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2462
  // Z_state holds pointer to caller's cInterpreter.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2463
  interpreter_frame_pointer(Z_R7); // Z_state
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2464
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2465
  // Use alignment_in_bytes instead of log_2_of_alignment_in_bits.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2466
  stack_alignment(frame::alignment_in_bytes);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2467
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2468
  in_preserve_stack_slots(frame::jit_in_preserve_size_in_4_byte_units);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2469
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2470
  // A `slot' is assumed 4 bytes here!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2471
  // out_preserve_stack_slots(frame::jit_out_preserve_size_in_4_byte_units);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2472
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2473
  // Number of outgoing stack slots killed above the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2474
  // out_preserve_stack_slots for calls to C. Supports the var-args
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2475
  // backing area for register parms.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2476
  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
  2477
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2478
  // The after-PROLOG location of the return address. Location of
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2479
  // return address specifies a type (REG or STACK) and a number
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2480
  // representing the register number (i.e. - use a register name) or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2481
  // stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2482
  return_addr(REG Z_R14);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2483
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2484
  // This is the body of the function
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2485
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2486
  // void Matcher::calling_convention(OptoRegPair* sig /* array of ideal regs */,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2487
  //                                  uint length      /* length of array */,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2488
  //                                  bool is_outgoing)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2489
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2490
  // The `sig' array is to be updated. Sig[j] represents the location
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2491
  // of the j-th argument, either a register or a stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2492
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2493
  // Body of function which returns an integer array locating
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2494
  // arguments either in registers or in stack slots. Passed an array
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2495
  // of ideal registers called "sig" and a "length" count. Stack-slot
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2496
  // offsets are based on outgoing arguments, i.e. a CALLER setting up
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2497
  // arguments for a CALLEE. Incoming stack arguments are
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2498
  // automatically biased by the preserve_stack_slots field above.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2499
  calling_convention %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2500
    // No difference between ingoing/outgoing just pass false.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2501
    SharedRuntime::java_calling_convention(sig_bt, regs, length, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2502
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2503
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2504
  // Body of function which returns an integer array locating
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2505
  // arguments either in registers or in stack slots. Passed an array
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2506
  // of ideal registers called "sig" and a "length" count. Stack-slot
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2507
  // offsets are based on outgoing arguments, i.e. a CALLER setting up
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2508
  // arguments for a CALLEE. Incoming stack arguments are
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2509
  // automatically biased by the preserve_stack_slots field above.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2510
  c_calling_convention %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2511
    // This is obviously always outgoing.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2512
    // C argument must be in register AND stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2513
    (void) SharedRuntime::c_calling_convention(sig_bt, regs, /*regs2=*/NULL, length);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2514
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2515
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2516
  // Location of native (C/C++) and interpreter return values. This
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2517
  // is specified to be the same as Java. In the 32-bit VM, long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2518
  // values are actually returned from native calls in O0:O1 and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2519
  // returned to the interpreter in I0:I1. The copying to and from
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2520
  // the register pairs is done by the appropriate call and epilog
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2521
  // opcodes. This simplifies the register allocator.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2522
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2523
  // Use register pair for c return value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2524
  c_return_value %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2525
    assert(ideal_reg >= Op_RegI && ideal_reg <= Op_RegL, "only return normal values");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2526
    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
  2527
    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
  2528
    return OptoRegPair(typeToRegHi[ideal_reg], typeToRegLo[ideal_reg]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2529
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2530
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2531
  // Use register pair for return value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2532
  // Location of compiled Java return values. Same as C
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2533
  return_value %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2534
    assert(ideal_reg >= Op_RegI && ideal_reg <= Op_RegL, "only return normal values");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2535
    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
  2536
    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
  2537
    return OptoRegPair(typeToRegHi[ideal_reg], typeToRegLo[ideal_reg]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2538
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2539
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2540
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2541
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2542
//----------ATTRIBUTES---------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2543
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2544
//----------Operand Attributes-------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2545
op_attrib op_cost(1);          // Required cost attribute
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2546
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2547
//----------Instruction Attributes---------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2548
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2549
// Cost attribute. required.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2550
ins_attrib ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2551
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2552
// Is this instruction a non-matching short branch variant of some
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2553
// long branch? Not required.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2554
ins_attrib ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2555
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2556
// Indicates this is a trap based check node and final control-flow fixup
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2557
// must generate a proper fall through.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2558
ins_attrib ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2559
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2560
// Attribute of instruction to tell how many constants the instruction will generate.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2561
// (optional attribute). Default: 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2562
ins_attrib ins_num_consts(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2563
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2564
// Required alignment attribute (must be a power of 2)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2565
// specifies the alignment that some part of the instruction (not
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2566
// necessarily the start) requires. If > 1, a compute_padding()
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2567
// function must be provided for the instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2568
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2569
// WARNING: Don't use size(FIXED_SIZE) or size(VARIABLE_SIZE) in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2570
// instructions which depend on the proper alignment, because the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2571
// desired alignment isn't guaranteed for the call to "emit()" during
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2572
// the size computation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2573
ins_attrib ins_alignment(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2574
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2575
// Enforce/prohibit rematerializations.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2576
// - If an instruction is attributed with 'ins_cannot_rematerialize(true)'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2577
//   then rematerialization of that instruction is prohibited and the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2578
//   instruction's value will be spilled if necessary.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2579
// - If an instruction is attributed with 'ins_should_rematerialize(true)'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2580
//   then rematerialization is enforced and the instruction's value will
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2581
//   never get spilled. a copy of the instruction will be inserted if
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2582
//   necessary.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2583
//   Note: this may result in rematerializations in front of every use.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2584
// (optional attribute)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2585
ins_attrib ins_cannot_rematerialize(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2586
ins_attrib ins_should_rematerialize(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2587
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2588
//----------OPERANDS-----------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2589
// Operand definitions must precede instruction definitions for correct
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2590
// parsing in the ADLC because operands constitute user defined types
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2591
// which are used in instruction definitions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2592
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2593
//----------Simple Operands----------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2594
// Immediate Operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2595
// Please note:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2596
// Formats are generated automatically for constants and base registers.
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
// SIGNED (shorter than INT) immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2600
//----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2601
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2602
// Byte Immediate: constant 'int -1'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2603
operand immB_minus1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2604
  //         sign-ext constant      zero-ext constant
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2605
  predicate((n->get_int() == -1) || ((n->get_int()&0x000000ff) == 0x000000ff));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2606
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2607
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2608
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2609
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2610
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2611
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2612
// Byte Immediate: constant, but not 'int 0' nor 'int -1'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2613
operand immB_n0m1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2614
  //                             sign-ext constant     zero-ext constant
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2615
  predicate(n->get_int() != 0 && n->get_int() != -1 && (n->get_int()&0x000000ff) != 0x000000ff);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2616
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2617
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2618
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2619
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2620
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2621
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2622
// Short Immediate: constant 'int -1'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2623
operand immS_minus1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2624
  //         sign-ext constant      zero-ext constant
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2625
  predicate((n->get_int() == -1) || ((n->get_int()&0x0000ffff) == 0x0000ffff));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2626
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2627
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2628
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2629
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2630
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2631
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2632
// Short Immediate: constant, but not 'int 0' nor 'int -1'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2633
operand immS_n0m1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2634
  //                             sign-ext constant     zero-ext constant
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2635
  predicate(n->get_int() != 0 && n->get_int() != -1 && (n->get_int()&0x0000ffff) != 0x0000ffff);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2636
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2637
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2638
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2639
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2640
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2641
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2642
//-----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2643
//  SIGNED INT immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2644
//-----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2645
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2646
// Integer Immediate: 32-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2647
operand immI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2648
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2649
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2650
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2651
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2652
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2653
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2654
// Int Immediate: 20-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2655
operand immI20() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2656
  predicate(Immediate::is_simm20(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2657
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2658
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2659
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2660
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2661
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2662
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2663
// Integer Immediate: 16-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2664
operand immI16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2665
  predicate(Immediate::is_simm16(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2666
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2667
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2668
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2669
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2670
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2671
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2672
// Integer Immediate: 8-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2673
operand immI8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2674
  predicate(Immediate::is_simm8(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2675
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2676
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2677
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2678
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2679
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2680
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2681
// Integer Immediate: constant 'int 0'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2682
operand immI_0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2683
  predicate(n->get_int() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2684
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2685
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2686
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2687
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2688
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2689
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2690
// Integer Immediate: constant 'int -1'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2691
operand immI_minus1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2692
  predicate(n->get_int() == -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2693
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2694
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2695
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2696
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2697
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2698
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2699
// Integer Immediate: constant, but not 'int 0' nor 'int -1'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2700
operand immI_n0m1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2701
  predicate(n->get_int() != 0 && n->get_int() != -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2702
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2703
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2704
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2705
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2706
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2707
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2708
//-------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2709
// UNSIGNED INT immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2710
//-------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2711
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2712
// Unsigned Integer Immediate: 32-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2713
operand uimmI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2714
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2715
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2716
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2717
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2718
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2719
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2720
// Unsigned Integer Immediate: 16-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2721
operand uimmI16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2722
  predicate(Immediate::is_uimm16(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2723
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2724
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2725
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2726
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2727
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2728
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2729
// Unsigned Integer Immediate: 12-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2730
operand uimmI12() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2731
  predicate(Immediate::is_uimm12(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2732
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2733
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2734
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2735
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2736
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2737
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2738
// Unsigned Integer Immediate: 12-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2739
operand uimmI8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2740
  predicate(Immediate::is_uimm8(n->get_int()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2741
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2742
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2743
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2744
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2745
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2746
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2747
// Integer Immediate: 6-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2748
operand uimmI6() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2749
  predicate(Immediate::is_uimm(n->get_int(), 6));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2750
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2751
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2752
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2753
  interface(CONST_INTER);
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
// Integer Immediate: 5-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2757
operand uimmI5() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2758
  predicate(Immediate::is_uimm(n->get_int(), 5));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2759
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2760
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2761
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2762
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2763
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2764
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2765
// Length for SS instructions, given in DWs,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2766
//   possible range [1..512], i.e. [8..4096] Bytes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2767
//   used     range [1..256], i.e. [8..2048] Bytes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2768
//   operand type int
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2769
// Unsigned Integer Immediate: 9-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2770
operand SSlenDW() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2771
  predicate(Immediate::is_uimm8(n->get_long()-1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2772
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2773
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2774
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2775
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2776
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2777
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2778
//------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2779
// (UN)SIGNED INT specific values
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2780
//------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2781
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2782
// Integer Immediate: the value 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2783
operand immI_1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2784
  predicate(n->get_int() == 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2785
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2786
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2787
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2788
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2789
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2790
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2791
// Integer Immediate: the value 16.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2792
operand immI_16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2793
  predicate(n->get_int() == 16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2794
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2795
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2796
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2797
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2798
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2799
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2800
// Integer Immediate: the value 24.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2801
operand immI_24() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2802
  predicate(n->get_int() == 24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2803
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2804
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2805
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2806
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2807
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2808
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2809
// Integer Immediate: the value 255
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2810
operand immI_255() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2811
  predicate(n->get_int() == 255);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2812
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2813
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2814
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2815
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2816
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2817
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2818
// Integer Immediate: the values 32-63
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2819
operand immI_32_63() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2820
  predicate(n->get_int() >= 32 && n->get_int() <= 63);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2821
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2822
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2823
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2824
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2825
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2826
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2827
// Unsigned Integer Immediate: LL-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2828
operand uimmI_LL1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2829
  predicate((n->get_int() & 0xFFFF0000) == 0xFFFF0000);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2830
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2831
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2832
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2833
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2834
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2835
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2836
// Unsigned Integer Immediate: LH-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2837
operand uimmI_LH1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2838
  predicate((n->get_int() & 0xFFFF) == 0xFFFF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2839
  match(ConI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2840
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2841
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2842
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2843
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2844
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2845
//------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2846
// SIGNED LONG immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2847
//------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2848
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2849
operand immL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2850
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2851
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2852
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2853
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2854
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2855
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2856
// Long Immediate: 32-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2857
operand immL32() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2858
  predicate(Immediate::is_simm32(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2859
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2860
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2861
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2862
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2863
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2864
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2865
// Long Immediate: 20-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2866
operand immL20() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2867
  predicate(Immediate::is_simm20(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2868
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2869
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2870
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2871
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2872
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2873
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2874
// Long Immediate: 16-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2875
operand immL16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2876
  predicate(Immediate::is_simm16(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2877
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2878
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2879
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2880
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2881
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2882
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2883
// Long Immediate: 8-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2884
operand immL8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2885
  predicate(Immediate::is_simm8(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2886
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2887
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2888
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2889
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2890
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2891
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2892
//--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2893
// UNSIGNED LONG immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2894
//--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2895
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2896
operand uimmL32() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2897
  predicate(Immediate::is_uimm32(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2898
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2899
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2900
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2901
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2902
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2903
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2904
// Unsigned Long Immediate: 16-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2905
operand uimmL16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2906
  predicate(Immediate::is_uimm16(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2907
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2908
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2909
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2910
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2911
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2912
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2913
// Unsigned Long Immediate: 12-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2914
operand uimmL12() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2915
  predicate(Immediate::is_uimm12(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2916
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2917
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2918
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2919
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2920
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2921
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2922
// Unsigned Long Immediate: 8-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2923
operand uimmL8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2924
  predicate(Immediate::is_uimm8(n->get_long()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2925
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2926
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2927
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2928
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2929
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2930
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2931
//-------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2932
// (UN)SIGNED LONG specific values
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2933
//-------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2934
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2935
// Long Immediate: the value FF
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2936
operand immL_FF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2937
  predicate(n->get_long() == 0xFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2938
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2939
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2940
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2941
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2942
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2943
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2944
// Long Immediate: the value FFFF
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2945
operand immL_FFFF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2946
  predicate(n->get_long() == 0xFFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2947
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2948
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2949
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2950
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2951
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2952
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2953
// Long Immediate: the value FFFFFFFF
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2954
operand immL_FFFFFFFF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2955
  predicate(n->get_long() == 0xFFFFFFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2956
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2957
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2958
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2959
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2960
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2961
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2962
operand immL_0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2963
  predicate(n->get_long() == 0L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2964
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2965
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2966
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2967
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2968
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2969
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2970
// Unsigned Long Immediate: LL-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2971
operand uimmL_LL1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2972
  predicate((n->get_long() & 0xFFFFFFFFFFFF0000L) == 0xFFFFFFFFFFFF0000L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2973
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2974
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2975
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2976
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2977
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2978
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2979
// Unsigned Long Immediate: LH-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2980
operand uimmL_LH1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2981
  predicate((n->get_long() & 0xFFFFFFFF0000FFFFL) == 0xFFFFFFFF0000FFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2982
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2983
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2984
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2985
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2986
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2987
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2988
// Unsigned Long Immediate: HL-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2989
operand uimmL_HL1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2990
  predicate((n->get_long() & 0xFFFF0000FFFFFFFFL) == 0xFFFF0000FFFFFFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2991
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2992
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2993
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2994
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2995
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2996
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2997
// Unsigned Long Immediate: HH-part, extended by 1s.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2998
operand uimmL_HH1() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2999
  predicate((n->get_long() & 0xFFFFFFFFFFFFL) == 0xFFFFFFFFFFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3000
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3001
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3002
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3003
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3004
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3005
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3006
// Long Immediate: low 32-bit mask
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3007
operand immL_32bits() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3008
  predicate(n->get_long() == 0xFFFFFFFFL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3009
  match(ConL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3010
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3011
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3012
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3013
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3014
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3015
//--------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3016
//  POINTER immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3017
//--------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3018
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3019
// Pointer Immediate: 64-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3020
operand immP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3021
  match(ConP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3022
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3023
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3024
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3025
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3026
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3027
// Pointer Immediate: 32-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3028
operand immP32() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3029
  predicate(Immediate::is_uimm32(n->get_ptr()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3030
  match(ConP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3031
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3032
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3033
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3034
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3035
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3036
// Pointer Immediate: 16-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3037
operand immP16() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3038
  predicate(Immediate::is_uimm16(n->get_ptr()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3039
  match(ConP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3040
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3041
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3042
  interface(CONST_INTER);
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
// Pointer Immediate: 8-bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3046
operand immP8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3047
  predicate(Immediate::is_uimm8(n->get_ptr()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3048
  match(ConP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3049
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3050
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3051
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3052
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3053
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3054
//-----------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3055
// POINTER specific values
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3056
//-----------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3057
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3058
// Pointer Immediate: NULL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3059
operand immP0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3060
  predicate(n->get_ptr() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3061
  match(ConP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3062
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3063
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3064
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3065
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3066
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3067
//---------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3068
// NARROW POINTER immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3069
//---------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3070
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3071
// Narrow Pointer Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3072
operand immN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3073
  match(ConN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3074
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3075
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3076
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3077
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3078
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3079
operand immNKlass() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3080
  match(ConNKlass);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3081
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3082
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3083
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3084
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3085
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3086
// Narrow Pointer Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3087
operand immN8() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3088
  predicate(Immediate::is_uimm8(n->get_narrowcon()));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3089
  match(ConN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3090
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3091
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3092
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3093
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3094
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3095
// Narrow NULL Pointer Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3096
operand immN0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3097
  predicate(n->get_narrowcon() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3098
  match(ConN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3099
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3100
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3101
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3102
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3103
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3104
// FLOAT and DOUBLE immediate operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3105
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3106
// Double Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3107
operand immD() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3108
  match(ConD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3109
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3110
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3111
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3112
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3113
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3114
// Double Immediate: +-0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3115
operand immDpm0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3116
  predicate(n->getd() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3117
  match(ConD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3118
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3119
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3120
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3121
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3122
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3123
// Double Immediate: +0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3124
operand immDp0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3125
  predicate(jlong_cast(n->getd()) == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3126
  match(ConD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3127
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3128
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3129
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3130
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3131
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3132
// Float Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3133
operand immF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3134
  match(ConF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3135
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3136
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3137
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3138
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3139
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3140
// Float Immediate: +-0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3141
operand immFpm0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3142
  predicate(n->getf() == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3143
  match(ConF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3144
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3145
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3146
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3147
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3148
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3149
// Float Immediate: +0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3150
operand immFp0() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3151
  predicate(jint_cast(n->getf()) == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3152
  match(ConF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3153
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3154
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3155
  interface(CONST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3156
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3157
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3158
// End of Immediate Operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3159
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3160
// Integer Register Operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3161
// Integer Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3162
operand iRegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3163
  constraint(ALLOC_IN_RC(z_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3164
  match(RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3165
  match(noArg_iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3166
  match(rarg1RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3167
  match(rarg2RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3168
  match(rarg3RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3169
  match(rarg4RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3170
  match(rarg5RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3171
  match(noOdd_iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3172
  match(revenRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3173
  match(roddRegI);
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 noArg_iRegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3179
  constraint(ALLOC_IN_RC(z_no_arg_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3180
  match(RegI);
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
47606
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  3185
// revenRegI and roddRegI constitute and even-odd-pair.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3186
operand revenRegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3187
  constraint(ALLOC_IN_RC(z_rarg3_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3188
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3189
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3190
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3191
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3192
47606
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  3193
// revenRegI and roddRegI constitute and even-odd-pair.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3194
operand roddRegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3195
  constraint(ALLOC_IN_RC(z_rarg4_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3196
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3197
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3198
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3199
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3200
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3201
operand rarg1RegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3202
  constraint(ALLOC_IN_RC(z_rarg1_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3203
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3204
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3205
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3206
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3207
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3208
operand rarg2RegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3209
  constraint(ALLOC_IN_RC(z_rarg2_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3210
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3211
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3212
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3213
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3214
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3215
operand rarg3RegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3216
  constraint(ALLOC_IN_RC(z_rarg3_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3217
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3218
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3219
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3220
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3221
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3222
operand rarg4RegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3223
  constraint(ALLOC_IN_RC(z_rarg4_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3224
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3225
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3226
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3227
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3228
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3229
operand rarg5RegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3230
  constraint(ALLOC_IN_RC(z_rarg5_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3231
  match(iRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3232
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3233
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3234
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3235
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3236
operand noOdd_iRegI() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3237
  constraint(ALLOC_IN_RC(z_no_odd_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3238
  match(RegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3239
  match(revenRegI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3240
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3241
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3242
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3243
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3244
// Pointer Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3245
operand iRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3246
  constraint(ALLOC_IN_RC(z_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3247
  match(RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3248
  match(noArg_iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3249
  match(rarg1RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3250
  match(rarg2RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3251
  match(rarg3RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3252
  match(rarg4RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3253
  match(rarg5RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3254
  match(revenRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3255
  match(roddRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3256
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3257
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3258
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3259
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3260
// thread operand
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3261
operand threadRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3262
  constraint(ALLOC_IN_RC(z_thread_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3263
  match(RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3264
  format %{ "Z_THREAD" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3265
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3266
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3267
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3268
operand noArg_iRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3269
  constraint(ALLOC_IN_RC(z_no_arg_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3270
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3271
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3272
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3273
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3274
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3275
operand rarg1RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3276
  constraint(ALLOC_IN_RC(z_rarg1_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3277
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3278
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3279
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3280
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3281
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3282
operand rarg2RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3283
  constraint(ALLOC_IN_RC(z_rarg2_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3284
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3285
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3286
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3287
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3288
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3289
operand rarg3RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3290
  constraint(ALLOC_IN_RC(z_rarg3_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3291
  match(iRegP);
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
operand rarg4RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3297
  constraint(ALLOC_IN_RC(z_rarg4_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3298
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3299
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3300
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3301
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3302
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3303
operand rarg5RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3304
  constraint(ALLOC_IN_RC(z_rarg5_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3305
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3306
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3307
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3308
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3309
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3310
operand memoryRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3311
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3312
  match(RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3313
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3314
  match(threadRegP);
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
47606
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  3319
// revenRegP and roddRegP constitute and even-odd-pair.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3320
operand revenRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3321
  constraint(ALLOC_IN_RC(z_rarg3_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3322
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3323
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3324
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3325
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3326
47606
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  3327
// revenRegP and roddRegP constitute and even-odd-pair.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3328
operand roddRegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3329
  constraint(ALLOC_IN_RC(z_rarg4_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3330
  match(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3331
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3332
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3333
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3334
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3335
operand lock_ptr_RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3336
  constraint(ALLOC_IN_RC(z_lock_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3337
  match(RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3338
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3339
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3340
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3341
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3342
operand rscratch2RegP() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3343
  constraint(ALLOC_IN_RC(z_rscratch2_bits64_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3344
  match(RegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3345
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3346
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3347
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3348
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3349
operand iRegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3350
  constraint(ALLOC_IN_RC(z_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3351
  match(RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3352
  match(noArg_iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3353
  match(rarg1RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3354
  match(rarg2RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3355
  match(rarg3RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3356
  match(rarg4RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3357
  match(rarg5RegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3358
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3359
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3360
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3361
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3362
operand noArg_iRegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3363
  constraint(ALLOC_IN_RC(z_no_arg_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3364
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3365
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3366
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3367
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3368
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3369
operand rarg1RegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3370
  constraint(ALLOC_IN_RC(z_rarg1_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3371
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3372
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3373
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3374
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3375
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3376
operand rarg2RegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3377
  constraint(ALLOC_IN_RC(z_rarg2_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3378
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3379
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3380
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3381
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3382
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3383
operand rarg3RegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3384
  constraint(ALLOC_IN_RC(z_rarg3_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3385
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3386
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3387
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3388
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3389
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3390
operand rarg4RegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3391
  constraint(ALLOC_IN_RC(z_rarg4_int_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3392
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3393
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3394
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3395
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3396
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3397
operand rarg5RegN() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3398
  constraint(ALLOC_IN_RC(z_rarg5_ptrN_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3399
  match(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3400
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3401
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3402
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3403
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3404
// Long Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3405
operand iRegL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3406
  constraint(ALLOC_IN_RC(z_long_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3407
  match(RegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3408
  match(revenRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3409
  match(roddRegL);
54542
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  3410
  match(allRoddRegL);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3411
  match(rarg1RegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3412
  match(rarg5RegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3413
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3414
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3415
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3416
47606
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  3417
// revenRegL and roddRegL constitute and even-odd-pair.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3418
operand revenRegL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3419
  constraint(ALLOC_IN_RC(z_rarg3_long_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3420
  match(iRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3421
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3422
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3423
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3424
47606
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  3425
// revenRegL and roddRegL constitute and even-odd-pair.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3426
operand roddRegL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3427
  constraint(ALLOC_IN_RC(z_rarg4_long_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3428
  match(iRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3429
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3430
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3431
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3432
54542
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  3433
// available odd registers for iRegL
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  3434
operand allRoddRegL() %{
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  3435
  constraint(ALLOC_IN_RC(z_long_odd_reg));
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  3436
  match(iRegL);
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  3437
  format %{ %}
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  3438
  interface(REG_INTER);
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  3439
%}
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  3440
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3441
operand rarg1RegL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3442
  constraint(ALLOC_IN_RC(z_rarg1_long_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3443
  match(iRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3444
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3445
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3446
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3447
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3448
operand rarg5RegL() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3449
  constraint(ALLOC_IN_RC(z_rarg5_long_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3450
  match(iRegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3451
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3452
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3453
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3454
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3455
// Condition Code Flag Registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3456
operand flagsReg() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3457
  constraint(ALLOC_IN_RC(z_condition_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3458
  match(RegFlags);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3459
  format %{ "CR" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3460
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3461
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3462
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3463
// Condition Code Flag Registers for rules with result tuples
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3464
operand TD_flagsReg() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3465
  constraint(ALLOC_IN_RC(z_condition_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3466
  match(RegFlags);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3467
  format %{ "CR" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3468
  interface(REG_TUPLE_DEST_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3469
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3470
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3471
operand regD() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3472
  constraint(ALLOC_IN_RC(z_dbl_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3473
  match(RegD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3474
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3475
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3476
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3477
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3478
operand rscratchRegD() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3479
  constraint(ALLOC_IN_RC(z_rscratch1_dbl_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3480
  match(RegD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3481
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3482
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3483
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3484
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3485
operand regF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3486
  constraint(ALLOC_IN_RC(z_flt_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3487
  match(RegF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3488
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3489
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3490
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3491
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3492
operand rscratchRegF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3493
  constraint(ALLOC_IN_RC(z_rscratch1_flt_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3494
  match(RegF);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3495
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3496
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3497
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3498
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3499
// Special Registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3500
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3501
// Method Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3502
operand inline_cache_regP(iRegP reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3503
  constraint(ALLOC_IN_RC(z_r9_regP)); // inline_cache_reg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3504
  match(reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3505
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3506
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3507
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3508
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3509
operand compiler_method_oop_regP(iRegP reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3510
  constraint(ALLOC_IN_RC(z_r1_RegP)); // compiler_method_oop_reg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3511
  match(reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3512
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3513
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3514
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3515
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3516
operand interpreter_method_oop_regP(iRegP reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3517
  constraint(ALLOC_IN_RC(z_r9_regP)); // interpreter_method_oop_reg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3518
  match(reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3519
  format %{ %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3520
  interface(REG_INTER);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3521
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3522
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3523
// Operands to remove register moves in unscaled mode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3524
// 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
  3525
operand iRegP2N(iRegP reg) %{
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  3526
  predicate(CompressedOops::shift() == 0 && _leaf->as_EncodeP()->in(0) == NULL);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3527
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3528
  match(EncodeP reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3529
  format %{ "$reg" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3530
  interface(REG_INTER)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3531
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3532
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3533
operand iRegN2P(iRegN reg) %{
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  3534
  predicate(CompressedOops::base() == NULL && CompressedOops::shift() == 0 &&
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3535
            _leaf->as_DecodeN()->in(0) == NULL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3536
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3537
  match(DecodeN reg);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3538
  format %{ "$reg" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3539
  interface(REG_INTER)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3540
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3541
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3542
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3543
//----------Complex Operands---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3544
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3545
// Indirect Memory Reference
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3546
operand indirect(memoryRegP base) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3547
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3548
  match(base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3549
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3550
  format %{ "#0[,$base]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3551
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3552
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3553
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3554
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3555
    disp(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3556
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3557
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3558
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3559
// Indirect with Offset (long)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3560
operand indOffset20(memoryRegP base, immL20 offset) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3561
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3562
  match(AddP base offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3563
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3564
  format %{ "$offset[,$base]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3565
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3566
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3567
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3568
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3569
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3570
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3571
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3572
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3573
operand indOffset20Narrow(iRegN base, immL20 offset) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3574
  predicate(Matcher::narrow_oop_use_complex_address());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3575
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3576
  match(AddP (DecodeN base) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3577
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3578
  format %{ "$offset[,$base]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3579
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3580
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3581
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3582
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3583
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3584
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3585
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3586
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3587
// Indirect with Offset (short)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3588
operand indOffset12(memoryRegP base, uimmL12 offset) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3589
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3590
  match(AddP base offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3591
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3592
  format %{ "$offset[[,$base]]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3593
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3594
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3595
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3596
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3597
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3598
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3599
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3600
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3601
operand indOffset12Narrow(iRegN base, uimmL12 offset) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3602
  predicate(Matcher::narrow_oop_use_complex_address());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3603
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3604
  match(AddP (DecodeN base) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3605
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3606
  format %{ "$offset[[,$base]]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3607
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3608
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3609
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3610
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3611
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3612
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3613
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3614
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3615
// Indirect with Register Index
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3616
operand indIndex(memoryRegP base, iRegL index) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3617
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3618
  match(AddP base index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3619
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3620
  format %{ "#0[($index,$base)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3621
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3622
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3623
    index($index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3624
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3625
    disp(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3626
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3627
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3628
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3629
// Indirect with Offset (long) and index
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3630
operand indOffset20index(memoryRegP base, immL20 offset, iRegL index) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3631
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3632
  match(AddP (AddP base index) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3633
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3634
  format %{ "$offset[($index,$base)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3635
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3636
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3637
    index($index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3638
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3639
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3640
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3641
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3642
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3643
operand indOffset20indexNarrow(iRegN base, immL20 offset, iRegL index) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3644
  predicate(Matcher::narrow_oop_use_complex_address());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3645
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3646
  match(AddP (AddP (DecodeN base) index) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3647
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3648
  format %{ "$offset[($index,$base)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3649
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3650
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3651
    index($index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3652
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3653
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3654
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3655
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3656
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3657
// Indirect with Offset (short) and index
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3658
operand indOffset12index(memoryRegP base, uimmL12 offset, iRegL index) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3659
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3660
  match(AddP (AddP base index) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3661
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3662
  format %{ "$offset[[($index,$base)]]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3663
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3664
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3665
    index($index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3666
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3667
    disp($offset);
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
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3671
operand indOffset12indexNarrow(iRegN base, uimmL12 offset, iRegL index) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3672
  predicate(Matcher::narrow_oop_use_complex_address());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3673
  constraint(ALLOC_IN_RC(z_memory_ptr_reg));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3674
  match(AddP (AddP (DecodeN base) index) offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3675
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3676
  format %{ "$offset[[($index,$base)]]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3677
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3678
    base($base);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3679
    index($index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3680
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3681
    disp($offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3682
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3683
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3684
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3685
//----------Special Memory Operands--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3686
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3687
// Stack Slot Operand
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3688
// This operand is used for loading and storing temporary values on
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3689
// the stack where a match requires a value to flow through memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3690
operand stackSlotI(sRegI reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3691
  constraint(ALLOC_IN_RC(stack_slots));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3692
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3693
  format %{ "[$reg(stackSlotI)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3694
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3695
    base(0xf);   // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3696
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3697
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3698
    disp($reg);  // stack offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3699
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3700
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3701
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3702
operand stackSlotP(sRegP reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3703
  constraint(ALLOC_IN_RC(stack_slots));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3704
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3705
  format %{ "[$reg(stackSlotP)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3706
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3707
    base(0xf);   // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3708
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3709
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3710
    disp($reg);  // Stack Offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3711
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3712
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3713
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3714
operand stackSlotF(sRegF reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3715
  constraint(ALLOC_IN_RC(stack_slots));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3716
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3717
  format %{ "[$reg(stackSlotF)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3718
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3719
    base(0xf);   // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3720
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3721
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3722
    disp($reg);  // Stack Offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3723
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3724
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3725
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3726
operand stackSlotD(sRegD reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3727
  constraint(ALLOC_IN_RC(stack_slots));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3728
  op_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3729
  //match(RegD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3730
  format %{ "[$reg(stackSlotD)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3731
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3732
    base(0xf);   // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3733
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3734
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3735
    disp($reg);  // Stack Offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3736
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3737
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3738
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3739
operand stackSlotL(sRegL reg) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3740
  constraint(ALLOC_IN_RC(stack_slots));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3741
  op_cost(1);  //match(RegL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3742
  format %{ "[$reg(stackSlotL)]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3743
  interface(MEMORY_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3744
    base(0xf);   // Z_SP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3745
    index(0xffffFFFF); // noreg
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3746
    scale(0x0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3747
    disp($reg);  // Stack Offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3748
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3749
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3750
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3751
// Operands for expressing Control Flow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3752
// NOTE: Label is a predefined operand which should not be redefined in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3753
// the AD file. It is generically handled within the ADLC.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3754
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3755
//----------Conditional Branch Operands----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3756
// Comparison Op  - This is the operation of the comparison, and is limited to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3757
//                  the following set of codes:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3758
//                  L (<), LE (<=), G (>), GE (>=), E (==), NE (!=)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3759
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3760
// Other attributes of the comparison, such as unsignedness, are specified
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3761
// by the comparison instruction that sets a condition code flags register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3762
// That result is represented by a flags operand whose subtype is appropriate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3763
// to the unsignedness (etc.) of the comparison.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3764
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3765
// Later, the instruction which matches both the Comparison Op (a Bool) and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3766
// the flags (produced by the Cmp) specifies the coding of the comparison op
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3767
// by matching a specific subtype of Bool operand below.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3768
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3769
// INT cmpOps for CompareAndBranch and CompareAndTrap instructions should not
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3770
// have mask bit #3 set.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3771
operand cmpOpT() %{
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);         // Assembler::bcondEqual
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3776
    not_equal(0x6);     // Assembler::bcondNotEqual
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3777
    less(0x4);          // Assembler::bcondLow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3778
    greater_equal(0xa); // Assembler::bcondNotLow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3779
    less_equal(0xc);    // Assembler::bcondNotHigh
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3780
    greater(0x2);       // Assembler::bcondHigh
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
// When used for floating point comparisons: unordered is treated as less.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3787
operand cmpOpF() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3788
  match(Bool);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3789
  format %{ "" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3790
  interface(COND_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3791
    equal(0x8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3792
    not_equal(0x7);     // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3793
    less(0x5);          // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3794
    greater_equal(0xa);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3795
    less_equal(0xd);    // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3796
    greater(0x2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3797
    overflow(0x0);      // Not meaningful on z/Architecture.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3798
    no_overflow(0x0);   // leave unchanged (zero) therefore
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3799
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3800
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3801
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3802
// "Regular" cmpOp for int comparisons, includes bit #3 (overflow).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3803
operand cmpOp() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3804
  match(Bool);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3805
  format %{ "" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3806
  interface(COND_INTER) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3807
    equal(0x8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3808
    not_equal(0x7);     // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3809
    less(0x5);          // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3810
    greater_equal(0xa);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3811
    less_equal(0xd);    // Includes 'unordered'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3812
    greater(0x2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3813
    overflow(0x1);      // Assembler::bcondOverflow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3814
    no_overflow(0xe);   // Assembler::bcondNotOverflow
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3815
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3816
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3817
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3818
//----------OPERAND CLASSES----------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3819
// Operand Classes are groups of operands that are used to simplify
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3820
// instruction definitions by not requiring the AD writer to specify
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3821
// seperate instructions for every form of operand when the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3822
// instruction accepts multiple operand types with the same basic
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3823
// encoding and format.  The classic case of this is memory operands.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3824
// Indirect is not included since its use is limited to Compare & Swap
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3825
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3826
// Most general memory operand, allows base, index, and long displacement.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3827
opclass memory(indirect, indIndex, indOffset20, indOffset20Narrow, indOffset20index, indOffset20indexNarrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3828
opclass memoryRXY(indirect, indIndex, indOffset20, indOffset20Narrow, indOffset20index, indOffset20indexNarrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3829
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3830
// General memory operand, allows base, index, and short displacement.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3831
opclass memoryRX(indirect, indIndex, indOffset12, indOffset12Narrow, indOffset12index, indOffset12indexNarrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3832
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3833
// Memory operand, allows only base and long displacement.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3834
opclass memoryRSY(indirect, indOffset20, indOffset20Narrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3835
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3836
// Memory operand, allows only base and short displacement.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3837
opclass memoryRS(indirect, indOffset12, indOffset12Narrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3838
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3839
// Operand classes to match encode and decode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3840
opclass iRegN_P2N(iRegN);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3841
opclass iRegP_N2P(iRegP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3842
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3843
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3844
//----------PIPELINE-----------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3845
pipeline %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3846
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3847
//----------ATTRIBUTES---------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3848
attributes %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3849
  // z/Architecture instructions are of length 2, 4, or 6 bytes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3850
  variable_size_instructions;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3851
  instruction_unit_size = 2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3852
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3853
  // Meaningless on z/Architecture.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3854
  max_instructions_per_bundle = 1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3855
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3856
  // The z/Architecture processor fetches 64 bytes...
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3857
  instruction_fetch_unit_size = 64;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3858
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3859
  // ...in one line.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3860
  instruction_fetch_units = 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3861
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3862
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3863
//----------RESOURCES----------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3864
// Resources are the functional units available to the machine.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3865
resources(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3866
   Z_BR,     // branch unit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3867
   Z_CR,     // condition unit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3868
   Z_FX1,    // integer arithmetic unit 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3869
   Z_FX2,    // integer arithmetic unit 2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3870
   Z_LDST1,  // load/store unit 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3871
   Z_LDST2,  // load/store unit 2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3872
   Z_FP1,    // float arithmetic unit 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3873
   Z_FP2,    // float arithmetic unit 2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3874
   Z_LDST = Z_LDST1 | Z_LDST2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3875
   Z_FX   = Z_FX1 | Z_FX2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3876
   Z_FP   = Z_FP1 | Z_FP2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3877
  );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3878
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3879
//----------PIPELINE DESCRIPTION-----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3880
// Pipeline Description specifies the stages in the machine's pipeline.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3881
pipe_desc(
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3882
   // TODO: adapt
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3883
   Z_IF,  // instruction fetch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3884
   Z_IC,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3885
   Z_D0,  // decode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3886
   Z_D1,  // decode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3887
   Z_D2,  // decode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3888
   Z_D3,  // decode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3889
   Z_Xfer1,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3890
   Z_GD,  // group definition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3891
   Z_MP,  // map
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3892
   Z_ISS, // issue
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3893
   Z_RF,  // resource fetch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3894
   Z_EX1, // execute (all units)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3895
   Z_EX2, // execute (FP, LDST)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3896
   Z_EX3, // execute (FP, LDST)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3897
   Z_EX4, // execute (FP)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3898
   Z_EX5, // execute (FP)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3899
   Z_EX6, // execute (FP)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3900
   Z_WB,  // write back
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3901
   Z_Xfer2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3902
   Z_CP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3903
  );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3904
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3905
//----------PIPELINE CLASSES---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3906
// Pipeline Classes describe the stages in which input and output are
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3907
// referenced by the hardware pipeline.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3908
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3909
// Providing the `ins_pipe' declarations in the instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3910
// specifications seems to be of little use. So we use
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3911
// `pipe_class_dummy' for all our instructions at present.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3912
pipe_class pipe_class_dummy() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3913
  single_instruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3914
  fixed_latency(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3915
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3916
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3917
// SIGTRAP based implicit range checks in compiled code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3918
// Currently, no pipe classes are used on z/Architecture.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3919
pipe_class pipe_class_trap() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3920
  single_instruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3921
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3922
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3923
pipe_class pipe_class_fx_reg_reg(iRegI dst, iRegI src1, iRegI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3924
  single_instruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3925
  dst  : Z_EX1(write);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3926
  src1 : Z_RF(read);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3927
  src2 : Z_RF(read);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3928
  Z_FX : Z_RF;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3929
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3930
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3931
pipe_class pipe_class_ldst(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3932
  single_instruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3933
  mem : Z_RF(read);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3934
  dst : Z_WB(write);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3935
  Z_LDST : Z_RF;
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
define %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3939
  MachNop = pipe_class_dummy;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3940
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3941
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3942
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3943
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3944
//----------INSTRUCTIONS-------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3945
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3946
//---------- Chain stack slots between similar types --------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3947
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3948
// Load integer from stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3949
instruct stkI_to_regI(iRegI dst, stackSlotI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3950
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3951
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3952
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3953
  format %{ "L       $dst,$src\t # stk reload int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3954
  opcode(L_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3955
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3956
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3957
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3958
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3959
// Store integer to stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3960
instruct regI_to_stkI(stackSlotI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3961
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3962
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3963
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3964
  format %{ "ST      $src,$dst\t # stk spill int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3965
  opcode(ST_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3966
  ins_encode(z_form_rt_mem(src, dst)); // rs=rt
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3967
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3968
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3969
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3970
// Load long from stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3971
instruct stkL_to_regL(iRegL dst, stackSlotL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3972
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3973
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3974
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3975
  format %{ "LG      $dst,$src\t # stk reload long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3976
  opcode(LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3977
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3978
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3979
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3980
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3981
// Store long to stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3982
instruct regL_to_stkL(stackSlotL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3983
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3984
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3985
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3986
  format %{ "STG     $src,$dst\t # stk spill long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3987
  opcode(STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3988
  ins_encode(z_form_rt_mem(src, dst)); // rs=rt
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3989
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3990
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3991
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3992
// Load pointer from stack slot, 64-bit encoding.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3993
instruct stkP_to_regP(iRegP dst, stackSlotP src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3994
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3995
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3996
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3997
  format %{ "LG      $dst,$src\t # stk reload ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3998
  opcode(LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3999
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4000
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4001
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4002
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4003
// Store pointer to stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4004
instruct regP_to_stkP(stackSlotP dst, iRegP src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4005
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4006
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4007
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4008
  format %{ "STG     $src,$dst\t # stk spill ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4009
  opcode(STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4010
  ins_encode(z_form_rt_mem(src, dst)); // rs=rt
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4011
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4012
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4013
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4014
//  Float types
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4015
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4016
// Load float value from stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4017
instruct stkF_to_regF(regF dst, stackSlotF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4018
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4019
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4020
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4021
  format %{ "LE(Y)   $dst,$src\t # stk reload float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4022
  opcode(LE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4023
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4024
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4025
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4026
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4027
// Store float value to stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4028
instruct regF_to_stkF(stackSlotF dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4029
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4030
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4031
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4032
  format %{ "STE(Y)  $src,$dst\t # stk spill float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4033
  opcode(STE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4034
  ins_encode(z_form_rt_mem(src, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4035
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4036
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4037
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4038
// Load double value from stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4039
instruct stkD_to_regD(regD dst, stackSlotD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4040
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4041
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4042
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4043
  format %{ "LD(Y)   $dst,$src\t # stk reload double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4044
  opcode(LD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4045
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4046
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4047
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4048
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4049
// Store double value to stack slot.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4050
instruct regD_to_stkD(stackSlotD dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4051
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4052
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4053
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4054
  format %{ "STD(Y)  $src,$dst\t # stk spill double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4055
  opcode(STD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4056
  ins_encode(z_form_rt_mem(src, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4057
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4058
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4059
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4060
//----------Load/Store/Move Instructions---------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4061
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4062
//----------Load Instructions--------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4063
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4064
//------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4065
//  MEMORY
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4066
//------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4067
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4068
//  BYTE
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4069
// Load Byte (8bit signed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4070
instruct loadB(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4071
  match(Set dst (LoadB mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4072
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4073
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4074
  format %{ "LB      $dst, $mem\t # sign-extend byte to int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4075
  opcode(LB_ZOPC, LB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4076
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4077
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4078
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4079
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4080
// Load Byte (8bit signed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4081
instruct loadB2L(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4082
  match(Set dst (ConvI2L (LoadB mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4083
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4084
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4085
  format %{ "LGB     $dst, $mem\t # sign-extend byte to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4086
  opcode(LGB_ZOPC, LGB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4087
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4088
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4089
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4090
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4091
// Load Unsigned Byte (8bit UNsigned) into an int reg.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4092
instruct loadUB(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4093
  match(Set dst (LoadUB mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4094
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4095
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4096
  format %{ "LLGC    $dst,$mem\t # zero-extend byte to int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4097
  opcode(LLGC_ZOPC, LLGC_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4098
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4099
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4100
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4101
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4102
// Load Unsigned Byte (8bit UNsigned) into a Long Register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4103
instruct loadUB2L(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4104
  match(Set dst (ConvI2L (LoadUB mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4105
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4106
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4107
  format %{ "LLGC    $dst,$mem\t # zero-extend byte to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4108
  opcode(LLGC_ZOPC, LLGC_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4109
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4110
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4111
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4112
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4113
// CHAR/SHORT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4114
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4115
// Load Short (16bit signed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4116
instruct loadS(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4117
  match(Set dst (LoadS mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4118
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4119
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4120
  format %{ "LH(Y)   $dst,$mem\t # sign-extend short to int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4121
  opcode(LHY_ZOPC, LH_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4122
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4123
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4124
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4125
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4126
// Load Short (16bit signed)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4127
instruct loadS2L(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4128
  match(Set dst (ConvI2L (LoadS mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4129
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4130
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4131
  format %{ "LGH     $dst,$mem\t # sign-extend short to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4132
  opcode(LGH_ZOPC, LGH_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4133
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4134
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4135
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4136
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4137
// Load Char (16bit Unsigned)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4138
instruct loadUS(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4139
  match(Set dst (LoadUS mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4140
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4141
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4142
  format %{ "LLGH    $dst,$mem\t # zero-extend short to int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4143
  opcode(LLGH_ZOPC, LLGH_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4144
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4145
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4146
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4147
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4148
// Load Unsigned Short/Char (16bit UNsigned) into a Long Register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4149
instruct loadUS2L(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4150
  match(Set dst (ConvI2L (LoadUS mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4151
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4152
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4153
  format %{ "LLGH    $dst,$mem\t # zero-extend short to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4154
  opcode(LLGH_ZOPC, LLGH_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4155
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4156
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4157
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4158
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4159
// INT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4160
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4161
// Load Integer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4162
instruct loadI(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4163
  match(Set dst (LoadI mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4164
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4165
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4166
  format %{ "L(Y)    $dst,$mem\t #" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4167
  opcode(LY_ZOPC, L_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4168
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4169
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4170
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4171
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4172
// Load and convert to long.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4173
instruct loadI2L(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4174
  match(Set dst (ConvI2L (LoadI mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4175
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4176
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4177
  format %{ "LGF     $dst,$mem\t #" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4178
  opcode(LGF_ZOPC, LGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4179
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4180
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4181
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4182
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4183
// Load Unsigned Integer into a Long Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4184
instruct loadUI2L(iRegL dst, memory mem, immL_FFFFFFFF mask) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4185
  match(Set dst (AndL (ConvI2L (LoadI mem)) mask));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4186
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4187
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4188
  format %{ "LLGF    $dst,$mem\t # zero-extend int to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4189
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4190
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4191
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4192
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4193
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4194
// range = array length (=jint)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4195
// Load Range
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4196
instruct loadRange(iRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4197
  match(Set dst (LoadRange mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4198
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4199
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4200
  format %{ "L(Y)    $dst,$mem\t # range" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4201
  opcode(LY_ZOPC, L_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4202
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4203
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4204
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4205
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4206
// LONG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4207
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4208
// Load Long - aligned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4209
instruct loadL(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4210
  match(Set dst (LoadL mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4211
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4212
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4213
  format %{ "LG      $dst,$mem\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4214
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4215
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4216
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4217
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4218
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4219
// Load Long - UNaligned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4220
instruct loadL_unaligned(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4221
  match(Set dst (LoadL_unaligned mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4222
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4223
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4224
  format %{ "LG      $dst,$mem\t # unaligned long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4225
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4226
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4227
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4228
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4229
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4230
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4231
// PTR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4232
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4233
// Load Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4234
instruct loadP(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4235
  match(Set dst (LoadP mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4236
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4237
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4238
  format %{ "LG      $dst,$mem\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4239
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4240
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4241
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4242
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4243
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4244
// LoadP + CastP2L
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4245
instruct castP2X_loadP(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4246
  match(Set dst (CastP2X (LoadP mem)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4247
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4248
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4249
  format %{ "LG      $dst,$mem\t # ptr + p2x" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4250
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4251
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4252
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4253
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4254
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4255
// Load Klass Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4256
instruct loadKlass(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4257
  match(Set dst (LoadKlass mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4258
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4259
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4260
  format %{ "LG      $dst,$mem\t # klass ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4261
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4262
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4263
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4264
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4265
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4266
instruct loadTOC(iRegL dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4267
  effect(DEF dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4268
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4269
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4270
  // TODO: check why this attribute causes many unnecessary rematerializations.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4271
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4272
  // The graphs I saw just had high register pressure. Further the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4273
  // register TOC is loaded to is overwritten by the constant short
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4274
  // after. Here something as round robin register allocation might
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4275
  // help. But rematerializing seems not to hurt, jack even seems to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4276
  // improve slightly.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4277
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4278
  // Without this flag we get spill-split recycle sanity check
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4279
  // failures in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4280
  // spec.benchmarks._228_jack.NfaState::GenerateCode. This happens in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4281
  // a block with three loadConP_dynTOC nodes and a tlsLoadP. The
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4282
  // tlsLoadP has a huge amount of outs and forces the TOC down to the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4283
  // stack. Later tlsLoadP is rematerialized, leaving the register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4284
  // allocator with TOC on the stack and a badly placed reload.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4285
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4286
  format %{ "LARL    $dst, &constant_pool\t; load dynTOC" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4287
  ins_encode %{ __ load_toc($dst$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4288
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4289
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4290
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4291
// FLOAT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4292
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4293
// Load Float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4294
instruct loadF(regF dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4295
  match(Set dst (LoadF mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4296
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4297
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4298
  format %{ "LE(Y)    $dst,$mem" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4299
  opcode(LEY_ZOPC, LE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4300
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4301
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4302
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4303
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4304
// DOUBLE
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4305
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4306
// Load Double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4307
instruct loadD(regD dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4308
  match(Set dst (LoadD mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4309
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4310
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4311
  format %{ "LD(Y)    $dst,$mem" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4312
  opcode(LDY_ZOPC, LD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4313
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4314
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4315
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4316
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4317
// Load Double - UNaligned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4318
instruct loadD_unaligned(regD dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4319
  match(Set dst (LoadD_unaligned mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4320
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4321
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4322
  format %{ "LD(Y)    $dst,$mem" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4323
  opcode(LDY_ZOPC, LD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4324
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4325
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4326
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4327
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4328
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4329
//----------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4330
//  IMMEDIATES
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4331
//----------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4332
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4333
instruct loadConI(iRegI dst, immI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4334
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4335
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4336
  size(6);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  4337
  format %{ "LGFI    $dst,$src\t # (int)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4338
  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
  4339
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4340
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4341
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4342
instruct loadConI16(iRegI dst, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4343
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4344
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4345
  size(4);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  4346
  format %{ "LGHI    $dst,$src\t # (int)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4347
  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
  4348
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4349
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4350
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4351
instruct loadConI_0(iRegI dst, immI_0 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4352
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4353
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4354
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4355
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4356
  format %{ "loadConI $dst,$src\t # (int) XGR because ZERO is loaded" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4357
  opcode(XGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4358
  ins_encode(z_rreform(dst, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4359
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4360
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4361
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4362
instruct loadConUI16(iRegI dst, uimmI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4363
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4364
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4365
  format %{ "LLILL    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4366
  opcode(LLILL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4367
  ins_encode(z_riform_unsigned(dst, src) );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4368
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4369
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4370
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4371
// Load long constant from TOC with pcrelative address.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4372
instruct loadConL_pcrelTOC(iRegL dst, immL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4373
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4374
  ins_cost(MEMORY_REF_COST_LO);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4375
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4376
  format %{ "LGRL    $dst,[pcrelTOC]\t # load long $src from table" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4377
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4378
    address long_address = __ long_constant($src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4379
    if (long_address == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4380
      Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4381
      return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4382
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4383
    __ load_long_pcrelative($dst$$Register, long_address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4384
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4385
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4386
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4387
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4388
instruct loadConL32(iRegL dst, immL32 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4389
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4390
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4391
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4392
  format %{ "LGFI     $dst,$src\t # (long)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4393
  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
  4394
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4395
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4396
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4397
instruct loadConL16(iRegL dst, immL16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4398
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4399
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4400
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4401
  format %{ "LGHI     $dst,$src\t # (long)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4402
  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
  4403
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4404
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4405
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4406
instruct loadConL_0(iRegL dst, immL_0 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4407
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4408
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4409
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4410
  format %{ "LoadConL    $dst,$src\t # (long) XGR because ZERO is loaded" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4411
  opcode(XGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4412
  ins_encode(z_rreform(dst, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4413
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4414
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4415
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4416
// Load ptr constant from TOC with pc relative address.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4417
// Special handling for oop constants required.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4418
instruct loadConP_pcrelTOC(iRegP dst, immP src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4419
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4420
  ins_cost(MEMORY_REF_COST_LO);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4421
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4422
  format %{ "LGRL    $dst,[pcrelTOC]\t # load ptr $src from table" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4423
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4424
    relocInfo::relocType constant_reloc = $src->constant_reloc();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4425
    if (constant_reloc == relocInfo::oop_type) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4426
      AddressLiteral a = __ allocate_oop_address((jobject)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4427
      bool success = __ load_oop_from_toc($dst$$Register, a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4428
      if (!success) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4429
        Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4430
        return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4431
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4432
    } else if (constant_reloc == relocInfo::metadata_type) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4433
      AddressLiteral a = __ constant_metadata_address((Metadata *)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4434
      address const_toc_addr = __ address_constant((address)a.value(), RelocationHolder::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4435
      if (const_toc_addr == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4436
        Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4437
        return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4438
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4439
      __ load_long_pcrelative($dst$$Register, const_toc_addr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4440
    } else {          // Non-oop pointers, e.g. card mark base, heap top.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4441
      address long_address = __ long_constant((jlong)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4442
      if (long_address == NULL) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4443
        Compile::current()->env()->record_out_of_memory_failure();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4444
        return;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4445
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4446
      __ load_long_pcrelative($dst$$Register, long_address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4447
    }
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
// We don't use immP16 to avoid problems with oops.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4453
instruct loadConP0(iRegP dst, immP0 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4454
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4455
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4456
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4457
  format %{ "XGR     $dst,$dst\t # NULL ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4458
  opcode(XGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4459
  ins_encode(z_rreform(dst, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4460
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4461
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4462
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4463
//----------Load Float Constant Instructions-------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4464
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4465
// We may not specify this instruction via an `expand' rule. If we do,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4466
// code selection will forget that this instruction needs a floating
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4467
// point constant inserted into the code buffer. So `Shorten_branches'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4468
// will fail.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4469
instruct loadConF_dynTOC(regF dst, immF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4470
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4471
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4472
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4473
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4474
  // If this instruction rematerializes, it prolongs the live range
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4475
  // of the toc node, causing illegal graphs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4476
  ins_cannot_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4477
  format %{ "LE(Y)    $dst,$constantoffset[,$constanttablebase]\t # load FLOAT $src from table" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4478
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4479
    __ load_float_largeoffset($dst$$FloatRegister, $constantoffset($src), $constanttablebase, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4480
  %}
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
// E may not specify this instruction via an `expand' rule. If we do,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4485
// code selection will forget that this instruction needs a floating
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4486
// point constant inserted into the code buffer. So `Shorten_branches'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4487
// will fail.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4488
instruct loadConD_dynTOC(regD dst, immD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4489
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4490
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4491
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4492
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4493
  // If this instruction rematerializes, it prolongs the live range
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4494
  // of the toc node, causing illegal graphs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4495
  ins_cannot_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4496
  format %{ "LD(Y)    $dst,$constantoffset[,$constanttablebase]\t # load DOUBLE $src from table" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4497
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4498
    __ load_double_largeoffset($dst$$FloatRegister, $constantoffset($src), $constanttablebase, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4499
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4500
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4501
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4502
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4503
// Special case: Load Const 0.0F
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4504
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4505
// There's a special instr to clear a FP register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4506
instruct loadConF0(regF dst, immFp0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4507
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4508
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4509
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4510
  format %{ "LZER     $dst,$src\t # clear to zero" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4511
  opcode(LZER_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4512
  ins_encode(z_rreform(dst, Z_F0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4513
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4514
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4515
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4516
// There's a special instr to clear a FP register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4517
instruct loadConD0(regD dst, immDp0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4518
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4519
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4520
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4521
  format %{ "LZDR     $dst,$src\t # clear to zero" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4522
  opcode(LZDR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4523
  ins_encode(z_rreform(dst, Z_F0));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4524
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4525
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4526
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4527
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4528
//----------Store Instructions-------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4529
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4530
// BYTE
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4531
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4532
// Store Byte
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4533
instruct storeB(memory mem, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4534
  match(Set mem (StoreB mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4535
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4536
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4537
  format %{ "STC(Y)  $src,$mem\t # byte" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4538
  opcode(STCY_ZOPC, STC_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4539
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4540
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4541
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4542
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4543
instruct storeCM(memory mem, immI_0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4544
  match(Set mem (StoreCM mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4545
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4546
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4547
  format %{ "STC(Y)  $src,$mem\t # CMS card-mark byte (must be 0!)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4548
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4549
    guarantee($mem$$index$$Register != Z_R0, "content will not be used.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4550
    if ($mem$$index$$Register != noreg) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4551
      // Can't use clear_mem --> load const zero and store character.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4552
      __ load_const_optimized(Z_R0_scratch, (long)0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4553
      if (Immediate::is_uimm12($mem$$disp)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4554
        __ z_stc(Z_R0_scratch, $mem$$Address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4555
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4556
        __ z_stcy(Z_R0_scratch, $mem$$Address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4557
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4558
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4559
      __ clear_mem(Address($mem$$Address), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4560
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4561
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4562
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4563
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4564
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4565
// CHAR/SHORT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4566
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4567
// Store Char/Short
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4568
instruct storeC(memory mem, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4569
  match(Set mem (StoreC mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4570
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4571
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4572
  format %{ "STH(Y)  $src,$mem\t # short" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4573
  opcode(STHY_ZOPC, STH_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4574
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4575
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4576
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4577
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4578
// INT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4579
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4580
// Store Integer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4581
instruct storeI(memory mem, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4582
  match(Set mem (StoreI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4583
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4584
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4585
  format %{ "ST(Y)   $src,$mem\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4586
  opcode(STY_ZOPC, ST_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4587
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4588
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4589
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4590
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4591
// LONG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4592
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4593
// Store Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4594
instruct storeL(memory mem, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4595
  match(Set mem (StoreL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4596
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4597
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4598
  format %{ "STG     $src,$mem\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4599
  opcode(STG_ZOPC, STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4600
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4601
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4602
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4603
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4604
// PTR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4605
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4606
// Store Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4607
instruct storeP(memory dst, memoryRegP src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4608
  match(Set dst (StoreP dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4609
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4610
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4611
  format %{ "STG     $src,$dst\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4612
  opcode(STG_ZOPC, STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4613
  ins_encode(z_form_rt_mem_opt(src, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4614
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4615
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4616
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4617
// FLOAT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4618
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4619
// Store Float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4620
instruct storeF(memory mem, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4621
  match(Set mem (StoreF mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4622
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4623
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4624
  format %{ "STE(Y)   $src,$mem\t # float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4625
  opcode(STEY_ZOPC, STE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4626
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4627
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4628
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4629
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4630
// DOUBLE
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4631
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4632
// Store Double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4633
instruct storeD(memory mem, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4634
  match(Set mem (StoreD mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4635
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4636
  size(Z_DISP_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4637
  format %{ "STD(Y)   $src,$mem\t # double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4638
  opcode(STDY_ZOPC, STD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4639
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4640
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4641
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4642
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4643
// Prefetch instructions. Must be safe to execute with invalid address (cannot fault).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4644
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4645
// Should support match rule for PrefetchAllocation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4646
// Still needed after 8068977 for PrefetchAllocate.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4647
instruct prefetchAlloc(memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4648
  match(PrefetchAllocation mem);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4649
  predicate(VM_Version::has_Prefetch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4650
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4651
  format %{ "PREFETCH 2, $mem\t # Prefetch allocation, z10 only" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4652
  ins_encode %{ __ z_pfd(0x02, $mem$$Address); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4653
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4654
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4655
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4656
//----------Memory init instructions------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4657
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4658
// Move Immediate to 1-byte memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4659
instruct memInitB(memoryRSY mem, immI8 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4660
  match(Set mem (StoreB mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4661
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4662
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4663
  format %{ "MVI     $mem,$src\t # direct mem init 1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4664
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4665
    if (Immediate::is_uimm12((long)$mem$$disp)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4666
      __ z_mvi($mem$$Address, $src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4667
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4668
      __ z_mviy($mem$$Address, $src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4669
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4670
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4671
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4672
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4673
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4674
// Move Immediate to 2-byte memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4675
instruct memInitC(memoryRS mem, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4676
  match(Set mem (StoreC mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4677
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4678
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4679
  format %{ "MVHHI   $mem,$src\t # direct mem init 2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4680
  opcode(MVHHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4681
  ins_encode(z_silform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4682
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4683
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4684
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4685
// Move Immediate to 4-byte memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4686
instruct memInitI(memoryRS mem, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4687
  match(Set mem (StoreI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4688
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4689
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4690
  format %{ "MVHI    $mem,$src\t # direct mem init 4" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4691
  opcode(MVHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4692
  ins_encode(z_silform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4693
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4694
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4695
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4696
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4697
// Move Immediate to 8-byte memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4698
instruct memInitL(memoryRS mem, immL16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4699
  match(Set mem (StoreL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4700
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4701
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4702
  format %{ "MVGHI   $mem,$src\t # direct mem init 8" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4703
  opcode(MVGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4704
  ins_encode(z_silform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4705
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4706
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4707
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4708
// Move Immediate to 8-byte memory.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4709
instruct memInitP(memoryRS mem, immP16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4710
  match(Set mem (StoreP mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4711
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4712
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4713
  format %{ "MVGHI   $mem,$src\t # direct mem init 8" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4714
  opcode(MVGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4715
  ins_encode(z_silform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4716
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4717
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4718
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4719
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4720
//----------Instructions for compressed pointers (cOop and NKlass)-------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4721
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4722
// See cOop encoding classes for elaborate comment.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4723
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4724
// Moved here because it is needed in expand rules for encode.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4725
// Long negation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4726
instruct negL_reg_reg(iRegL dst, immL_0 zero, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4727
  match(Set dst (SubL zero src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4728
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4729
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4730
  format %{ "NEG     $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4731
  ins_encode %{ __ z_lcgr($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4732
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4733
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4734
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4735
// Load Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4736
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4737
// Load narrow oop
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4738
instruct loadN(iRegN dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4739
  match(Set dst (LoadN mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4740
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4741
  size(Z_DISP3_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  4742
  format %{ "LoadN   $dst,$mem\t # (cOop)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4743
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4744
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4745
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4746
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4747
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4748
// Load narrow Klass Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4749
instruct loadNKlass(iRegN dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4750
  match(Set dst (LoadNKlass mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4751
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4752
  size(Z_DISP3_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  4753
  format %{ "LoadNKlass $dst,$mem\t # (klass cOop)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4754
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4755
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4756
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4757
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4758
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4759
// Load constant Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4760
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4761
instruct loadConN(iRegN dst, immN src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4762
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4763
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4764
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4765
  format %{ "loadConN    $dst,$src\t # (cOop)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4766
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4767
    AddressLiteral cOop = __ constant_oop_address((jobject)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4768
    __ relocate(cOop.rspec(), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4769
    __ load_narrow_oop($dst$$Register, (narrowOop)cOop.value());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4770
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4771
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4772
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4773
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4774
instruct loadConN0(iRegN dst, immN0 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4775
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4776
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4777
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4778
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4779
  format %{ "loadConN    $dst,$src\t # (cOop) XGR because ZERO is loaded" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4780
  opcode(XGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4781
  ins_encode(z_rreform(dst, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4782
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4783
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4784
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4785
instruct loadConNKlass(iRegN dst, immNKlass src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4786
  match(Set dst src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4787
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4788
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4789
  format %{ "loadConNKlass $dst,$src\t # (cKlass)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4790
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4791
    AddressLiteral NKlass = __ constant_metadata_address((Metadata*)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4792
    __ relocate(NKlass.rspec(), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4793
    __ load_narrow_klass($dst$$Register, (Klass*)NKlass.value());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4794
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4795
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4796
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4797
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4798
// Load and Decode Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4799
// optimized variants for Unscaled cOops
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4800
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4801
instruct decodeLoadN(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4802
  match(Set dst (DecodeN (LoadN mem)));
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  4803
  predicate(false && (CompressedOops::base()==NULL)&&(CompressedOops::shift()==0));
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4804
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4805
  size(Z_DISP3_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  4806
  format %{ "DecodeLoadN  $dst,$mem\t # (cOop Load+Decode)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4807
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4808
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4809
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4810
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4811
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4812
instruct decodeLoadNKlass(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4813
  match(Set dst (DecodeNKlass (LoadNKlass mem)));
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  4814
  predicate(false && (CompressedKlassPointers::base()==NULL)&&(CompressedKlassPointers::shift()==0));
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4815
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4816
  size(Z_DISP3_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  4817
  format %{ "DecodeLoadNKlass  $dst,$mem\t # (load/decode NKlass)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4818
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4819
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4820
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4821
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4822
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4823
instruct decodeLoadConNKlass(iRegP dst, immNKlass src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4824
  match(Set dst (DecodeNKlass src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4825
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4826
  size(12);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4827
  format %{ "DecodeLoadConNKlass  $dst,$src\t # decode(cKlass)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4828
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4829
    AddressLiteral NKlass = __ constant_metadata_address((Metadata*)$src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4830
    __ relocate(NKlass.rspec(), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4831
    __ load_const($dst$$Register, (Klass*)NKlass.value());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4832
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4833
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4834
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4835
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4836
// Decode Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4837
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4838
// General decoder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4839
instruct decodeN(iRegP dst, iRegN src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4840
  match(Set dst (DecodeN src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4841
  effect(KILL cr);
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  4842
  predicate(CompressedOops::base() == NULL || !ExpandLoadingBaseDecode);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4843
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4844
  // TODO: s390 port size(VARIABLE_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  4845
  format %{ "decodeN  $dst,$src\t # (decode cOop)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4846
  ins_encode %{  __ oop_decoder($dst$$Register, $src$$Register, true); %}
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
// General Klass decoder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4851
instruct decodeKlass(iRegP dst, iRegN src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4852
  match(Set dst (DecodeNKlass src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4853
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4854
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4855
  format %{ "decode_klass $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4856
  ins_encode %{ __ decode_klass_not_null($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4857
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4858
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4859
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4860
// General decoder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4861
instruct decodeN_NN(iRegP dst, iRegN src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4862
  match(Set dst (DecodeN src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4863
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4864
  predicate((n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4865
             n->bottom_type()->is_oopptr()->ptr() == TypePtr::Constant) &&
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  4866
            (CompressedOops::base()== NULL || !ExpandLoadingBaseDecode_NN));
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4867
  ins_cost(MEMORY_REF_COST+2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4868
  // TODO: s390 port size(VARIABLE_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  4869
  format %{ "decodeN  $dst,$src\t # (decode cOop NN)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4870
  ins_encode %{ __ oop_decoder($dst$$Register, $src$$Register, false); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4871
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4872
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4873
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4874
  instruct loadBase(iRegL dst, immL baseImm) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4875
    effect(DEF dst, USE baseImm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4876
    predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4877
    format %{ "llihl    $dst=$baseImm \t// load heap base" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4878
    ins_encode %{ __ get_oop_base($dst$$Register, $baseImm$$constant); %}
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_base(iRegP dst, iRegN src, iRegL base, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4884
    match(Set dst (DecodeN src base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4885
    // Note: Effect TEMP dst was used with the intention to get
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4886
    // different regs for dst and base, but this has caused ADLC to
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4887
    // generate wrong code. Oop_decoder generates additional lgr when
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4888
    // dst==base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4889
    effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4890
    predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4891
    // TODO: s390 port size(VARIABLE_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  4892
    format %{ "decodeN  $dst = ($src == 0) ? NULL : ($src << 3) + $base + pow2_offset\t # (decode cOop)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4893
    ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4894
      __ oop_decoder($dst$$Register, $src$$Register, true, $base$$Register,
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  4895
                     (jlong)MacroAssembler::get_oop_base_pow2_offset((uint64_t)(intptr_t)CompressedOops::base()));
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4896
    %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4897
    ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4898
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4899
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4900
  // Decoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4901
  instruct decodeN_NN_base(iRegP dst, iRegN src, iRegL base, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4902
    match(Set dst (DecodeN src base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4903
    effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4904
    predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4905
    // TODO: s390 port size(VARIABLE_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  4906
    format %{ "decodeN  $dst = ($src << 3) + $base + pow2_offset\t # (decode cOop)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4907
    ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4908
      __ oop_decoder($dst$$Register, $src$$Register, false, $base$$Register,
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  4909
                     (jlong)MacroAssembler::get_oop_base_pow2_offset((uint64_t)(intptr_t)CompressedOops::base()));
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4910
    %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4911
    ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4912
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4913
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4914
// Decoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4915
instruct decodeN_Ex(iRegP dst, iRegN src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4916
  match(Set dst (DecodeN src));
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  4917
  predicate(CompressedOops::base() != NULL && ExpandLoadingBaseDecode);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4918
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4919
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4920
  expand %{
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  4921
    immL baseImm %{ (jlong)(intptr_t)CompressedOops::base() %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4922
    iRegL base;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4923
    loadBase(base, baseImm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4924
    decodeN_base(dst, src, base, cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4925
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4926
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4927
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4928
// Decoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4929
instruct decodeN_NN_Ex(iRegP dst, iRegN src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4930
  match(Set dst (DecodeN src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4931
  predicate((n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull ||
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4932
             n->bottom_type()->is_oopptr()->ptr() == TypePtr::Constant) &&
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  4933
            CompressedOops::base() != NULL && ExpandLoadingBaseDecode_NN);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4934
  ins_cost(MEMORY_REF_COST+2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4935
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4936
  expand %{
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  4937
    immL baseImm %{ (jlong)(intptr_t)CompressedOops::base() %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4938
    iRegL base;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4939
    loadBase(base, baseImm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4940
    decodeN_NN_base(dst, src, base, cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4941
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4942
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4943
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4944
//  Encode Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4945
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4946
// General encoder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4947
instruct encodeP(iRegN dst, iRegP src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4948
  match(Set dst (EncodeP src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4949
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4950
  predicate((n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull) &&
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  4951
            (CompressedOops::base() == 0 ||
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  4952
             CompressedOops::base_disjoint() ||
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4953
             !ExpandLoadingBaseEncode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4954
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4955
  // TODO: s390 port size(VARIABLE_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  4956
  format %{ "encodeP  $dst,$src\t # (encode cOop)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4957
  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
  4958
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4959
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4960
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4961
// General class encoder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4962
instruct encodeKlass(iRegN dst, iRegP src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4963
  match(Set dst (EncodePKlass src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4964
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4965
  format %{ "encode_klass $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4966
  ins_encode %{ __ encode_klass_not_null($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4967
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4968
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4969
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4970
instruct encodeP_NN(iRegN dst, iRegP src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4971
  match(Set dst (EncodeP src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4972
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4973
  predicate((n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull) &&
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  4974
            (CompressedOops::base() == 0 ||
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  4975
             CompressedOops::base_disjoint() ||
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4976
             !ExpandLoadingBaseEncode_NN));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4977
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4978
  // TODO: s390 port size(VARIABLE_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  4979
  format %{ "encodeP  $dst,$src\t # (encode cOop)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4980
  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
  4981
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4982
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4983
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4984
  // Encoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4985
  instruct encodeP_base(iRegN dst, iRegP src, iRegL base) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4986
    match(Set dst (EncodeP src (Binary base dst)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4987
    effect(TEMP_DEF dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4988
    predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4989
    ins_cost(MEMORY_REF_COST+2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4990
    // TODO: s390 port size(VARIABLE_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  4991
    format %{ "encodeP  $dst = ($src>>3) +$base + pow2_offset\t # (encode cOop)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4992
    ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4993
      jlong offset = -(jlong)MacroAssembler::get_oop_base_pow2_offset
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  4994
        (((uint64_t)(intptr_t)CompressedOops::base()) >> CompressedOops::shift());
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4995
      __ oop_encoder($dst$$Register, $src$$Register, true, $base$$Register, offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4996
    %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  4997
    ins_pipe(pipe_class_dummy);
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_base(iRegN dst, iRegP src, iRegL base, immL pow2_offset) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5002
    match(Set dst (EncodeP src base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5003
    effect(USE pow2_offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5004
    predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5005
    ins_cost(MEMORY_REF_COST+2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5006
    // TODO: s390 port size(VARIABLE_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  5007
    format %{ "encodeP  $dst = ($src>>3) +$base + $pow2_offset\t # (encode cOop)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5008
    ins_encode %{ __ oop_encoder($dst$$Register, $src$$Register, false, $base$$Register, $pow2_offset$$constant); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5009
    ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5010
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5011
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5012
// Encoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5013
instruct encodeP_Ex(iRegN dst, iRegP src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5014
  match(Set dst (EncodeP src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5015
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5016
  predicate((n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull) &&
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  5017
            (CompressedOops::base_overlaps() && ExpandLoadingBaseEncode));
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5018
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5019
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5020
  expand %{
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  5021
    immL baseImm %{ ((jlong)(intptr_t)CompressedOops::base()) >> CompressedOops::shift() %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5022
    immL_0 zero %{ (0) %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5023
    flagsReg ccr;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5024
    iRegL base;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5025
    iRegL negBase;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5026
    loadBase(base, baseImm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5027
    negL_reg_reg(negBase, zero, base, ccr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5028
    encodeP_base(dst, src, negBase);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5029
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5030
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5031
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5032
// Encoder for heapbased mode peeling off loading the base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5033
instruct encodeP_NN_Ex(iRegN dst, iRegP src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5034
  match(Set dst (EncodeP src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5035
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5036
  predicate((n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull) &&
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  5037
            (CompressedOops::base_overlaps() && ExpandLoadingBaseEncode_NN));
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5038
  ins_cost(MEMORY_REF_COST+3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5039
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5040
  expand %{
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  5041
    immL baseImm %{ (jlong)(intptr_t)CompressedOops::base() %}
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  5042
    immL pow2_offset %{ -(jlong)MacroAssembler::get_oop_base_pow2_offset(((uint64_t)(intptr_t)CompressedOops::base())) %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5043
    immL_0 zero %{ 0 %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5044
    flagsReg ccr;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5045
    iRegL base;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5046
    iRegL negBase;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5047
    loadBase(base, baseImm);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5048
    negL_reg_reg(negBase, zero, base, ccr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5049
    encodeP_NN_base(dst, src, negBase, pow2_offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5050
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5051
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5052
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5053
//  Store Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5054
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5055
// Store Compressed Pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5056
instruct storeN(memory mem, iRegN_P2N src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5057
  match(Set mem (StoreN mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5058
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5059
  size(Z_DISP_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  5060
  format %{ "ST      $src,$mem\t # (cOop)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5061
  opcode(STY_ZOPC, ST_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5062
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5063
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5064
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5066
// Store Compressed Klass pointer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5067
instruct storeNKlass(memory mem, iRegN src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5068
  match(Set mem (StoreNKlass mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5069
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5070
  size(Z_DISP_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  5071
  format %{ "ST      $src,$mem\t # (cKlass)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5072
  opcode(STY_ZOPC, ST_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5073
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5074
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5075
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5076
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5077
// Compare Compressed Pointers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5078
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5079
instruct compN_iRegN(iRegN_P2N src1, iRegN_P2N src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5080
  match(Set cr (CmpN src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5081
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5082
  size(2);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  5083
  format %{ "CLR     $src1,$src2\t # (cOop)" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5084
  opcode(CLR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5085
  ins_encode(z_rrform(src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5086
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5087
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5088
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5089
instruct compN_iRegN_immN(iRegN_P2N src1, immN src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5090
  match(Set cr (CmpN src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5091
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5092
  size(6);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  5093
  format %{ "CLFI    $src1,$src2\t # (cOop) compare immediate narrow" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5094
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5095
    AddressLiteral cOop = __ constant_oop_address((jobject)$src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5096
    __ relocate(cOop.rspec(), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5097
    __ compare_immediate_narrow_oop($src1$$Register, (narrowOop)cOop.value());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5098
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5099
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5100
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5101
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5102
instruct compNKlass_iRegN_immN(iRegN src1, immNKlass src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5103
  match(Set cr (CmpN src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5104
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5105
  size(6);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  5106
  format %{ "CLFI    $src1,$src2\t # (NKlass) compare immediate narrow" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5107
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5108
    AddressLiteral NKlass = __ constant_metadata_address((Metadata*)$src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5109
    __ relocate(NKlass.rspec(), 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5110
    __ compare_immediate_narrow_klass($src1$$Register, (Klass*)NKlass.value());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5111
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5112
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5113
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5114
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5115
instruct compN_iRegN_immN0(iRegN_P2N src1, immN0 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5116
  match(Set cr (CmpN src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5117
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5118
  size(2);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  5119
  format %{ "LTR     $src1,$src2\t # (cOop) LTR because comparing against zero" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5120
  opcode(LTR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5121
  ins_encode(z_rrform(src1, src1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5122
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5123
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5124
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5125
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5126
//----------MemBar Instructions-----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5127
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5128
// Memory barrier flavors
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5129
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5130
instruct membar_acquire() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5131
  match(MemBarAcquire);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5132
  match(LoadFence);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5133
  ins_cost(4*MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5134
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5135
  format %{ "MEMBAR-acquire" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5136
  ins_encode %{ __ z_acquire(); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5137
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5138
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5139
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5140
instruct membar_acquire_lock() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5141
  match(MemBarAcquireLock);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5142
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5143
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5144
  format %{ "MEMBAR-acquire (CAS in prior FastLock so empty encoding)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5145
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5146
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5147
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5148
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5149
instruct membar_release() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5150
  match(MemBarRelease);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5151
  match(StoreFence);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5152
  ins_cost(4 * MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5153
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5154
  format %{ "MEMBAR-release" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5155
  ins_encode %{ __ z_release(); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5156
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5157
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5158
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5159
instruct membar_release_lock() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5160
  match(MemBarReleaseLock);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5161
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5162
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5163
  format %{ "MEMBAR-release (CAS in succeeding FastUnlock so empty encoding)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5164
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5165
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5166
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5167
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5168
instruct membar_volatile() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5169
  match(MemBarVolatile);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5170
  ins_cost(4 * MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5171
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5172
  format %{ "MEMBAR-volatile" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5173
  ins_encode %{ __ z_fence(); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5174
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5175
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5176
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5177
instruct unnecessary_membar_volatile() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5178
  match(MemBarVolatile);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5179
  predicate(Matcher::post_store_load_barrier(n));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5180
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5181
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5182
  format %{ "# MEMBAR-volatile (empty)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5183
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5184
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5185
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5186
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5187
instruct membar_CPUOrder() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5188
  match(MemBarCPUOrder);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5189
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5190
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5191
  format %{ "MEMBAR-CPUOrder (empty)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5192
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5193
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5194
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5195
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5196
instruct membar_storestore() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5197
  match(MemBarStoreStore);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5198
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5199
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5200
  format %{ "MEMBAR-storestore (empty)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5201
  ins_encode();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5202
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5203
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5204
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5205
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5206
//----------Register Move Instructions-----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5207
instruct roundDouble_nop(regD dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5208
  match(Set dst (RoundDouble dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5209
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5210
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5211
  // z/Architecture results are already "rounded" (i.e., normal-format IEEE).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5212
  ins_encode();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5213
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5214
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5215
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5216
instruct roundFloat_nop(regF dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5217
  match(Set dst (RoundFloat dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5218
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5219
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5220
  // z/Architecture results are already "rounded" (i.e., normal-format IEEE).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5221
  ins_encode();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5222
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5223
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5224
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5225
// Cast Long to Pointer for unsafe natives.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5226
instruct castX2P(iRegP dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5227
  match(Set dst (CastX2P src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5228
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5229
  format %{ "LGR     $dst,$src\t # CastX2P" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5230
  ins_encode %{ __ lgr_if_needed($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5231
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5232
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5233
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5234
// Cast Pointer to Long for unsafe natives.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5235
instruct castP2X(iRegL dst, iRegP_N2P src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5236
  match(Set dst (CastP2X src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5237
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5238
  format %{ "LGR     $dst,$src\t # CastP2X" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5239
  ins_encode %{ __ lgr_if_needed($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5240
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5241
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5242
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5243
instruct stfSSD(stackSlotD stkSlot, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5244
  // %%%% TODO: Tell the coalescer that this kind of node is a copy!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5245
  match(Set stkSlot src);   // chain rule
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5246
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5247
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5248
  format %{ " STD   $src,$stkSlot\t # stk" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5249
  opcode(STD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5250
  ins_encode(z_form_rt_mem(src, stkSlot));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5251
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5252
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5253
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5254
instruct stfSSF(stackSlotF stkSlot, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5255
  // %%%% TODO: Tell the coalescer that this kind of node is a copy!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5256
  match(Set stkSlot src);   // chain rule
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5257
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5258
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5259
  format %{ "STE   $src,$stkSlot\t # stk" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5260
  opcode(STE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5261
  ins_encode(z_form_rt_mem(src, stkSlot));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5262
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5263
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5264
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5265
//----------Conditional Move---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5266
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5267
instruct cmovN_reg(cmpOp cmp, flagsReg cr, iRegN dst, iRegN_P2N src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5268
  match(Set dst (CMoveN (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5269
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5270
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5271
  format %{ "CMoveN,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5272
  ins_encode(z_enc_cmov_reg(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5273
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5274
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5275
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5276
instruct cmovN_imm(cmpOp cmp, flagsReg cr, iRegN dst, immN0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5277
  match(Set dst (CMoveN (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5278
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5279
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5280
  format %{ "CMoveN,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5281
  ins_encode(z_enc_cmov_imm(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5282
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5283
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5284
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5285
instruct cmovI_reg(cmpOp cmp, flagsReg cr, iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5286
  match(Set dst (CMoveI (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5287
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5288
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5289
  format %{ "CMoveI,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5290
  ins_encode(z_enc_cmov_reg(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5291
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5292
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5293
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5294
instruct cmovI_imm(cmpOp cmp, flagsReg cr, iRegI dst, immI16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5295
  match(Set dst (CMoveI (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5296
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5297
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5298
  format %{ "CMoveI,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5299
  ins_encode(z_enc_cmov_imm(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5300
  ins_pipe(pipe_class_dummy);
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
instruct cmovP_reg(cmpOp cmp, flagsReg cr, iRegP dst, iRegP_N2P src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5304
  match(Set dst (CMoveP (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5305
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5306
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5307
  format %{ "CMoveP,$cmp    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5308
  ins_encode(z_enc_cmov_reg(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5309
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5310
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5311
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5312
instruct cmovP_imm(cmpOp cmp, flagsReg cr, iRegP dst, immP0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5313
  match(Set dst (CMoveP (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5314
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5315
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5316
  format %{ "CMoveP,$cmp  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5317
  ins_encode(z_enc_cmov_imm(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5318
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5319
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5320
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5321
instruct cmovF_reg(cmpOpF cmp, flagsReg cr, regF dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5322
  match(Set dst (CMoveF (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5323
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5324
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5325
  format %{ "CMoveF,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5326
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5327
    // Don't emit code if operands are identical (same register).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5328
    if ($dst$$FloatRegister != $src$$FloatRegister) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5329
      Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5330
      __ z_brc(Assembler::inverse_float_condition((Assembler::branch_condition)$cmp$$cmpcode), done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5331
      __ z_ler($dst$$FloatRegister, $src$$FloatRegister);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5332
      __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5333
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5334
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5335
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5336
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5337
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5338
instruct cmovD_reg(cmpOpF cmp, flagsReg cr, regD dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5339
  match(Set dst (CMoveD (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5340
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5341
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5342
  format %{ "CMoveD,$cmp   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5343
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5344
    // Don't emit code if operands are identical (same register).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5345
    if ($dst$$FloatRegister != $src$$FloatRegister) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5346
      Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5347
      __ z_brc(Assembler::inverse_float_condition((Assembler::branch_condition)$cmp$$cmpcode), done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5348
      __ z_ldr($dst$$FloatRegister, $src$$FloatRegister);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5349
      __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5350
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5351
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5352
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5353
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5354
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5355
instruct cmovL_reg(cmpOp cmp, flagsReg cr, iRegL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5356
  match(Set dst (CMoveL (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5357
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5358
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5359
  format %{ "CMoveL,$cmp  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5360
  ins_encode(z_enc_cmov_reg(cmp,dst,src));
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 cmovL_imm(cmpOp cmp, flagsReg cr, iRegL dst, immL16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5365
  match(Set dst (CMoveL (Binary cmp cr) (Binary dst src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5366
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5367
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5368
  format %{ "CMoveL,$cmp  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5369
  ins_encode(z_enc_cmov_imm(cmp,dst,src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5370
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5371
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5372
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5373
//----------OS and Locking Instructions----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5374
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5375
// This name is KNOWN by the ADLC and cannot be changed.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5376
// The ADLC forces a 'TypeRawPtr::BOTTOM' output type
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5377
// for this guy.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5378
instruct tlsLoadP(threadRegP dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5379
  match(Set dst (ThreadLocal));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5380
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5381
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5382
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5383
  format %{ "# $dst=ThreadLocal" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5384
  ins_encode(/* empty */);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5385
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5386
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5387
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5388
instruct checkCastPP(iRegP dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5389
  match(Set dst (CheckCastPP dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5390
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5391
  format %{ "# checkcastPP of $dst" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5392
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5393
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5394
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5395
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5396
instruct castPP(iRegP dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5397
  match(Set dst (CastPP dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5398
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5399
  format %{ "# castPP of $dst" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5400
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5401
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5402
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5403
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5404
instruct castII(iRegI dst) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5405
  match(Set dst (CastII dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5406
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5407
  format %{ "# castII of $dst" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5408
  ins_encode(/*empty*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5409
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5410
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5411
58019
86b95fc6ca32 8229496: SIGFPE (division by zero) in C2 OSR compiled method
thartmann
parents: 55343
diff changeset
  5412
instruct castLL(iRegL dst) %{
86b95fc6ca32 8229496: SIGFPE (division by zero) in C2 OSR compiled method
thartmann
parents: 55343
diff changeset
  5413
  match(Set dst (CastLL dst));
86b95fc6ca32 8229496: SIGFPE (division by zero) in C2 OSR compiled method
thartmann
parents: 55343
diff changeset
  5414
  size(0);
86b95fc6ca32 8229496: SIGFPE (division by zero) in C2 OSR compiled method
thartmann
parents: 55343
diff changeset
  5415
  format %{ "# castLL of $dst" %}
86b95fc6ca32 8229496: SIGFPE (division by zero) in C2 OSR compiled method
thartmann
parents: 55343
diff changeset
  5416
  ins_encode(/*empty*/);
86b95fc6ca32 8229496: SIGFPE (division by zero) in C2 OSR compiled method
thartmann
parents: 55343
diff changeset
  5417
  ins_pipe(pipe_class_dummy);
86b95fc6ca32 8229496: SIGFPE (division by zero) in C2 OSR compiled method
thartmann
parents: 55343
diff changeset
  5418
%}
86b95fc6ca32 8229496: SIGFPE (division by zero) in C2 OSR compiled method
thartmann
parents: 55343
diff changeset
  5419
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5420
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5421
//----------Conditional_store--------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5422
// Conditional-store of the updated heap-top.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5423
// Used during allocation of the shared heap.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5424
// Sets flags (EQ) on success.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5425
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5426
// Implement LoadPLocked. Must be ordered against changes of the memory location
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5427
// by storePConditional.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5428
// Don't know whether this is ever used.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5429
instruct loadPLocked(iRegP dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5430
  match(Set dst (LoadPLocked mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5431
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5432
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5433
  format %{ "LG      $dst,$mem\t # LoadPLocked" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5434
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5435
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5436
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5437
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5438
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5439
// As compareAndSwapP, but return flag register instead of boolean value in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5440
// int register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5441
// This instruction is matched if UseTLAB is off. Needed to pass
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5442
// option tests.  Mem_ptr must be a memory operand, else this node
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5443
// does not get Flag_needs_anti_dependence_check set by adlc. If this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5444
// is not set this node can be rematerialized which leads to errors.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5445
instruct storePConditional(indirect mem_ptr, rarg5RegP oldval, iRegP_N2P newval, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5446
  match(Set cr (StorePConditional mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5447
  effect(KILL oldval);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5448
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5449
  format %{ "storePConditional $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5450
  ins_encode(z_enc_casL(oldval, newval, mem_ptr));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5451
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5452
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5453
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5454
// As compareAndSwapL, but return flag register instead of boolean value in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5455
// int register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5456
// Used by sun/misc/AtomicLongCSImpl.java. Mem_ptr must be a memory
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5457
// operand, else this node does not get
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5458
// Flag_needs_anti_dependence_check set by adlc. If this is not set
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5459
// this node can be rematerialized which leads to errors.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5460
instruct storeLConditional(indirect mem_ptr, rarg5RegL oldval, iRegL newval, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5461
  match(Set cr (StoreLConditional mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5462
  effect(KILL oldval);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5463
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5464
  format %{ "storePConditional $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5465
  ins_encode(z_enc_casL(oldval, newval, mem_ptr));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5466
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5467
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5468
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5469
// 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
  5470
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5471
instruct compareAndSwapI_bool(iRegP mem_ptr, rarg5RegI oldval, iRegI newval, iRegI res, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5472
  match(Set res (CompareAndSwapI mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5473
  effect(USE mem_ptr, USE_KILL oldval, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5474
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5475
  format %{ "$res = CompareAndSwapI $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5476
  ins_encode(z_enc_casI(oldval, newval, mem_ptr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5477
             z_enc_cctobool(res));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5478
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5479
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5480
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5481
instruct compareAndSwapL_bool(iRegP mem_ptr, rarg5RegL oldval, iRegL newval, iRegI res, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5482
  match(Set res (CompareAndSwapL mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5483
  effect(USE mem_ptr, USE_KILL oldval, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5484
  size(18);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5485
  format %{ "$res = CompareAndSwapL $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5486
  ins_encode(z_enc_casL(oldval, newval, mem_ptr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5487
             z_enc_cctobool(res));
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
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
  5492
  match(Set res (CompareAndSwapP mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5493
  effect(USE mem_ptr, USE_KILL oldval, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5494
  size(18);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5495
  format %{ "$res = CompareAndSwapP $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5496
  ins_encode(z_enc_casL(oldval, newval, mem_ptr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5497
             z_enc_cctobool(res));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5498
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5499
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5500
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5501
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
  5502
  match(Set res (CompareAndSwapN mem_ptr (Binary oldval newval)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5503
  effect(USE mem_ptr, USE_KILL oldval, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5504
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5505
  format %{ "$res = CompareAndSwapN $oldval,$newval,$mem_ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5506
  ins_encode(z_enc_casI(oldval, newval, mem_ptr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5507
             z_enc_cctobool(res));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5508
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5509
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5510
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5511
//----------Atomic operations on memory (GetAndSet*, GetAndAdd*)---------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5512
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5513
// Exploit: direct memory arithmetic
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5514
// Prereqs: - instructions available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5515
//          - instructions guarantee atomicity
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5516
//          - immediate operand to be added
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5517
//          - immediate operand is small enough (8-bit signed).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5518
//          - result of instruction is not used
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5519
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
  5520
  match(Set dummy (GetAndAddI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5521
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5522
  predicate(VM_Version::has_AtomicMemWithImmALUOps() && n->as_LoadStore()->result_not_used());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5523
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5524
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5525
  format %{ "ASI     [$mem],$src\t # GetAndAddI (atomic)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5526
  opcode(ASI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5527
  ins_encode(z_siyform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5528
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5529
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5530
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5531
// Fallback: direct memory arithmetic not available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5532
// Disadvantages: - CS-Loop required, very expensive.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5533
//                - more code generated (26 to xx bytes vs. 6 bytes)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5534
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
  5535
  match(Set dst (GetAndAddI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5536
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5537
  ins_cost(MEMORY_REF_COST+100*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5538
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5539
            "  LGF     $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5540
            "  AHIK    $tmp,$dst,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5541
            "  CSY     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5542
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5543
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5544
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5545
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5546
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5547
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5548
    int      Isrc = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5549
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5550
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5551
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5552
    __ z_lgf(Rdst, $mem$$Address);    // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5553
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5554
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5555
      if (VM_Version::has_DistinctOpnds()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5556
        __ z_ahik(Rtmp, Rdst, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5557
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5558
        __ z_lr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5559
        __ z_ahi(Rtmp, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5560
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5561
      // Swap into memory location.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5562
      __ z_csy(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5563
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5564
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5565
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5566
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5567
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5568
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
  5569
  match(Set dst (GetAndAddI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5570
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5571
  ins_cost(MEMORY_REF_COST+200*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5572
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5573
            "  LGF     $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5574
            "  LGR     $tmp,$dst\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5575
            "  AFI     $tmp,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5576
            "  CSY     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5577
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5578
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5579
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5580
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5581
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5582
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5583
    int      Isrc = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5584
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5585
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5586
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5587
    __ z_lgf(Rdst, $mem$$Address);    // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5588
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5589
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5590
      __ z_lr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5591
      __ z_afi(Rtmp, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5592
      // Swap into memory location.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5593
      __ z_csy(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5594
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5595
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5596
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5597
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5598
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5599
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
  5600
  match(Set dst (GetAndAddI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5601
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5602
  ins_cost(MEMORY_REF_COST+100*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5603
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5604
            "  LGF     $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5605
            "  ARK     $tmp,$dst,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5606
            "  CSY     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5607
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5608
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5609
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5610
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5611
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5612
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5613
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5614
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5615
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5616
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5617
    __ z_lgf(Rdst, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5618
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5619
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5620
      if (VM_Version::has_DistinctOpnds()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5621
        __ z_ark(Rtmp, Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5622
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5623
        __ z_lr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5624
        __ z_ar(Rtmp, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5625
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5626
      __ z_csy(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5627
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5628
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5629
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5630
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5631
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5632
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5633
// Exploit: direct memory arithmetic
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5634
// Prereqs: - instructions available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5635
//          - instructions guarantee atomicity
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5636
//          - immediate operand to be added
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5637
//          - immediate operand is small enough (8-bit signed).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5638
//          - result of instruction is not used
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5639
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
  5640
  match(Set dummy (GetAndAddL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5641
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5642
  predicate(VM_Version::has_AtomicMemWithImmALUOps() && n->as_LoadStore()->result_not_used());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5643
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5644
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5645
  format %{ "AGSI    [$mem],$src\t # GetAndAddL (atomic)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5646
  opcode(AGSI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5647
  ins_encode(z_siyform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5648
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5649
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5650
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5651
// Fallback: direct memory arithmetic not available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5652
// Disadvantages: - CS-Loop required, very expensive.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5653
//                - more code generated (26 to xx bytes vs. 6 bytes)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5654
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
  5655
  match(Set dst (GetAndAddL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5656
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5657
  ins_cost(MEMORY_REF_COST+100*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5658
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5659
            "  LG      $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5660
            "  AGHIK   $tmp,$dst,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5661
            "  CSG     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5662
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5663
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5664
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5665
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5666
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5667
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5668
    int      Isrc = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5669
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5670
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5671
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5672
    __ z_lg(Rdst, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5673
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5674
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5675
      if (VM_Version::has_DistinctOpnds()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5676
        __ z_aghik(Rtmp, Rdst, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5677
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5678
        __ z_lgr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5679
        __ z_aghi(Rtmp, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5680
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5681
      __ z_csg(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5682
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5683
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5684
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5685
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5686
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5687
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
  5688
  match(Set dst (GetAndAddL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5689
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5690
  ins_cost(MEMORY_REF_COST+100*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5691
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5692
            "  LG      $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5693
            "  LGR     $tmp,$dst\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5694
            "  AGFI    $tmp,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5695
            "  CSG     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5696
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5697
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5698
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5699
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5700
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5701
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5702
    int      Isrc = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5703
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5704
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5705
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5706
    __ z_lg(Rdst, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5707
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5708
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5709
      __ z_lgr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5710
      __ z_agfi(Rtmp, Isrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5711
      __ z_csg(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5712
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5713
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5714
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5715
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5716
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5717
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
  5718
  match(Set dst (GetAndAddL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5719
  effect(KILL cr, TEMP_DEF dst, TEMP tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5720
  ins_cost(MEMORY_REF_COST+100*DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5721
  format %{ "BEGIN ATOMIC {\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5722
            "  LG      $dst,[$mem]\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5723
            "  AGRK    $tmp,$dst,$src\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5724
            "  CSG     $dst,$tmp,$mem\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5725
            "  retry if failed\n\t"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5726
            "} END ATOMIC"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5727
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5728
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5729
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5730
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5731
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5732
    Label    retry;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5733
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5734
    // Iterate until update with incremented value succeeds.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5735
    __ z_lg(Rdst, $mem$$Address);  // current contents
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5736
    __ bind(retry);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5737
      // Calculate incremented value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5738
      if (VM_Version::has_DistinctOpnds()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5739
        __ z_agrk(Rtmp, Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5740
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5741
        __ z_lgr(Rtmp, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5742
        __ z_agr(Rtmp, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5743
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5744
      __ z_csg(Rdst, Rtmp, $mem$$Address); // Try to store new value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5745
    __ z_brne(retry);                      // Yikes, concurrent update, need to retry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5746
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5747
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5748
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5749
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5750
// Increment value in memory, save old value in dst.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5751
instruct addI_mem_reg_atomic_z196(memoryRSY mem, iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5752
  match(Set dst (GetAndAddI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5753
  predicate(VM_Version::has_LoadAndALUAtomicV1());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5754
  ins_cost(MEMORY_REF_COST + DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5755
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5756
  format %{ "LAA     $dst,$src,[$mem]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5757
  ins_encode %{ __ z_laa($dst$$Register, $src$$Register, $mem$$Address); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5758
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5759
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5760
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5761
// Increment value in memory, save old value in dst.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5762
instruct addL_mem_reg_atomic_z196(memoryRSY mem, iRegL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5763
  match(Set dst (GetAndAddL mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5764
  predicate(VM_Version::has_LoadAndALUAtomicV1());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5765
  ins_cost(MEMORY_REF_COST + DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5766
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5767
  format %{ "LAAG    $dst,$src,[$mem]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5768
  ins_encode %{ __ z_laag($dst$$Register, $src$$Register, $mem$$Address); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5769
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5770
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5771
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5772
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5773
instruct xchgI_reg_mem(memoryRSY mem, iRegI dst, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5774
  match(Set dst (GetAndSetI mem dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5775
  effect(KILL cr, TEMP tmp); // USE_DEF dst by match rule.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5776
  format %{ "XCHGI   $dst,[$mem]\t # EXCHANGE (int, atomic), temp $tmp" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5777
  ins_encode(z_enc_SwapI(mem, dst, tmp));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5778
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5779
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5780
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5781
instruct xchgL_reg_mem(memoryRSY mem, iRegL dst, iRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5782
  match(Set dst (GetAndSetL mem dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5783
  effect(KILL cr, TEMP tmp); // USE_DEF dst by match rule.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5784
  format %{ "XCHGL   $dst,[$mem]\t # EXCHANGE (long, atomic), temp $tmp" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5785
  ins_encode(z_enc_SwapL(mem, dst, tmp));
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
instruct xchgN_reg_mem(memoryRSY mem, iRegN dst, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5790
  match(Set dst (GetAndSetN mem dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5791
  effect(KILL cr, TEMP tmp); // USE_DEF dst by match rule.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5792
  format %{ "XCHGN   $dst,[$mem]\t # EXCHANGE (coop, atomic), temp $tmp" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5793
  ins_encode(z_enc_SwapI(mem, dst, tmp));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5794
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5795
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5796
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5797
instruct xchgP_reg_mem(memoryRSY mem, iRegP dst, iRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5798
  match(Set dst (GetAndSetP mem dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5799
  effect(KILL cr, TEMP tmp); // USE_DEF dst by match rule.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5800
  format %{ "XCHGP   $dst,[$mem]\t # EXCHANGE (oop, atomic), temp $tmp" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5801
  ins_encode(z_enc_SwapL(mem, dst, tmp));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5802
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5803
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5804
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5805
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5806
//----------Arithmetic Instructions--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5807
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5808
// The rules are sorted by right operand type and operand length. Please keep
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5809
// it that way.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5810
// Left operand type is always reg. Left operand len is I, L, P
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5811
// 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
  5812
// Special instruction formats, e.g. multi-operand, are inserted at the end.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5813
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5814
// ADD
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5815
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5816
// REG = REG + REG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5817
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5818
// Register Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5819
instruct addI_reg_reg_CISC(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5820
  match(Set dst (AddI dst src));
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
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5823
  format %{ "AR      $dst,$src\t # int  CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5824
  opcode(AR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5825
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5826
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5827
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5828
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5829
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5830
instruct addI_reg_reg_RISC(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5831
  match(Set dst (AddI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5832
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5833
  predicate(VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5834
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5835
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5836
  format %{ "ARK     $dst,$src1,$src2\t # int  RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5837
  opcode(ARK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5838
  ins_encode(z_rrfform(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5839
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5840
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5841
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5842
// REG = REG + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5843
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5844
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5845
// Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5846
instruct addI_reg_imm16_CISC(iRegI dst, immI16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5847
  match(Set dst (AddI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5848
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5849
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5850
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5851
  format %{ "AHI     $dst,$con\t # int  CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5852
  opcode(AHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5853
  ins_encode(z_riform_signed(dst, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5854
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5855
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5856
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5857
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5858
// Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5859
instruct addI_reg_imm16_RISC(iRegI dst, iRegI src, immI16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5860
  match(Set dst (AddI src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5861
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5862
  predicate( VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5863
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5864
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5865
  format %{ "AHIK    $dst,$src,$con\t # int  RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5866
  opcode(AHIK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5867
  ins_encode(z_rieform_d(dst, src, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5868
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5869
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5870
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5871
// Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5872
instruct addI_reg_imm32(iRegI dst, immI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5873
  match(Set dst (AddI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5874
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5875
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5876
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5877
  format %{ "AFI     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5878
  opcode(AFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5879
  ins_encode(z_rilform_signed(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5880
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5881
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5882
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5883
// Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5884
instruct addI_reg_imm12(iRegI dst, iRegI src, uimmI12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5885
  match(Set dst (AddI src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5886
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5887
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5888
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5889
  format %{ "LA      $dst,$con(,$src)\t # int d12(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5890
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5891
  ins_encode(z_rxform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5892
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5893
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5894
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5895
// Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5896
instruct addI_reg_imm20(iRegI dst, iRegI src, immI20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5897
  match(Set dst (AddI src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5898
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5899
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5900
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5901
  format %{ "LAY     $dst,$con(,$src)\t # int d20(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5902
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5903
  ins_encode(z_rxyform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5904
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5905
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5906
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5907
instruct addI_reg_reg_imm12(iRegI dst, iRegI src1, iRegI src2, uimmI12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5908
  match(Set dst (AddI (AddI src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5909
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5910
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5911
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5912
  format %{ "LA      $dst,$con($src1,$src2)\t # int d12(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5913
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5914
  ins_encode(z_rxform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5915
  ins_pipe(pipe_class_dummy);
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
instruct addI_reg_reg_imm20(iRegI dst, iRegI src1, iRegI src2, immI20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5919
  match(Set dst (AddI (AddI src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5920
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5921
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5922
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5923
  format %{ "LAY     $dst,$con($src1,$src2)\t # int d20(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5924
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5925
  ins_encode(z_rxyform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5926
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5927
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5928
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5929
// REG = REG + MEM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5930
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5931
instruct addI_Reg_mem(iRegI dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5932
  match(Set dst (AddI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5933
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5934
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5935
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5936
  format %{ "A(Y)    $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5937
  opcode(AY_ZOPC, A_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5938
  ins_encode(z_form_rt_mem_opt(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
// MEM = MEM + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5943
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5944
// Add Immediate to 4-byte memory operand and result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5945
instruct addI_mem_imm(memoryRSY mem, immI8 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5946
  match(Set mem (StoreI mem (AddI (LoadI mem) src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5947
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5948
  predicate(VM_Version::has_MemWithImmALUOps());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5949
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5950
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5951
  format %{ "ASI     $mem,$src\t # direct mem add 4" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5952
  opcode(ASI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5953
  ins_encode(z_siyform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5954
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5955
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5956
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5957
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5958
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5959
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5960
// REG = REG + REG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5961
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5962
instruct addL_reg_regI(iRegL dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5963
  match(Set dst (AddL dst (ConvI2L src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5964
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5965
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5966
  format %{ "AGFR    $dst,$src\t # long<-int CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5967
  opcode(AGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5968
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5969
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5970
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5971
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5972
instruct addL_reg_reg_CISC(iRegL dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5973
  match(Set dst (AddL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5974
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5975
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5976
  format %{ "AGR     $dst, $src\t # long CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5977
  opcode(AGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5978
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5979
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5980
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5981
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5982
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5983
instruct addL_reg_reg_RISC(iRegL dst, iRegL src1, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5984
  match(Set dst (AddL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5985
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5986
  predicate(VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5987
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5988
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5989
  format %{ "AGRK    $dst,$src1,$src2\t # long RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5990
  opcode(AGRK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5991
  ins_encode(z_rrfform(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5992
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5993
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5994
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5995
// REG = REG + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5996
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5997
instruct addL_reg_imm12(iRegL dst, iRegL src, uimmL12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5998
  match(Set dst (AddL src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  5999
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6000
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6001
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6002
  format %{ "LA      $dst,$con(,$src)\t # long d12(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6003
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6004
  ins_encode(z_rxform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6005
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6006
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6007
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6008
instruct addL_reg_imm20(iRegL dst, iRegL src, immL20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6009
  match(Set dst (AddL src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6010
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6011
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6012
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6013
  format %{ "LAY     $dst,$con(,$src)\t # long d20(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6014
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6015
  ins_encode(z_rxyform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6016
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6017
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6018
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6019
instruct addL_reg_imm32(iRegL dst, immL32 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6020
  match(Set dst (AddL dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6021
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6022
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6023
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6024
  format %{ "AGFI    $dst,$con\t # long CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6025
  opcode(AGFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6026
  ins_encode(z_rilform_signed(dst, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6027
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6028
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6029
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6030
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6031
instruct addL_reg_imm16_CISC(iRegL dst, immL16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6032
  match(Set dst (AddL dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6033
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6034
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6035
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6036
  format %{ "AGHI    $dst,$con\t # long CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6037
  opcode(AGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6038
  ins_encode(z_riform_signed(dst, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6039
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6040
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6041
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6042
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6043
instruct addL_reg_imm16_RISC(iRegL dst, iRegL src, immL16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6044
  match(Set dst (AddL src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6045
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6046
  predicate( VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6047
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6048
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6049
  format %{ "AGHIK   $dst,$src,$con\t # long RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6050
  opcode(AGHIK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6051
  ins_encode(z_rieform_d(dst, src, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6052
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6053
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6054
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6055
// REG = REG + MEM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6056
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6057
instruct addL_Reg_memI(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6058
  match(Set dst (AddL dst (ConvI2L (LoadI src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6059
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6060
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6061
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6062
  format %{ "AGF     $dst, $src\t # long/int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6063
  opcode(AGF_ZOPC, AGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6064
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6065
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6066
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6067
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6068
instruct addL_Reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6069
  match(Set dst (AddL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6070
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6071
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6072
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6073
  format %{ "AG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6074
  opcode(AG_ZOPC, AG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6075
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6076
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6077
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6078
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6079
instruct addL_reg_reg_imm12(iRegL dst, iRegL src1, iRegL src2, uimmL12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6080
  match(Set dst (AddL (AddL src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6081
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6082
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6083
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6084
  format %{ "LA     $dst,$con($src1,$src2)\t # long d12(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6085
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6086
  ins_encode(z_rxform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6087
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6088
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6089
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6090
instruct addL_reg_reg_imm20(iRegL dst, iRegL src1, iRegL src2, immL20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6091
  match(Set dst (AddL (AddL src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6092
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6093
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6094
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6095
  format %{ "LAY    $dst,$con($src1,$src2)\t # long d20(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6096
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6097
  ins_encode(z_rxyform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6098
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6099
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6100
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6101
// MEM = MEM + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6102
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6103
// Add Immediate to 8-byte memory operand and result.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6104
instruct addL_mem_imm(memoryRSY mem, immL8 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6105
  match(Set mem (StoreL mem (AddL (LoadL mem) src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6106
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6107
  predicate(VM_Version::has_MemWithImmALUOps());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6108
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6109
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6110
  format %{ "AGSI    $mem,$src\t # direct mem add 8" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6111
  opcode(AGSI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6112
  ins_encode(z_siyform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6113
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6114
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6115
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6116
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6117
// REG = REG + REG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6118
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6119
// Ptr Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6120
instruct addP_reg_reg_LA(iRegP dst, iRegP_N2P src1, iRegL src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6121
  match(Set dst (AddP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6122
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6123
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6124
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6125
  format %{ "LA      $dst,#0($src1,$src2)\t # ptr 0(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6126
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6127
  ins_encode(z_rxform_imm_reg_reg(dst, 0x0, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6128
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6129
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6130
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6131
// Ptr Addition
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_reg_CISC(iRegP dst, iRegL 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 %{ "ALGR    $dst,$src\t # ptr CICS ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6140
  opcode(ALGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6141
  ins_encode(z_rreform(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
// Ptr Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6146
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6147
instruct addP_reg_reg_RISC(iRegP dst, iRegP_N2P src1, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6148
  match(Set dst (AddP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6149
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6150
  predicate(!PreferLAoverADD && VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6151
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6152
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6153
  format %{ "ALGRK   $dst,$src1,$src2\t # ptr RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6154
  opcode(ALGRK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6155
  ins_encode(z_rrfform(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6156
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6157
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6158
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6159
// REG = REG + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6160
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6161
instruct addP_reg_imm12(iRegP dst, iRegP_N2P src, uimmL12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6162
  match(Set dst (AddP src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6163
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6164
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6165
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6166
  format %{ "LA      $dst,$con(,$src)\t # ptr d12(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6167
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6168
  ins_encode(z_rxform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6169
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6170
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6171
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6172
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6173
instruct addP_reg_imm16_CISC(iRegP dst, immL16 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6174
  match(Set dst (AddP dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6175
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6176
  predicate(!PreferLAoverADD && !VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6177
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6178
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6179
  format %{ "AGHI    $dst,$src\t # ptr CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6180
  opcode(AGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6181
  ins_encode(z_riform_signed(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6182
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6183
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6184
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6185
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6186
instruct addP_reg_imm16_RISC(iRegP dst, iRegP_N2P src, immL16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6187
  match(Set dst (AddP src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6188
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6189
  predicate(!PreferLAoverADD && VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6190
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6191
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6192
  format %{ "ALGHSIK $dst,$src,$con\t # ptr RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6193
  opcode(ALGHSIK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6194
  ins_encode(z_rieform_d(dst, src, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6195
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6196
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6197
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6198
instruct addP_reg_imm20(iRegP dst, memoryRegP src, immL20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6199
  match(Set dst (AddP src con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6200
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6201
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6202
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6203
  format %{ "LAY     $dst,$con(,$src)\t # ptr d20(,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6204
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6205
  ins_encode(z_rxyform_imm_reg(dst, con, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6206
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6207
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6208
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6209
// Pointer Immediate Addition
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6210
instruct addP_reg_imm32(iRegP dst, immL32 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6211
  match(Set dst (AddP dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6212
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6213
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6214
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6215
  format %{ "AGFI    $dst,$src\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6216
  opcode(AGFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6217
  ins_encode(z_rilform_signed(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6218
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6219
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6220
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6221
// REG = REG1 + REG2 + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6222
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6223
instruct addP_reg_reg_imm12(iRegP dst, memoryRegP src1, iRegL src2, uimmL12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6224
  match(Set dst (AddP (AddP src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6225
  predicate( PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6226
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6227
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6228
  format %{ "LA      $dst,$con($src1,$src2)\t # ptr d12(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6229
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6230
  ins_encode(z_rxform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6231
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6232
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6233
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6234
instruct addP_regN_reg_imm12(iRegP dst, iRegP_N2P src1, iRegL src2, uimmL12 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6235
  match(Set dst (AddP (AddP src1 src2) con));
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  6236
  predicate( PreferLAoverADD && CompressedOops::base() == NULL && CompressedOops::shift() == 0);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6237
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6238
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6239
  format %{ "LA      $dst,$con($src1,$src2)\t # ptr d12(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6240
  opcode(LA_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6241
  ins_encode(z_rxform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6242
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6243
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6244
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6245
instruct addP_reg_reg_imm20(iRegP dst, memoryRegP src1, iRegL src2, immL20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6246
  match(Set dst (AddP (AddP src1 src2) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6247
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6248
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6249
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6250
  format %{ "LAY     $dst,$con($src1,$src2)\t # ptr d20(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6251
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6252
  ins_encode(z_rxyform_imm_reg_reg(dst, con, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6253
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6254
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6255
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6256
instruct addP_regN_reg_imm20(iRegP dst, iRegP_N2P src1, iRegL src2, immL20 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6257
  match(Set dst (AddP (AddP src1 src2) con));
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  6258
  predicate( PreferLAoverADD && CompressedOops::base() == NULL && CompressedOops::shift() == 0);
42065
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
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6261
  format %{ "LAY     $dst,$con($src1,$src2)\t # ptr d20(x,b)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6262
  opcode(LAY_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6263
  ins_encode(z_rxyform_imm_reg_reg(dst, con, 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
// MEM = MEM + IMM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6268
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6269
// Add Immediate to 8-byte memory operand and result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6270
instruct addP_mem_imm(memoryRSY mem, immL8 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6271
  match(Set mem (StoreP mem (AddP (LoadP mem) src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6272
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6273
  predicate(VM_Version::has_MemWithImmALUOps());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6274
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6275
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6276
  format %{ "AGSI    $mem,$src\t # direct mem add 8 (ptr)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6277
  opcode(AGSI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6278
  ins_encode(z_siyform(mem, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6279
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6280
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6281
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6282
// SUB
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6283
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6284
// Register Subtraction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6285
instruct subI_reg_reg_CISC(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6286
  match(Set dst (SubI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6287
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6288
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6289
  format %{ "SR      $dst,$src\t # int  CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6290
  opcode(SR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6291
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6292
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6293
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6294
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6295
instruct subI_reg_reg_RISC(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6296
  match(Set dst (SubI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6297
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6298
  predicate(VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6299
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6300
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6301
  format %{ "SRK     $dst,$src1,$src2\t # int  RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6302
  opcode(SRK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6303
  ins_encode(z_rrfform(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6304
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6305
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6306
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6307
instruct subI_Reg_mem(iRegI dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6308
  match(Set dst (SubI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6309
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6310
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6311
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6312
  format %{ "S(Y)    $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6313
  opcode(SY_ZOPC, S_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6314
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6315
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6316
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6317
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6318
instruct subI_zero_reg(iRegI dst, immI_0 zero, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6319
  match(Set dst (SubI zero src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6320
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6321
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6322
  format %{ "NEG     $dst, $src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6323
  ins_encode %{ __ z_lcr($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6324
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6325
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6326
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6327
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6328
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6329
// Long subtraction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6330
instruct subL_reg_reg_CISC(iRegL dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6331
  match(Set dst (SubL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6332
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6333
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6334
  format %{ "SGR     $dst,$src\t # int  CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6335
  opcode(SGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6336
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6337
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6338
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6339
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6340
// Avoid use of LA(Y) for general ALU operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6341
instruct subL_reg_reg_RISC(iRegL dst, iRegL src1, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6342
  match(Set dst (SubL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6343
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6344
  predicate(VM_Version::has_DistinctOpnds());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6345
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6346
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6347
  format %{ "SGRK    $dst,$src1,$src2\t # int  RISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6348
  opcode(SGRK_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6349
  ins_encode(z_rrfform(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6350
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6351
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6352
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6353
instruct subL_reg_regI_CISC(iRegL dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6354
  match(Set dst (SubL dst (ConvI2L src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6355
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6356
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6357
  format %{ "SGFR    $dst, $src\t # int  CISC ALU" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6358
  opcode(SGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6359
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6360
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6361
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6362
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6363
instruct subL_Reg_memI(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6364
  match(Set dst (SubL dst (ConvI2L (LoadI src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6365
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6366
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6367
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6368
  format %{ "SGF     $dst, $src\t # long/int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6369
  opcode(SGF_ZOPC, SGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6370
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6371
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6372
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6373
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6374
instruct subL_Reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6375
  match(Set dst (SubL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6376
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6377
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6378
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6379
  format %{ "SG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6380
  opcode(SG_ZOPC, SG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6381
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6382
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6383
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6384
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6385
// Moved declaration of negL_reg_reg before encode nodes, where it is used.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6386
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6387
//  MUL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6388
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6389
// Register Multiplication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6390
instruct mulI_reg_reg(iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6391
  match(Set dst (MulI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6392
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6393
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6394
  format %{ "MSR     $dst, $src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6395
  opcode(MSR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6396
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6397
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6398
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6399
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6400
// Immediate Multiplication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6401
instruct mulI_reg_imm16(iRegI dst, immI16 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6402
  match(Set dst (MulI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6403
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6404
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6405
  format %{ "MHI     $dst,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6406
  opcode(MHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6407
  ins_encode(z_riform_signed(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6408
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6409
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6410
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6411
// Immediate (32bit) Multiplication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6412
instruct mulI_reg_imm32(iRegI dst, immI con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6413
  match(Set dst (MulI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6414
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6415
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6416
  format %{ "MSFI    $dst,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6417
  opcode(MSFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6418
  ins_encode(z_rilform_signed(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6419
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6420
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6421
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6422
instruct mulI_Reg_mem(iRegI dst, memory src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6423
  match(Set dst (MulI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6424
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6425
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6426
  format %{ "MS(Y)   $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6427
  opcode(MSY_ZOPC, MS_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6428
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6429
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6430
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6431
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6432
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6433
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6434
instruct mulL_reg_regI(iRegL dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6435
  match(Set dst (MulL dst (ConvI2L src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6436
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6437
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6438
  format %{ "MSGFR   $dst $src\t # long/int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6439
  opcode(MSGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6440
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6441
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6442
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6443
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6444
instruct mulL_reg_reg(iRegL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6445
  match(Set dst (MulL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6446
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6447
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6448
  format %{ "MSGR    $dst $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6449
  opcode(MSGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6450
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6451
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6452
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6453
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6454
// Immediate Multiplication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6455
instruct mulL_reg_imm16(iRegL dst, immL16 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6456
  match(Set dst (MulL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6457
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6458
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6459
  format %{ "MGHI    $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6460
  opcode(MGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6461
  ins_encode(z_riform_signed(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6462
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6463
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6464
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6465
// Immediate (32bit) Multiplication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6466
instruct mulL_reg_imm32(iRegL dst, immL32 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6467
  match(Set dst (MulL dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6468
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6469
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6470
  format %{ "MSGFI   $dst,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6471
  opcode(MSGFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6472
  ins_encode(z_rilform_signed(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6473
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6474
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6475
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6476
instruct mulL_Reg_memI(iRegL dst, memory src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6477
  match(Set dst (MulL dst (ConvI2L (LoadI src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6478
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6479
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6480
  format %{ "MSGF    $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6481
  opcode(MSGF_ZOPC, MSGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6482
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6483
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6484
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6485
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6486
instruct mulL_Reg_mem(iRegL dst, memory src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6487
  match(Set dst (MulL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6488
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6489
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6490
  format %{ "MSG     $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6491
  opcode(MSG_ZOPC, MSG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6492
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6493
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6494
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6495
47606
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6496
instruct mulHiL_reg_reg(revenRegL Rdst, roddRegL Rsrc1, iRegL Rsrc2, iRegL Rtmp1, flagsReg cr)%{
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6497
  match(Set Rdst (MulHiL Rsrc1 Rsrc2));
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6498
  effect(TEMP_DEF Rdst, USE_KILL Rsrc1, TEMP Rtmp1, KILL cr);
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6499
  ins_cost(7*DEFAULT_COST);
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6500
  // TODO: s390 port size(VARIABLE_SIZE);
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6501
  format %{ "MulHiL  $Rdst, $Rsrc1, $Rsrc2\t # Multiply High Long" %}
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6502
  ins_encode%{
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6503
    Register dst  = $Rdst$$Register;
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6504
    Register src1 = $Rsrc1$$Register;
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6505
    Register src2 = $Rsrc2$$Register;
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6506
    Register tmp1 = $Rtmp1$$Register;
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6507
    Register tmp2 = $Rdst$$Register;
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6508
    // z/Architecture has only unsigned multiply (64 * 64 -> 128).
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6509
    // implementing mulhs(a,b) = mulhu(a,b) – (a & (b>>63)) – (b & (a>>63))
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6510
    __ z_srag(tmp2, src1, 63);  // a>>63
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6511
    __ z_srag(tmp1, src2, 63);  // b>>63
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6512
    __ z_ngr(tmp2, src2);       // b & (a>>63)
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6513
    __ z_ngr(tmp1, src1);       // a & (b>>63)
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6514
    __ z_agr(tmp1, tmp2);       // ((a & (b>>63)) + (b & (a>>63)))
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6515
    __ z_mlgr(dst, src2);       // tricky: 128-bit product is written to even/odd pair (dst,src1),
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6516
                                //         multiplicand is taken from oddReg (src1), multiplier in src2.
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6517
    __ z_sgr(dst, tmp1);
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6518
  %}
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6519
  ins_pipe(pipe_class_dummy);
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6520
%}
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47216
diff changeset
  6521
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6522
//  DIV
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6523
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6524
// Integer DIVMOD with Register, both quotient and mod results
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6525
instruct divModI_reg_divmod(roddRegI dst1src1, revenRegI dst2, noOdd_iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6526
  match(DivModI dst1src1 src2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6527
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6528
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
52412
df84c02f4780 8213196: [ppc] [s390]: prepare code for gcc7.3.1 warning (int-in-bool-context)
lucy
parents: 51009
diff changeset
  6529
  size((VM_Version::has_CompareBranch() ? 24 : 26));
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6530
  format %{ "DIVMODI ($dst1src1, $dst2) $src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6531
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6532
    Register d1s1 = $dst1src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6533
    Register d2   = $dst2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6534
    Register s2   = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6535
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6536
    assert_different_registers(d1s1, s2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6537
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6538
    Label do_div, done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6539
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6540
      __ z_cij(s2, -1, Assembler::bcondNotEqual, do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6541
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6542
      __ z_chi(s2, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6543
      __ z_brne(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6544
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6545
    __ z_lcr(d1s1, d1s1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6546
    __ clear_reg(d2, false, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6547
    __ z_bru(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6548
    __ bind(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6549
    __ z_lgfr(d1s1, d1s1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6550
    __ z_dsgfr(d2, s2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6551
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6552
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6553
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6554
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6555
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6556
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6557
// Register Division
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6558
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
  6559
  match(Set dst (DivI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6560
  effect(KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6561
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
52412
df84c02f4780 8213196: [ppc] [s390]: prepare code for gcc7.3.1 warning (int-in-bool-context)
lucy
parents: 51009
diff changeset
  6562
  size((VM_Version::has_CompareBranch() ? 20 : 22));
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6563
  format %{ "DIV_checked $dst, $src1,$src2\t # treats special case 0x80../-1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6564
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6565
    Register a = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6566
    Register b = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6567
    Register t = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6568
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6569
    assert_different_registers(t, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6570
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6571
    Label do_div, done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6572
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6573
      __ z_cij(b, -1, Assembler::bcondNotEqual, do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6574
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6575
      __ z_chi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6576
      __ z_brne(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6577
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6578
    __ z_lcr(t, a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6579
    __ z_bru(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6580
    __ bind(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6581
    __ z_lgfr(t, a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6582
    __ z_dsgfr(t->predecessor()/* t is odd part of a register pair. */, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6583
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6584
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6585
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6586
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6587
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6588
// Immediate Division
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6589
instruct divI_reg_imm16(roddRegI dst, iRegI src1, immI16 src2, revenRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6590
  match(Set dst (DivI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6591
  effect(KILL tmp, KILL cr);  // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6592
  ins_cost(2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6593
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6594
  format %{ "DIV_const  $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6595
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6596
    // No sign extension of Rdividend needed here.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6597
    if ($src2$$constant != -1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6598
      __ z_lghi(Z_R0_scratch, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6599
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6600
      __ 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
  6601
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6602
      __ z_lcr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6603
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6604
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6605
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6606
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6607
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6608
// Long DIVMOD with Register, both quotient and mod results
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6609
instruct divModL_reg_divmod(roddRegL dst1src1, revenRegL dst2, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6610
  match(DivModL dst1src1 src2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6611
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6612
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
52412
df84c02f4780 8213196: [ppc] [s390]: prepare code for gcc7.3.1 warning (int-in-bool-context)
lucy
parents: 51009
diff changeset
  6613
  size((VM_Version::has_CompareBranch() ? 22 : 24));
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6614
  format %{ "DIVMODL ($dst1src1, $dst2) $src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6615
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6616
    Register d1s1 = $dst1src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6617
    Register d2   = $dst2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6618
    Register s2   = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6619
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6620
    Label do_div, done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6621
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6622
      __ z_cgij(s2, -1, Assembler::bcondNotEqual, do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6623
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6624
      __ z_cghi(s2, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6625
      __ z_brne(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6626
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6627
    __ z_lcgr(d1s1, d1s1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6628
    // indicate unused result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6629
    (void) __ clear_reg(d2, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6630
    __ z_bru(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6631
    __ bind(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6632
    __ z_dsgr(d2, s2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6633
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6634
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6635
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6636
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6637
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6638
// Register Long Division
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6639
instruct divL_reg_reg(roddRegL dst, iRegL src, revenRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6640
  match(Set dst (DivL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6641
  effect(KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6642
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
52412
df84c02f4780 8213196: [ppc] [s390]: prepare code for gcc7.3.1 warning (int-in-bool-context)
lucy
parents: 51009
diff changeset
  6643
  size((VM_Version::has_CompareBranch() ? 18 : 20));
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6644
  format %{ "DIVG_checked  $dst, $src\t # long, treats special case 0x80../-1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6645
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6646
    Register b = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6647
    Register t = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6648
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6649
    Label done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6650
    __ z_lcgr(t, t);    // Does no harm. divisor is in other register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6651
    if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6652
      __ z_cgij(b, -1, Assembler::bcondEqual, done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6653
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6654
      __ z_cghi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6655
      __ z_bre(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6656
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6657
    __ z_lcgr(t, t);    // Restore sign.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6658
    __ z_dsgr(t->predecessor()/* t is odd part of a register pair. */, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6659
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6660
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6661
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6662
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6663
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6664
// Immediate Long Division
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6665
instruct divL_reg_imm16(roddRegL dst, iRegL src1, immL16 src2, revenRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6666
  match(Set dst (DivL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6667
  effect(KILL tmp, KILL cr);  // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6668
  ins_cost(2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6669
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6670
  format %{ "DIVG_const  $dst,$src1,$src2\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6671
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6672
    if ($src2$$constant != -1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6673
      __ z_lghi(Z_R0_scratch, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6674
      __ lgr_if_needed($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6675
      __ 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
  6676
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6677
      __ z_lcgr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6678
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6679
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6680
  ins_pipe(pipe_class_dummy);
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
// REM
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6684
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6685
// Integer Remainder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6686
// Register Remainder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6687
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
  6688
  match(Set dst (ModI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6689
  effect(KILL tmp, KILL cr);
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 %{ "MOD_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_different_registers(t->successor(), b);
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
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6701
    if ((t->encoding() != b->encoding()) && (t->encoding() != a->encoding())) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6702
      (void) __ clear_reg(t, true, false);  // Does no harm. Operands are in other regs.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6703
      if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6704
        __ z_cij(b, -1, Assembler::bcondEqual, done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6705
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6706
        __ z_chi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6707
        __ z_bre(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6708
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6709
      __ z_lgfr(t->successor(), a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6710
      __ z_dsgfr(t/* t is even part of a register pair. */, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6711
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6712
      if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6713
        __ z_cij(b, -1, Assembler::bcondNotEqual, do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6714
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6715
        __ z_chi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6716
        __ z_brne(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6717
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6718
      __ clear_reg(t, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6719
      __ z_bru(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6720
      __ bind(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6721
      __ z_lgfr(t->successor(), a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6722
      __ z_dsgfr(t/* t is even part of a register pair. */, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6723
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6724
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6725
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6726
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6727
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6728
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6729
// Immediate Remainder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6730
instruct modI_reg_imm16(revenRegI dst, iRegI src1, immI16 src2, roddRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6731
  match(Set dst (ModI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6732
  effect(KILL tmp, KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6733
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6734
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6735
  format %{ "MOD_const  $dst,src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6736
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6737
    assert_different_registers($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6738
    assert_different_registers($dst$$Register->successor(), $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6739
    int divisor = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6740
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6741
    if (divisor != -1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6742
      __ z_lghi(Z_R0_scratch, divisor);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6743
      __ z_lgfr($dst$$Register->successor(), $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6744
      __ 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
  6745
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6746
      __ clear_reg($dst$$Register, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6747
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6748
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6749
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6750
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6751
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6752
// Register Long Remainder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6753
instruct modL_reg_reg(revenRegL dst, roddRegL src1, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6754
  match(Set dst (ModL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6755
  effect(KILL src1, KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6756
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6757
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6758
  format %{ "MODG_checked   $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6759
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6760
    Register a = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6761
    Register b = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6762
    Register t = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6763
    assert(t->successor() == a, "(t,a) is an even-odd pair" );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6764
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6765
    Label do_div, done_div;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6766
    if (t->encoding() != b->encoding()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6767
      (void) __ clear_reg(t, true, false); // Does no harm. Dividend is in successor.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6768
      if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6769
        __ z_cgij(b, -1, Assembler::bcondEqual, done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6770
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6771
        __ z_cghi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6772
        __ z_bre(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6773
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6774
      __ z_dsgr(t, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6775
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6776
      if (VM_Version::has_CompareBranch()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6777
        __ z_cgij(b, -1, Assembler::bcondNotEqual, do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6778
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6779
        __ z_cghi(b, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6780
        __ z_brne(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6781
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6782
      __ clear_reg(t, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6783
      __ z_bru(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6784
      __ bind(do_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6785
      __ z_dsgr(t, b);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6786
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6787
    __ bind(done_div);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6788
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6789
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6790
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6791
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6792
// Register Long Remainder
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6793
instruct modL_reg_imm16(revenRegL dst, iRegL src1, immL16 src2, roddRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6794
  match(Set dst (ModL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6795
  effect(KILL tmp, KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6796
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6797
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6798
  format %{ "MODG_const  $dst,src1,$src2\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6799
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6800
    int divisor = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6801
    if (divisor != -1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6802
      __ z_lghi(Z_R0_scratch, divisor);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6803
      __ z_lgr($dst$$Register->successor(), $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6804
      __ 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
  6805
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6806
      __ clear_reg($dst$$Register, true, false);
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
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6810
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6811
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6812
// SHIFT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6813
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6814
// Shift left logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6815
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6816
// Register Shift Left variable
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6817
instruct sllI_reg_reg(iRegI dst, iRegI src, iRegI nbits, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6818
  match(Set dst (LShiftI src nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6819
  effect(KILL cr); // R1 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6820
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6821
  size(14);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  6822
  format %{ "SLL     $dst,$src,[$nbits] & 31\t # use RISC-like SLLG also for int" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6823
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6824
    __ z_lgr(Z_R1_scratch, $nbits$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6825
    __ z_nill(Z_R1_scratch, BitsPerJavaInteger-1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6826
    __ z_sllg($dst$$Register, $src$$Register, 0, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6827
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6828
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6829
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6830
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6831
// Register Shift Left Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6832
// Constant shift count is masked in ideal graph already.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6833
instruct sllI_reg_imm(iRegI dst, iRegI src, immI nbits) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6834
  match(Set dst (LShiftI src nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6835
  size(6);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  6836
  format %{ "SLL     $dst,$src,$nbits\t # use RISC-like SLLG also for int" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6837
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6838
    int Nbit = $nbits$$constant;
46277
73607b4788cb 8173470: [C2] Mask shift operands in ideal graph.
goetz
parents: 42897
diff changeset
  6839
    assert((Nbit & (BitsPerJavaInteger - 1)) == Nbit, "Check shift mask in ideal graph");
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6840
    __ z_sllg($dst$$Register, $src$$Register, Nbit & (BitsPerJavaInteger - 1), Z_R0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6841
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6842
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6843
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6844
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6845
// Register Shift Left Immediate by 1bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6846
instruct sllI_reg_imm_1(iRegI dst, iRegI src, immI_1 nbits) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6847
  match(Set dst (LShiftI src nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6848
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6849
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6850
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6851
  format %{ "LA      $dst,#0($src,$src)\t # SLL by 1 (int)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6852
  ins_encode %{ __ z_la($dst$$Register, 0, $src$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6853
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6854
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6855
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6856
// Register Shift Left Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6857
instruct sllL_reg_reg(iRegL dst, iRegL src1, iRegI nbits) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6858
  match(Set dst (LShiftL src1 nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6859
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6860
  format %{ "SLLG    $dst,$src1,[$nbits]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6861
  opcode(SLLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6862
  ins_encode(z_rsyform_reg_reg(dst, src1, nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6863
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6864
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6865
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6866
// Register Shift Left Long Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6867
instruct sllL_reg_imm(iRegL dst, iRegL src1, immI nbits) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6868
  match(Set dst (LShiftL src1 nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6869
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6870
  format %{ "SLLG    $dst,$src1,$nbits" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6871
  opcode(SLLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6872
  ins_encode(z_rsyform_const(dst, src1, nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6873
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6874
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6875
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6876
// Register Shift Left Long Immediate by 1bit
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6877
instruct sllL_reg_imm_1(iRegL dst, iRegL src1, immI_1 nbits) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6878
  match(Set dst (LShiftL src1 nbits));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6879
  predicate(PreferLAoverADD);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6880
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6881
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6882
  format %{ "LA      $dst,#0($src1,$src1)\t # SLLG by 1 (long)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6883
  ins_encode %{ __ z_la($dst$$Register, 0, $src1$$Register, $src1$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6884
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6885
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6886
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6887
// Shift right arithmetic
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6888
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6889
// Register Arithmetic Shift Right
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6890
instruct sraI_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6891
  match(Set dst (RShiftI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6892
  effect(KILL cr); // R1 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6893
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6894
  size(12);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6895
  format %{ "SRA     $dst,[$src] & 31" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6896
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6897
    __ z_lgr(Z_R1_scratch, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6898
    __ z_nill(Z_R1_scratch, BitsPerJavaInteger-1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6899
    __ z_sra($dst$$Register, 0, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6900
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6901
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6902
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6903
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6904
// Register Arithmetic Shift Right Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6905
// Constant shift count is masked in ideal graph already.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6906
instruct sraI_reg_imm(iRegI dst, immI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6907
  match(Set dst (RShiftI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6908
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6909
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6910
  format %{ "SRA     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6911
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6912
    int Nbit = $src$$constant;
46277
73607b4788cb 8173470: [C2] Mask shift operands in ideal graph.
goetz
parents: 42897
diff changeset
  6913
    assert((Nbit & (BitsPerJavaInteger - 1)) == Nbit, "Check shift mask in ideal graph");
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6914
    __ z_sra($dst$$Register, Nbit & (BitsPerJavaInteger - 1), Z_R0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6915
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6916
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6917
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6918
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6919
// Register Arithmetic Shift Right Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6920
instruct sraL_reg_reg(iRegL dst, iRegL src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6921
  match(Set dst (RShiftL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6922
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6923
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6924
  format %{ "SRAG    $dst,$src1,[$src2]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6925
  opcode(SRAG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6926
  ins_encode(z_rsyform_reg_reg(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6927
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6928
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6929
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6930
// Register Arithmetic Shift Right Long Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6931
instruct sraL_reg_imm(iRegL dst, iRegL src1, immI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6932
  match(Set dst (RShiftL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6933
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6934
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6935
  format %{ "SRAG    $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6936
  opcode(SRAG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6937
  ins_encode(z_rsyform_const(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6938
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6939
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6940
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6941
//  Shift right logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6942
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6943
// Register Shift Right
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6944
instruct srlI_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6945
  match(Set dst (URShiftI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6946
  effect(KILL cr); // R1 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6947
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6948
  size(12);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6949
  format %{ "SRL     $dst,[$src] & 31" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6950
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6951
    __ z_lgr(Z_R1_scratch, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6952
    __ z_nill(Z_R1_scratch, BitsPerJavaInteger-1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6953
    __ z_srl($dst$$Register, 0, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6954
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6955
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6956
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6957
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6958
// Register Shift Right Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6959
// Constant shift count is masked in ideal graph already.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6960
instruct srlI_reg_imm(iRegI dst, immI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6961
  match(Set dst (URShiftI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6962
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6963
  format %{ "SRL     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6964
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6965
    int Nbit = $src$$constant;
46277
73607b4788cb 8173470: [C2] Mask shift operands in ideal graph.
goetz
parents: 42897
diff changeset
  6966
    assert((Nbit & (BitsPerJavaInteger - 1)) == Nbit, "Check shift mask in ideal graph");
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6967
    __ z_srl($dst$$Register, Nbit & (BitsPerJavaInteger - 1), Z_R0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6968
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6969
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6970
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6971
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6972
// Register Shift Right Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6973
instruct srlL_reg_reg(iRegL dst, iRegL src1, iRegI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6974
  match(Set dst (URShiftL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6975
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6976
  format %{ "SRLG    $dst,$src1,[$src2]" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6977
  opcode(SRLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6978
  ins_encode(z_rsyform_reg_reg(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6979
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6980
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6981
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6982
// Register Shift Right Long Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6983
instruct srlL_reg_imm(iRegL dst, iRegL src1, immI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6984
  match(Set dst (URShiftL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6985
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6986
  format %{ "SRLG    $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6987
  opcode(SRLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6988
  ins_encode(z_rsyform_const(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6989
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6990
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6991
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6992
// Register Shift Right Immediate with a CastP2X
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6993
instruct srlP_reg_imm(iRegL dst, iRegP_N2P src1, immI src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6994
  match(Set dst (URShiftL (CastP2X src1) src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6995
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6996
  format %{ "SRLG    $dst,$src1,$src2\t # Cast ptr $src1 to long and shift" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6997
  opcode(SRLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6998
  ins_encode(z_rsyform_const(dst, src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  6999
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7000
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7001
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7002
//----------Rotate Instructions------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7003
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7004
// Rotate left 32bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7005
instruct rotlI_reg_immI8(iRegI dst, iRegI src, immI8 lshift, immI8 rshift) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7006
  match(Set dst (OrI (LShiftI src lshift) (URShiftI src rshift)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7007
  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
  7008
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7009
  format %{ "RLL     $dst,$src,$lshift\t # ROTL32" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7010
  opcode(RLL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7011
  ins_encode(z_rsyform_const(dst, src, lshift));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7012
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7013
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7014
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7015
// Rotate left 64bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7016
instruct rotlL_reg_immI8(iRegL dst, iRegL src, immI8 lshift, immI8 rshift) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7017
  match(Set dst (OrL (LShiftL src lshift) (URShiftL src rshift)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7018
  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
  7019
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7020
  format %{ "RLLG    $dst,$src,$lshift\t # ROTL64" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7021
  opcode(RLLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7022
  ins_encode(z_rsyform_const(dst, src, lshift));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7023
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7024
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7025
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7026
// Rotate right 32bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7027
instruct rotrI_reg_immI8(iRegI dst, iRegI src, immI8 rshift, immI8 lshift) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7028
  match(Set dst (OrI (URShiftI src rshift) (LShiftI src lshift)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7029
  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
  7030
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7031
  format %{ "RLL     $dst,$src,$rshift\t # ROTR32" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7032
  opcode(RLL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7033
  ins_encode(z_rsyform_const(dst, src, rshift));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7034
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7035
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7036
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7037
// Rotate right 64bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7038
instruct rotrL_reg_immI8(iRegL dst, iRegL src, immI8 rshift, immI8 lshift) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7039
  match(Set dst (OrL (URShiftL src rshift) (LShiftL src lshift)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7040
  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
  7041
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7042
  format %{ "RLLG    $dst,$src,$rshift\t # ROTR64" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7043
  opcode(RLLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7044
  ins_encode(z_rsyform_const(dst, src, rshift));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7045
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7046
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7047
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7048
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7049
//----------Overflow Math Instructions-----------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7050
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7051
instruct overflowAddI_reg_reg(flagsReg cr, iRegI op1, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7052
  match(Set cr (OverflowAddI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7053
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7054
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7055
  format %{ "AR      $op1,$op2\t # overflow check int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7056
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7057
    __ z_lr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7058
    __ z_ar(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7059
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7060
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7061
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7062
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7063
instruct overflowAddI_reg_imm(flagsReg cr, iRegI op1, immI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7064
  match(Set cr (OverflowAddI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7065
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7066
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7067
  format %{ "AR      $op1,$op2\t # overflow check int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7068
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7069
    __ load_const_optimized(Z_R0_scratch, $op2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7070
    __ z_ar(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7071
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7072
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7073
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7074
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7075
instruct overflowAddL_reg_reg(flagsReg cr, iRegL op1, iRegL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7076
  match(Set cr (OverflowAddL op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7077
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7078
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7079
  format %{ "AGR     $op1,$op2\t # overflow check long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7080
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7081
    __ z_lgr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7082
    __ z_agr(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7083
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7084
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7085
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7086
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7087
instruct overflowAddL_reg_imm(flagsReg cr, iRegL op1, immL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7088
  match(Set cr (OverflowAddL op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7089
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7090
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7091
  format %{ "AGR     $op1,$op2\t # overflow check long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7092
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7093
    __ load_const_optimized(Z_R0_scratch, $op2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7094
    __ z_agr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7095
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7096
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7097
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7098
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7099
instruct overflowSubI_reg_reg(flagsReg cr, iRegI op1, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7100
  match(Set cr (OverflowSubI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7101
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7102
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7103
  format %{ "SR      $op1,$op2\t # overflow check int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7104
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7105
    __ z_lr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7106
    __ z_sr(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7107
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7108
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7109
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7110
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7111
instruct overflowSubI_reg_imm(flagsReg cr, iRegI op1, immI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7112
  match(Set cr (OverflowSubI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7113
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7114
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7115
  format %{ "SR      $op1,$op2\t # overflow check int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7116
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7117
    __ load_const_optimized(Z_R1_scratch, $op2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7118
    __ z_lr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7119
    __ z_sr(Z_R0_scratch, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7120
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7121
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7122
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7123
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7124
instruct overflowSubL_reg_reg(flagsReg cr, iRegL op1, iRegL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7125
  match(Set cr (OverflowSubL op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7126
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7127
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7128
  format %{ "SGR     $op1,$op2\t # overflow check long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7129
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7130
    __ z_lgr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7131
    __ z_sgr(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7132
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7133
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7134
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7135
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7136
instruct overflowSubL_reg_imm(flagsReg cr, iRegL op1, immL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7137
  match(Set cr (OverflowSubL op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7138
  effect(DEF cr, USE op1, USE op2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7139
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7140
  format %{ "SGR     $op1,$op2\t # overflow check long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7141
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7142
    __ load_const_optimized(Z_R1_scratch, $op2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7143
    __ z_lgr(Z_R0_scratch, $op1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7144
    __ z_sgr(Z_R0_scratch, Z_R1_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7145
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7146
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7147
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7148
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7149
instruct overflowNegI_rReg(flagsReg cr, immI_0 zero, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7150
  match(Set cr (OverflowSubI zero op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7151
  effect(DEF cr, USE op2);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  7152
  format %{ "NEG    $op2\t # overflow check int" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7153
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7154
    __ clear_reg(Z_R0_scratch, false, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7155
    __ z_sr(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7156
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7157
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7158
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7159
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7160
instruct overflowNegL_rReg(flagsReg cr, immL_0 zero, iRegL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7161
  match(Set cr (OverflowSubL zero op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7162
  effect(DEF cr, USE op2);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  7163
  format %{ "NEGG    $op2\t # overflow check long" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7164
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7165
    __ clear_reg(Z_R0_scratch, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7166
    __ z_sgr(Z_R0_scratch, $op2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7167
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7168
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7169
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7170
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7171
// No intrinsics for multiplication, since there is no easy way
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7172
// to check for overflow.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7173
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7174
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7175
//----------Floating Point Arithmetic Instructions-----------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7176
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7177
//  ADD
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7178
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7179
//  Add float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7180
instruct addF_reg_reg(regF dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7181
  match(Set dst (AddF dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7182
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7183
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7184
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7185
  format %{ "AEBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7186
  opcode(AEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7187
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7188
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7189
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7190
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7191
instruct addF_reg_mem(regF dst, memoryRX src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7192
  match(Set dst (AddF dst (LoadF src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7193
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7194
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7195
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7196
  format %{ "AEB      $dst,$src\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7197
  opcode(AEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7198
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7199
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7200
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7201
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7202
// Add float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7203
instruct addD_reg_reg(regD dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7204
  match(Set dst (AddD dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7205
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7206
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7207
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7208
  format %{ "ADBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7209
  opcode(ADBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7210
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7211
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7212
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7213
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7214
instruct addD_reg_mem(regD dst, memoryRX src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7215
  match(Set dst (AddD dst (LoadD src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7216
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7217
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7218
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7219
  format %{ "ADB      $dst,$src\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7220
  opcode(ADB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7221
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7222
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7223
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7224
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7225
// SUB
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7226
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7227
// Sub float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7228
instruct subF_reg_reg(regF dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7229
  match(Set dst (SubF dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7230
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7231
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7232
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7233
  format %{ "SEBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7234
  opcode(SEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7235
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7236
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7237
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7238
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7239
instruct subF_reg_mem(regF dst, memoryRX src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7240
  match(Set dst (SubF dst (LoadF src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7241
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7242
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7243
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7244
  format %{ "SEB      $dst,$src\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7245
  opcode(SEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7246
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7247
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7248
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7249
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7250
//  Sub float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7251
instruct subD_reg_reg(regD dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7252
  match(Set dst (SubD dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7253
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7254
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7255
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7256
  format %{ "SDBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7257
  opcode(SDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7258
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7259
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7260
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7261
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7262
instruct subD_reg_mem(regD dst, memoryRX src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7263
  match(Set dst (SubD dst (LoadD src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7264
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7265
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7266
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7267
  format %{ "SDB      $dst,$src\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7268
  opcode(SDB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7269
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7270
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7271
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7272
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7273
// MUL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7274
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7275
// Mul float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7276
instruct mulF_reg_reg(regF dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7277
  match(Set dst (MulF dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7278
  // CC unchanged by MUL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7279
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7280
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7281
  format %{ "MEEBR    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7282
  opcode(MEEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7283
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7284
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7285
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7286
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7287
instruct mulF_reg_mem(regF dst, memoryRX src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7288
  match(Set dst (MulF dst (LoadF src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7289
  // CC unchanged by MUL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7290
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7291
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7292
  format %{ "MEEB     $dst,$src\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7293
  opcode(MEEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7294
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7295
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7296
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7297
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7298
//  Mul float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7299
instruct mulD_reg_reg(regD dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7300
  match(Set dst (MulD dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7301
  // CC unchanged by MUL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7302
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7303
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7304
  format %{ "MDBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7305
  opcode(MDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7306
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7307
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7308
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7309
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7310
instruct mulD_reg_mem(regD dst, memoryRX src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7311
  match(Set dst (MulD dst (LoadD src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7312
  // CC unchanged by MUL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7313
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7314
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7315
  format %{ "MDB      $dst,$src\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7316
  opcode(MDB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7317
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7318
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7319
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7320
42897
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7321
// Multiply-Accumulate
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7322
// src1 * src2 + dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7323
instruct maddF_reg_reg(regF dst, regF src1, regF src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7324
  match(Set dst (FmaF dst (Binary src1 src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7325
  // CC unchanged by MUL-ADD.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7326
  ins_cost(ALU_REG_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7327
  size(4);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7328
  format %{ "MAEBR    $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7329
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7330
    __ z_maebr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7331
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7332
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7333
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7334
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7335
// src1 * src2 + dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7336
instruct maddD_reg_reg(regD dst, regD src1, regD src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7337
  match(Set dst (FmaD dst (Binary src1 src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7338
  // CC unchanged by MUL-ADD.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7339
  ins_cost(ALU_REG_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7340
  size(4);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7341
  format %{ "MADBR    $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7342
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7343
    __ z_madbr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7344
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7345
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7346
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7347
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7348
// src1 * src2 - dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7349
instruct msubF_reg_reg(regF dst, regF src1, regF src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7350
  match(Set dst (FmaF (NegF dst) (Binary src1 src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7351
  // CC unchanged by MUL-SUB.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7352
  ins_cost(ALU_REG_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7353
  size(4);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7354
  format %{ "MSEBR    $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7355
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7356
    __ z_msebr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7357
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7358
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7359
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7360
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7361
// src1 * src2 - dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7362
instruct msubD_reg_reg(regD dst, regD src1, regD src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7363
  match(Set dst (FmaD (NegD dst) (Binary src1 src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7364
  // CC unchanged by MUL-SUB.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7365
  ins_cost(ALU_REG_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7366
  size(4);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7367
  format %{ "MSDBR    $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7368
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7369
    __ z_msdbr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7370
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7371
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7372
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7373
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7374
// src1 * src2 + dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7375
instruct maddF_reg_mem(regF dst, regF src1, memoryRX src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7376
  match(Set dst (FmaF dst (Binary src1 (LoadF src2))));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7377
  // CC unchanged by MUL-ADD.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7378
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7379
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7380
  format %{ "MAEB     $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7381
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7382
    __ z_maeb($dst$$FloatRegister, $src1$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7383
              Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7384
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7385
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7386
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7387
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7388
// src1 * src2 + dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7389
instruct maddD_reg_mem(regD dst, regD src1, memoryRX src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7390
  match(Set dst (FmaD dst (Binary src1 (LoadD src2))));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7391
  // CC unchanged by MUL-ADD.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7392
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7393
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7394
  format %{ "MADB     $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7395
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7396
    __ z_madb($dst$$FloatRegister, $src1$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7397
              Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7398
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7399
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7400
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7401
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7402
// src1 * src2 - dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7403
instruct msubF_reg_mem(regF dst, regF src1, memoryRX src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7404
  match(Set dst (FmaF (NegF dst) (Binary src1 (LoadF src2))));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7405
  // CC unchanged by MUL-SUB.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7406
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7407
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7408
  format %{ "MSEB     $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7409
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7410
    __ z_mseb($dst$$FloatRegister, $src1$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7411
              Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7412
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7413
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7414
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7415
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7416
// src1 * src2 - dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7417
instruct msubD_reg_mem(regD dst, regD src1, memoryRX src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7418
  match(Set dst (FmaD (NegD dst) (Binary src1 (LoadD src2))));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7419
  // CC unchanged by MUL-SUB.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7420
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7421
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7422
  format %{ "MSDB    $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7423
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7424
    __ z_msdb($dst$$FloatRegister, $src1$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7425
              Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7426
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7427
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7428
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7429
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7430
// src1 * src2 + dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7431
instruct maddF_mem_reg(regF dst, memoryRX src1, regF src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7432
  match(Set dst (FmaF dst (Binary (LoadF src1) src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7433
  // CC unchanged by MUL-ADD.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7434
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7435
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7436
  format %{ "MAEB     $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7437
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7438
    __ z_maeb($dst$$FloatRegister, $src2$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7439
              Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7440
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7441
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7442
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7443
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7444
// src1 * src2 + dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7445
instruct maddD_mem_reg(regD dst, memoryRX src1, regD src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7446
  match(Set dst (FmaD dst (Binary (LoadD src1) src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7447
  // CC unchanged by MUL-ADD.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7448
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7449
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7450
  format %{ "MADB     $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7451
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7452
    __ z_madb($dst$$FloatRegister, $src2$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7453
              Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7454
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7455
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7456
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7457
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7458
// src1 * src2 - dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7459
instruct msubF_mem_reg(regF dst, memoryRX src1, regF src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7460
  match(Set dst (FmaF (NegF dst) (Binary (LoadF src1) src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7461
  // CC unchanged by MUL-SUB.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7462
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7463
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7464
  format %{ "MSEB     $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7465
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7466
    __ z_mseb($dst$$FloatRegister, $src2$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7467
              Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7468
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7469
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7470
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7471
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7472
// src1 * src2 - dst
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7473
instruct msubD_mem_reg(regD dst, memoryRX src1, regD src2) %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7474
  match(Set dst (FmaD (NegD dst) (Binary (LoadD src1) src2)));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7475
  // CC unchanged by MUL-SUB.
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7476
  ins_cost(ALU_MEMORY_COST);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7477
  size(6);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7478
  format %{ "MSDB    $dst, $src1, $src2" %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7479
  ins_encode %{
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7480
    __ z_msdb($dst$$FloatRegister, $src2$$FloatRegister,
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7481
              Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7482
  %}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7483
  ins_pipe(pipe_class_dummy);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7484
%}
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42556
diff changeset
  7485
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7486
//  DIV
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7487
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7488
//  Div float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7489
instruct divF_reg_reg(regF dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7490
  match(Set dst (DivF dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7491
  // CC unchanged by DIV.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7492
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7493
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7494
  format %{ "DEBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7495
  opcode(DEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7496
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7497
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7498
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7499
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7500
instruct divF_reg_mem(regF dst, memoryRX src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7501
  match(Set dst (DivF dst (LoadF src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7502
  // CC unchanged by DIV.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7503
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7504
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7505
  format %{ "DEB      $dst,$src\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7506
  opcode(DEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7507
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7508
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7509
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7510
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7511
//  Div float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7512
instruct divD_reg_reg(regD dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7513
  match(Set dst (DivD dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7514
  // CC unchanged by DIV.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7515
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7516
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7517
  format %{ "DDBR     $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7518
  opcode(DDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7519
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7520
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7521
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7522
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7523
instruct divD_reg_mem(regD dst, memoryRX src)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7524
  match(Set dst (DivD dst (LoadD src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7525
  // CC unchanged by DIV.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7526
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7527
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7528
  format %{ "DDB      $dst,$src\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7529
  opcode(DDB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7530
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7531
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7532
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7533
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7534
// ABS
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7535
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7536
// Absolute float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7537
instruct absF_reg(regF dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7538
  match(Set dst (AbsF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7539
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7540
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7541
  format %{ "LPEBR    $dst,$src\t float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7542
  opcode(LPEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7543
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7544
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7545
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7546
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7547
// Absolute float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7548
instruct absD_reg(regD dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7549
  match(Set dst (AbsD src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7550
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7551
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7552
  format %{ "LPDBR    $dst,$src\t double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7553
  opcode(LPDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7554
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7555
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7556
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7557
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7558
//  NEG(ABS)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7559
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7560
// Negative absolute float single precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7561
instruct nabsF_reg(regF dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7562
  match(Set dst (NegF (AbsF src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7563
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7564
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7565
  format %{ "LNEBR    $dst,$src\t float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7566
  opcode(LNEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7567
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7568
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7569
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7570
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7571
// Negative absolute float double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7572
instruct nabsD_reg(regD dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7573
  match(Set dst (NegD (AbsD src)));
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
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7576
  format %{ "LNDBR    $dst,$src\t double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7577
  opcode(LNDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7578
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7579
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7580
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7581
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7582
// NEG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7583
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7584
instruct negF_reg(regF dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7585
  match(Set dst (NegF 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
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7588
  format %{ "NegF     $dst,$src\t float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7589
  ins_encode %{ __ z_lcebr($dst$$FloatRegister, $src$$FloatRegister); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7590
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7591
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7592
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7593
instruct negD_reg(regD dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7594
  match(Set dst (NegD src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7595
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7596
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7597
  format %{ "NegD     $dst,$src\t double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7598
  ins_encode %{ __ z_lcdbr($dst$$FloatRegister, $src$$FloatRegister); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7599
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7600
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7601
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7602
// SQRT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7603
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7604
// Sqrt float precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7605
instruct sqrtF_reg(regF dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7606
  match(Set dst (ConvD2F (SqrtD (ConvF2D src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7607
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7608
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7609
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7610
  format %{ "SQEBR    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7611
  opcode(SQEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7612
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7613
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7614
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7615
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7616
// Sqrt double precision
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7617
instruct sqrtD_reg(regD dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7618
  match(Set dst (SqrtD src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7619
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7620
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7621
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7622
  format %{ "SQDBR    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7623
  opcode(SQDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7624
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7625
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7626
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7627
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7628
instruct sqrtF_mem(regF dst, memoryRX src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7629
  match(Set dst (ConvD2F (SqrtD (ConvF2D src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7630
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7631
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7632
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7633
  format %{ "SQEB     $dst,$src\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7634
  opcode(SQEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7635
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7636
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7637
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7638
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7639
instruct sqrtD_mem(regD dst, memoryRX src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7640
  match(Set dst (SqrtD src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7641
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7642
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7643
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7644
  format %{ "SQDB     $dst,$src\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7645
  opcode(SQDB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7646
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7647
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7648
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7649
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7650
//----------Logical Instructions-----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7651
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7652
// Register And
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7653
instruct andI_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7654
  match(Set dst (AndI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7655
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7656
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7657
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7658
  format %{ "NR      $dst,$src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7659
  opcode(NR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7660
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7661
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7662
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7663
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7664
instruct andI_Reg_mem(iRegI dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7665
  match(Set dst (AndI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7666
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7667
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7668
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7669
  format %{ "N(Y)    $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7670
  opcode(NY_ZOPC, N_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7671
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7672
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7673
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7674
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7675
// Immediate And
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7676
instruct andI_reg_uimm32(iRegI dst, uimmI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7677
  match(Set dst (AndI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7678
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7679
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7680
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7681
  format %{ "NILF    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7682
  opcode(NILF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7683
  ins_encode(z_rilform_unsigned(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7684
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7685
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7686
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7687
instruct andI_reg_uimmI_LH1(iRegI dst, uimmI_LH1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7688
  match(Set dst (AndI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7689
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7690
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7691
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7692
  format %{ "NILH    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7693
  ins_encode %{ __ z_nilh($dst$$Register, ($src$$constant >> 16) & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7694
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7695
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7696
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7697
instruct andI_reg_uimmI_LL1(iRegI dst, uimmI_LL1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7698
  match(Set dst (AndI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7699
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7700
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7701
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7702
  format %{ "NILL    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7703
  ins_encode %{ __ z_nill($dst$$Register, $src$$constant & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7704
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7705
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7706
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7707
// Register And Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7708
instruct andL_reg_reg(iRegL dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7709
  match(Set dst (AndL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7710
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7711
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7712
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7713
  format %{ "NGR     $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7714
  opcode(NGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7715
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7716
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7717
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7718
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7719
instruct andL_Reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7720
  match(Set dst (AndL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7721
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7722
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7723
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7724
  format %{ "NG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7725
  opcode(NG_ZOPC, NG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7726
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7727
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7728
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7729
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7730
instruct andL_reg_uimmL_LL1(iRegL dst, uimmL_LL1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7731
  match(Set dst (AndL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7732
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7733
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7734
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7735
  format %{ "NILL    $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7736
  ins_encode %{ __ z_nill($dst$$Register, $src$$constant & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7737
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7738
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7739
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7740
instruct andL_reg_uimmL_LH1(iRegL dst, uimmL_LH1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7741
  match(Set dst (AndL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7742
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7743
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7744
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7745
  format %{ "NILH    $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7746
  ins_encode %{ __ z_nilh($dst$$Register, ($src$$constant >> 16) & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7747
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7748
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7749
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7750
instruct andL_reg_uimmL_HL1(iRegL dst, uimmL_HL1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7751
  match(Set dst (AndL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7752
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7753
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7754
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7755
  format %{ "NIHL    $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7756
  ins_encode %{ __ z_nihl($dst$$Register, ($src$$constant >> 32) & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7757
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7758
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7759
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7760
instruct andL_reg_uimmL_HH1(iRegL dst, uimmL_HH1 src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7761
  match(Set dst (AndL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7762
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7763
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7764
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7765
  format %{ "NIHH    $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7766
  ins_encode %{ __ z_nihh($dst$$Register, ($src$$constant >> 48) & 0xFFFF); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7767
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7768
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7769
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7770
//  OR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7771
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7772
// Or Instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7773
// Register Or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7774
instruct orI_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7775
  match(Set dst (OrI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7776
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7777
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7778
  format %{ "OR      $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7779
  opcode(OR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7780
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7781
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7782
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7783
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7784
instruct orI_Reg_mem(iRegI dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7785
  match(Set dst (OrI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7786
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7787
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7788
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7789
  format %{ "O(Y)    $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7790
  opcode(OY_ZOPC, O_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7791
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7792
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7793
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7794
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7795
// Immediate Or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7796
instruct orI_reg_uimm16(iRegI dst, uimmI16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7797
  match(Set dst (OrI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7798
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7799
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7800
  format %{ "OILL    $dst,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7801
  opcode(OILL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7802
  ins_encode(z_riform_unsigned(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7803
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7804
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7805
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7806
instruct orI_reg_uimm32(iRegI dst, uimmI con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7807
  match(Set dst (OrI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7808
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7809
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7810
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7811
  format %{ "OILF    $dst,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7812
  opcode(OILF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7813
  ins_encode(z_rilform_unsigned(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7814
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7815
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7816
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7817
// Register Or Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7818
instruct orL_reg_reg(iRegL dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7819
  match(Set dst (OrL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7820
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7821
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7822
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7823
  format %{ "OGR      $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7824
  opcode(OGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7825
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7826
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7827
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7828
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7829
instruct orL_Reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7830
  match(Set dst (OrL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7831
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7832
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7833
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7834
  format %{ "OG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7835
  opcode(OG_ZOPC, OG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7836
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7837
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7838
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7839
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7840
// Immediate Or long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7841
instruct orL_reg_uimm16(iRegL dst, uimmL16 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7842
  match(Set dst (OrL dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7843
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7844
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7845
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7846
  format %{ "OILL    $dst,$con\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7847
  opcode(OILL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7848
  ins_encode(z_riform_unsigned(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7849
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7850
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7851
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7852
instruct orL_reg_uimm32(iRegI dst, uimmL32 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7853
  match(Set dst (OrI dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7854
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7855
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7856
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7857
  format %{ "OILF    $dst,$con\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7858
  opcode(OILF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7859
  ins_encode(z_rilform_unsigned(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7860
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7861
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7862
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7863
// XOR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7864
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7865
// Register Xor
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7866
instruct xorI_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7867
  match(Set dst (XorI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7868
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7869
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7870
  format %{ "XR      $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7871
  opcode(XR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7872
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7873
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7874
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7875
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7876
instruct xorI_Reg_mem(iRegI dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7877
  match(Set dst (XorI dst (LoadI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7878
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7879
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7880
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7881
  format %{ "X(Y)    $dst, $src\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7882
  opcode(XY_ZOPC, X_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7883
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7884
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7885
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7886
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7887
// Immediate Xor
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7888
instruct xorI_reg_uimm32(iRegI dst, uimmI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7889
  match(Set dst (XorI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7890
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7891
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7892
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7893
  format %{ "XILF    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7894
  opcode(XILF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7895
  ins_encode(z_rilform_unsigned(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7896
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7897
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7898
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7899
// Register Xor Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7900
instruct xorL_reg_reg(iRegL dst, iRegL src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7901
  match(Set dst (XorL dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7902
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7903
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7904
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7905
  format %{ "XGR     $dst,$src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7906
  opcode(XGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7907
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7908
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7909
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7910
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7911
instruct xorL_Reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7912
  match(Set dst (XorL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7913
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7914
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7915
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7916
  format %{ "XG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7917
  opcode(XG_ZOPC, XG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7918
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7919
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7920
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7921
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7922
// Immediate Xor Long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7923
instruct xorL_reg_uimm32(iRegL dst, uimmL32 con, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7924
  match(Set dst (XorL dst con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7925
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7926
  ins_cost(DEFAULT_COST_HIGH);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7927
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7928
  format %{ "XILF    $dst,$con\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7929
  opcode(XILF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7930
  ins_encode(z_rilform_unsigned(dst,con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7931
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7932
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7933
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7934
//----------Convert to Boolean-------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7935
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7936
// Convert integer to boolean.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7937
instruct convI2B(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7938
  match(Set dst (Conv2B src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7939
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7940
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7941
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7942
  format %{ "convI2B $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7943
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7944
    __ z_lnr($dst$$Register, $src$$Register);  // Rdst := -|Rsrc|, i.e. Rdst == 0 <=> Rsrc == 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7945
    __ z_srl($dst$$Register, 31);              // Rdst := sign(Rdest)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7946
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7947
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7948
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7949
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7950
instruct convP2B(iRegI dst, iRegP_N2P src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7951
  match(Set dst (Conv2B src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7952
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7953
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7954
  size(10);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7955
  format %{ "convP2B $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7956
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7957
    __ z_lngr($dst$$Register, $src$$Register);     // Rdst := -|Rsrc| i.e. Rdst == 0 <=> Rsrc == 0
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7958
    __ z_srlg($dst$$Register, $dst$$Register, 63); // Rdst := sign(Rdest)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7959
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7960
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7961
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7962
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7963
instruct cmpLTMask_reg_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7964
  match(Set dst (CmpLTMask dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7965
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7966
  ins_cost(2 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7967
  size(18);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7968
  format %{ "Set $dst CmpLTMask $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7969
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7970
    // Avoid signed 32 bit overflow: Do sign extend and sub 64 bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7971
    __ z_lgfr(Z_R0_scratch, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7972
    __ z_lgfr($dst$$Register, $dst$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7973
    __ z_sgr($dst$$Register, Z_R0_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7974
    __ z_srag($dst$$Register, $dst$$Register, 63);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7975
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7976
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7977
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7978
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7979
instruct cmpLTMask_reg_zero(iRegI dst, immI_0 zero, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7980
  match(Set dst (CmpLTMask dst zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7981
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7982
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7983
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7984
  format %{ "Set $dst CmpLTMask $dst,$zero" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7985
  ins_encode %{ __ z_sra($dst$$Register, 31); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7986
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7987
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7988
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7989
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7990
//----------Arithmetic Conversion Instructions---------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7991
// The conversions operations are all Alpha sorted. Please keep it that way!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7992
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7993
instruct convD2F_reg(regF dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7994
  match(Set dst (ConvD2F src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7995
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7996
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7997
  format %{ "LEDBR   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7998
  opcode(LEDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  7999
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8000
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8001
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8002
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8003
instruct convF2I_reg(iRegI dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8004
  match(Set dst (ConvF2I src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8005
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8006
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8007
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8008
  format %{ "convF2I  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8009
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8010
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8011
    __ clear_reg($dst$$Register, false, false);  // Initialize with result for unordered: 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8012
    __ z_cebr($src$$FloatRegister, $src$$FloatRegister);   // Round.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8013
    __ z_brno(done);                             // Result is zero if unordered argument.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8014
    __ z_cfebr($dst$$Register, $src$$FloatRegister, Assembler::to_zero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8015
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8016
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8017
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8018
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8019
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8020
instruct convD2I_reg(iRegI dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8021
  match(Set dst (ConvD2I src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8022
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8023
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8024
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8025
  format %{ "convD2I  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8026
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8027
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8028
    __ clear_reg($dst$$Register, false, false);  // Initialize with result for unordered: 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8029
    __ z_cdbr($src$$FloatRegister, $src$$FloatRegister);   // Round.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8030
    __ z_brno(done);                             // Result is zero if unordered argument.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8031
    __ z_cfdbr($dst$$Register, $src$$FloatRegister, Assembler::to_zero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8032
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8033
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8034
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8035
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8036
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8037
instruct convF2L_reg(iRegL dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8038
  match(Set dst (ConvF2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8039
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8040
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8041
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8042
  format %{ "convF2L  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8043
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8044
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8045
    __ clear_reg($dst$$Register, true, false);  // Initialize with result for unordered: 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8046
    __ z_cebr($src$$FloatRegister, $src$$FloatRegister);   // Round.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8047
    __ z_brno(done);                             // Result is zero if unordered argument.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8048
    __ z_cgebr($dst$$Register, $src$$FloatRegister, Assembler::to_zero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8049
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8050
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8051
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8052
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8053
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8054
instruct convD2L_reg(iRegL dst, regD src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8055
  match(Set dst (ConvD2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8056
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8057
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8058
  size(16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8059
  format %{ "convD2L  $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8060
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8061
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8062
    __ clear_reg($dst$$Register, true, false);  // Initialize with result for unordered: 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8063
    __ z_cdbr($src$$FloatRegister, $src$$FloatRegister);   // Round.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8064
    __ z_brno(done);                             // Result is zero if unordered argument.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8065
    __ z_cgdbr($dst$$Register, $src$$FloatRegister, Assembler::to_zero);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8066
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8067
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8068
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8069
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8070
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8071
instruct convF2D_reg(regD dst, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8072
  match(Set dst (ConvF2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8073
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8074
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8075
  format %{ "LDEBR   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8076
  opcode(LDEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8077
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8078
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8079
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8080
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8081
instruct convF2D_mem(regD dst, memoryRX src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8082
  match(Set dst (ConvF2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8083
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8084
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8085
  format %{ "LDEB    $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8086
  opcode(LDEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8087
  ins_encode(z_form_rt_memFP(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8088
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8089
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8090
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8091
instruct convI2D_reg(regD dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8092
  match(Set dst (ConvI2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8093
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8094
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8095
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8096
  format %{ "CDFBR   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8097
  opcode(CDFBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8098
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8099
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8100
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8101
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8102
// Optimization that saves up to two memory operations for each conversion.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8103
instruct convI2F_ireg(regF dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8104
  match(Set dst (ConvI2F src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8105
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8106
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8107
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8108
  format %{ "CEFBR   $dst,$src\t # convert int to float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8109
  opcode(CEFBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8110
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8111
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8112
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8113
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8114
instruct convI2L_reg(iRegL dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8115
  match(Set dst (ConvI2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8116
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8117
  format %{ "LGFR    $dst,$src\t # int->long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8118
  opcode(LGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8119
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8120
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8121
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8122
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8123
// Zero-extend convert int to long.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8124
instruct convI2L_reg_zex(iRegL dst, iRegI src, immL_32bits mask) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8125
  match(Set dst (AndL (ConvI2L src) mask));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8126
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8127
  format %{ "LLGFR   $dst, $src \t # zero-extend int to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8128
  ins_encode %{ __ z_llgfr($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8129
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8130
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8131
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8132
// Zero-extend convert int to long.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8133
instruct convI2L_mem_zex(iRegL dst, memory src, immL_32bits mask) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8134
  match(Set dst (AndL (ConvI2L (LoadI src)) mask));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8135
  // Uses load_const_optmized, so size can vary.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8136
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8137
  format %{ "LLGF    $dst, $src \t # zero-extend int to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8138
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8139
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8140
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8141
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8142
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8143
// Zero-extend long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8144
instruct zeroExtend_long(iRegL dst, iRegL src, immL_32bits mask) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8145
  match(Set dst (AndL src mask));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8146
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8147
  format %{ "LLGFR   $dst, $src \t # zero-extend long to long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8148
  ins_encode %{ __ z_llgfr($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8149
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8150
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8151
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8152
instruct rShiftI16_lShiftI16_reg(iRegI dst, iRegI src, immI_16 amount) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8153
  match(Set dst (RShiftI (LShiftI src amount) amount));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8154
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8155
  format %{ "LHR     $dst,$src\t short->int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8156
  opcode(LHR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8157
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8158
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8159
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8160
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8161
instruct rShiftI24_lShiftI24_reg(iRegI dst, iRegI src, immI_24 amount) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8162
  match(Set dst (RShiftI (LShiftI src amount) amount));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8163
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8164
  format %{ "LBR     $dst,$src\t byte->int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8165
  opcode(LBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8166
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8167
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8168
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8169
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8170
instruct MoveF2I_stack_reg(iRegI dst, stackSlotF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8171
  match(Set dst (MoveF2I src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8172
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8173
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8174
  format %{ "L       $dst,$src\t # MoveF2I" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8175
  opcode(L_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8176
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8177
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8178
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8179
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8180
// javax.imageio.stream.ImageInputStreamImpl.toFloats([B[FII)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8181
instruct MoveI2F_stack_reg(regF dst, stackSlotI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8182
  match(Set dst (MoveI2F src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8183
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8184
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8185
  format %{ "LE      $dst,$src\t # MoveI2F" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8186
  opcode(LE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8187
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8188
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8189
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8190
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8191
instruct MoveD2L_stack_reg(iRegL dst, stackSlotD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8192
  match(Set dst (MoveD2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8193
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8194
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8195
  format %{ "LG      $src,$dst\t # MoveD2L" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8196
  opcode(LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8197
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8198
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8199
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8200
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8201
instruct MoveL2D_stack_reg(regD dst, stackSlotL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8202
  match(Set dst (MoveL2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8203
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8204
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8205
  format %{ "LD      $dst,$src\t # MoveL2D" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8206
  opcode(LD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8207
  ins_encode(z_form_rt_mem(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8208
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8209
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8210
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8211
instruct MoveI2F_reg_stack(stackSlotF dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8212
  match(Set dst (MoveI2F src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8213
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8214
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8215
  format %{ "ST      $src,$dst\t # MoveI2F" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8216
  opcode(ST_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8217
  ins_encode(z_form_rt_mem(src, dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8218
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8219
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8220
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8221
instruct MoveD2L_reg_stack(stackSlotL dst, regD src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8222
  match(Set dst (MoveD2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8223
  effect(DEF dst, USE src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8224
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8225
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8226
  format %{ "STD     $src,$dst\t # MoveD2L" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8227
  opcode(STD_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8228
  ins_encode(z_form_rt_mem(src,dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8229
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8230
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8231
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8232
instruct MoveL2D_reg_stack(stackSlotD dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8233
  match(Set dst (MoveL2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8234
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8235
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8236
  format %{ "STG     $src,$dst\t # MoveL2D" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8237
  opcode(STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8238
  ins_encode(z_form_rt_mem(src,dst));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8239
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8240
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8241
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8242
instruct convL2F_reg(regF dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8243
  match(Set dst (ConvL2F src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8244
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8245
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8246
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8247
  format %{ "CEGBR   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8248
  opcode(CEGBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8249
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8250
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8251
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8252
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8253
instruct convL2D_reg(regD dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8254
  match(Set dst (ConvL2D src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8255
  // CC remains unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8256
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8257
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8258
  format %{ "CDGBR   $dst,$src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8259
  opcode(CDGBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8260
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8261
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8262
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8263
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8264
instruct convL2I_reg(iRegI dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8265
  match(Set dst (ConvL2I src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8266
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8267
  format %{ "LR      $dst,$src\t # long->int (if needed)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8268
  ins_encode %{ __ lr_if_needed($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8269
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8270
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8271
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8272
// Register Shift Right Immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8273
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
  8274
  match(Set dst (ConvL2I (RShiftL src cnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8275
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8276
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8277
  format %{ "SRAG    $dst,$src,$cnt" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8278
  opcode(SRAG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8279
  ins_encode(z_rsyform_const(dst, src, cnt));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8280
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8281
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8282
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8283
//----------TRAP based zero checks and range checks----------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8284
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8285
// SIGTRAP based implicit range checks in compiled code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8286
// A range check in the ideal world has one of the following shapes:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8287
//   - (If le (CmpU length index)), (IfTrue  throw exception)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8288
//   - (If lt (CmpU index length)), (IfFalse throw exception)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8289
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8290
// Match range check 'If le (CmpU length index)'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8291
instruct rangeCheck_iReg_uimmI16(cmpOpT cmp, iRegI length, uimmI16 index, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8292
  match(If cmp (CmpU length index));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8293
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8294
  predicate(TrapBasedRangeChecks &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8295
            _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::le &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8296
            PROB_UNLIKELY(_leaf->as_If ()->_prob) >= PROB_ALWAYS &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8297
            Matcher::branches_to_uncommon_trap(_leaf));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8298
  ins_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8299
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8300
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8301
  ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8302
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8303
  format %{ "RangeCheck len=$length cmp=$cmp idx=$index => trap $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8304
  ins_encode %{ __ z_clfit($length$$Register, $index$$constant, $cmp$$cmpcode); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8305
  ins_pipe(pipe_class_trap);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8306
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8307
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8308
// Match range check 'If lt (CmpU index length)'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8309
instruct rangeCheck_iReg_iReg(cmpOpT cmp, iRegI index, iRegI length, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8310
  match(If cmp (CmpU index length));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8311
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8312
  predicate(TrapBasedRangeChecks &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8313
            _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8314
            _leaf->as_If ()->_prob >= PROB_ALWAYS &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8315
            Matcher::branches_to_uncommon_trap(_leaf));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8316
  ins_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8317
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8318
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8319
  ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8320
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8321
  format %{ "RangeCheck idx=$index cmp=$cmp len=$length => trap $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8322
  ins_encode %{ __ z_clrt($index$$Register, $length$$Register, $cmp$$cmpcode); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8323
  ins_pipe(pipe_class_trap);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8324
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8325
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8326
// Match range check 'If lt (CmpU index length)'
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8327
instruct rangeCheck_uimmI16_iReg(cmpOpT cmp, iRegI index, uimmI16 length, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8328
  match(If cmp (CmpU index length));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8329
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8330
  predicate(TrapBasedRangeChecks &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8331
            _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::lt &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8332
            _leaf->as_If ()->_prob >= PROB_ALWAYS &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8333
            Matcher::branches_to_uncommon_trap(_leaf));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8334
  ins_cost(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8335
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8336
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8337
  ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8338
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8339
  format %{ "RangeCheck idx=$index cmp=$cmp len= $length => trap $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8340
  ins_encode %{ __ z_clfit($index$$Register, $length$$constant, $cmp$$cmpcode); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8341
  ins_pipe(pipe_class_trap);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8342
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8343
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8344
// Implicit zero checks (more implicit null checks).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8345
instruct zeroCheckP_iReg_imm0(cmpOpT cmp, iRegP_N2P value, immP0 zero, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8346
  match(If cmp (CmpP value zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8347
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8348
  predicate(TrapBasedNullChecks &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8349
            _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8350
            _leaf->as_If ()->_prob >= PROB_LIKELY_MAG(4) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8351
            Matcher::branches_to_uncommon_trap(_leaf));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8352
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8353
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8354
  ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8355
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8356
  format %{ "ZeroCheckP value=$value cmp=$cmp zero=$zero => trap $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8357
  ins_encode %{ __ z_cgit($value$$Register, 0, $cmp$$cmpcode); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8358
  ins_pipe(pipe_class_trap);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8359
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8360
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8361
// Implicit zero checks (more implicit null checks).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8362
instruct zeroCheckN_iReg_imm0(cmpOpT cmp, iRegN_P2N value, immN0 zero, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8363
  match(If cmp (CmpN value zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8364
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8365
  predicate(TrapBasedNullChecks &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8366
            _kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8367
            _leaf->as_If ()->_prob >= PROB_LIKELY_MAG(4) &&
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8368
            Matcher::branches_to_uncommon_trap(_leaf));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8369
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8370
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8371
  ins_is_TrapBasedCheckNode(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8372
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8373
  format %{ "ZeroCheckN value=$value cmp=$cmp zero=$zero => trap $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8374
  ins_encode %{ __ z_cit($value$$Register, 0, $cmp$$cmpcode); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8375
  ins_pipe(pipe_class_trap);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8376
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8377
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8378
//----------Compare instructions-----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8379
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8380
// INT signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8381
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8382
// Compare Integers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8383
instruct compI_reg_reg(flagsReg cr, iRegI op1, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8384
  match(Set cr (CmpI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8385
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8386
  format %{ "CR      $op1,$op2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8387
  opcode(CR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8388
  ins_encode(z_rrform(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8389
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8390
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8391
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8392
instruct compI_reg_imm(flagsReg cr, iRegI op1, immI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8393
  match(Set cr (CmpI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8394
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8395
  format %{ "CFI     $op1,$op2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8396
  opcode(CFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8397
  ins_encode(z_rilform_signed(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8398
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8399
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8400
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8401
instruct compI_reg_imm16(flagsReg cr, iRegI op1, immI16 op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8402
  match(Set cr (CmpI op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8403
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8404
  format %{ "CHI     $op1,$op2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8405
  opcode(CHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8406
  ins_encode(z_riform_signed(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8407
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8408
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8409
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8410
instruct compI_reg_imm0(flagsReg cr, iRegI op1, immI_0 zero) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8411
  match(Set cr (CmpI op1 zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8412
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8413
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8414
  format %{ "LTR     $op1,$op1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8415
  opcode(LTR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8416
  ins_encode(z_rrform(op1, op1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8417
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8418
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8419
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8420
instruct compI_reg_mem(flagsReg cr, iRegI op1, memory op2)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8421
  match(Set cr (CmpI op1 (LoadI op2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8422
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8423
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8424
  format %{ "C(Y)    $op1, $op2\t # int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8425
  opcode(CY_ZOPC, C_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8426
  ins_encode(z_form_rt_mem_opt(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8427
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8428
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8429
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8430
// INT unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8431
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8432
instruct compU_reg_reg(flagsReg cr, iRegI op1, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8433
  match(Set cr (CmpU op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8434
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8435
  format %{ "CLR     $op1,$op2\t # unsigned" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8436
  opcode(CLR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8437
  ins_encode(z_rrform(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8438
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8439
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8440
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8441
instruct compU_reg_uimm(flagsReg cr, iRegI op1, uimmI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8442
  match(Set cr (CmpU op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8443
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8444
  format %{ "CLFI    $op1,$op2\t # unsigned" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8445
  opcode(CLFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8446
  ins_encode(z_rilform_unsigned(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8447
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8448
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8449
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8450
instruct compU_reg_mem(flagsReg cr, iRegI op1, memory op2)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8451
  match(Set cr (CmpU op1 (LoadI op2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8452
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8453
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8454
  format %{ "CL(Y)   $op1, $op2\t # unsigned" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8455
  opcode(CLY_ZOPC, CL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8456
  ins_encode(z_form_rt_mem_opt(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8457
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8458
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8459
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8460
// LONG signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8461
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8462
instruct compL_reg_reg(flagsReg cr, iRegL op1, iRegL op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8463
  match(Set cr (CmpL op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8464
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8465
  format %{ "CGR     $op1,$op2\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8466
  opcode(CGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8467
  ins_encode(z_rreform(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8468
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8469
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8470
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8471
instruct compL_reg_regI(flagsReg cr, iRegL op1, iRegI op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8472
  match(Set cr (CmpL op1 (ConvI2L op2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8473
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8474
  format %{ "CGFR    $op1,$op2\t # long/int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8475
  opcode(CGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8476
  ins_encode(z_rreform(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8477
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8478
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8479
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8480
instruct compL_reg_imm32(flagsReg cr, iRegL op1, immL32 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8481
  match(Set cr (CmpL op1 con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8482
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8483
  format %{ "CGFI    $op1,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8484
  opcode(CGFI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8485
  ins_encode(z_rilform_signed(op1, con));
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 compL_reg_imm16(flagsReg cr, iRegL op1, immL16 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8490
  match(Set cr (CmpL op1 con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8491
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8492
  format %{ "CGHI    $op1,$con" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8493
  opcode(CGHI_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8494
  ins_encode(z_riform_signed(op1, con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8495
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8496
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8497
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8498
instruct compL_reg_imm0(flagsReg cr, iRegL op1, immL_0 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8499
  match(Set cr (CmpL op1 con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8500
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8501
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8502
  format %{ "LTGR    $op1,$op1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8503
  opcode(LTGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8504
  ins_encode(z_rreform(op1, op1));
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 compL_conv_reg_imm0(flagsReg cr, iRegI op1, immL_0 con) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8509
  match(Set cr (CmpL (ConvI2L op1) con));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8510
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8511
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8512
  format %{ "LTGFR    $op1,$op1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8513
  opcode(LTGFR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8514
  ins_encode(z_rreform(op1, op1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8515
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8516
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8517
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8518
instruct compL_reg_mem(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8519
  match(Set cr (CmpL dst (LoadL src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8520
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8521
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8522
  format %{ "CG      $dst, $src\t # long" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8523
  opcode(CG_ZOPC, CG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8524
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8525
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8526
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8527
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8528
instruct compL_reg_memI(iRegL dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8529
  match(Set cr (CmpL dst (ConvI2L (LoadI src))));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8530
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8531
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8532
  format %{ "CGF     $dst, $src\t # long/int" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8533
  opcode(CGF_ZOPC, CGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8534
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8535
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8536
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8537
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8538
//  LONG unsigned
45966
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8539
// Added CmpUL for LoopPredicate.
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8540
instruct compUL_reg_reg(flagsReg cr, iRegL op1, iRegL op2) %{
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8541
  match(Set cr (CmpUL op1 op2));
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8542
  size(4);
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8543
  format %{ "CLGR    $op1,$op2\t # long" %}
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8544
  opcode(CLGR_ZOPC);
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8545
  ins_encode(z_rreform(op1, op2));
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8546
  ins_pipe(pipe_class_dummy);
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8547
%}
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8548
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8549
instruct compUL_reg_imm32(flagsReg cr, iRegL op1, uimmL32 con) %{
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8550
  match(Set cr (CmpUL op1 con));
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8551
  size(6);
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8552
  format %{ "CLGFI   $op1,$con" %}
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8553
  opcode(CLGFI_ZOPC);
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8554
  ins_encode(z_rilform_unsigned(op1, con));
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8555
  ins_pipe(pipe_class_dummy);
b2019823b5bd 8181420: PPC: Image conversion improvements
mdoerr
parents: 43420
diff changeset
  8556
%}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8557
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8558
//  PTR unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8559
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8560
instruct compP_reg_reg(flagsReg cr, iRegP_N2P op1, iRegP_N2P op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8561
  match(Set cr (CmpP op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8562
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8563
  format %{ "CLGR    $op1,$op2\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8564
  opcode(CLGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8565
  ins_encode(z_rreform(op1, op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8566
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8567
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8568
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8569
instruct compP_reg_imm0(flagsReg cr, iRegP_N2P op1, immP0 op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8570
  match(Set cr (CmpP op1 op2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8571
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8572
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8573
  format %{ "LTGR    $op1, $op1\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8574
  opcode(LTGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8575
  ins_encode(z_rreform(op1, op1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8576
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8577
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8578
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8579
// Don't use LTGFR which performs sign extend.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8580
instruct compP_decode_reg_imm0(flagsReg cr, iRegN op1, immP0 op2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8581
  match(Set cr (CmpP (DecodeN op1) op2));
54780
f8d182aedc92 8223136: Move compressed oops functions to CompressedOops class
stefank
parents: 54542
diff changeset
  8582
  predicate(CompressedOops::base() == NULL && CompressedOops::shift() == 0);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8583
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8584
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8585
  format %{ "LTR    $op1, $op1\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8586
  opcode(LTR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8587
  ins_encode(z_rrform(op1, op1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8588
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8589
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8590
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8591
instruct compP_reg_mem(iRegP dst, memory src, flagsReg cr)%{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8592
  match(Set cr (CmpP dst (LoadP src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8593
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8594
  size(Z_DISP3_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8595
  format %{ "CLG     $dst, $src\t # ptr" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8596
  opcode(CLG_ZOPC, CLG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8597
  ins_encode(z_form_rt_mem_opt(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8598
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8599
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8600
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8601
//----------Max and Min--------------------------------------------------------
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 z196_minI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8605
  match(Set dst (MinI 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_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8608
  ins_cost(3 * DEFAULT_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 %{ "MinI $dst $src1,$src2\t MinI (z196 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
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8616
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8617
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8618
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8619
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8620
    } else if (Rdst == Rsrc1) {   // Rdst preset with src1.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8621
      __ z_cr(Rsrc1, Rsrc2);      // Move src2 only if src1 is NotLow.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8622
      __ z_locr(Rdst, Rsrc2, Assembler::bcondNotLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8623
    } else if (Rdst == Rsrc2) {   // Rdst preset with src2.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8624
      __ z_cr(Rsrc2, Rsrc1);      // Move src1 only if src2 is NotLow.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8625
      __ z_locr(Rdst, Rsrc1, Assembler::bcondNotLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8626
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8627
      // Rdst is disjoint from operands, move in either case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8628
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8629
      __ z_locr(Rdst, Rsrc2, Assembler::bcondNotLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8630
      __ z_locr(Rdst, Rsrc1, Assembler::bcondLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8631
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8632
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8633
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8634
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8635
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8636
// Min Register with Register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8637
instruct z10_minI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8638
  match(Set dst (MinI 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(2 * 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 %{ "MinI $dst $src1,$src2\t MinI (z10 only)" %}
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_crj(Rsrc1, Rsrc2, Assembler::bcondLow, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8656
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8657
    } else if (Rdst == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8658
      __ z_crj(Rsrc2, Rsrc1, Assembler::bcondLow, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8659
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8660
    } else {
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
      __ z_crj(Rsrc1, Rsrc2, Assembler::bcondLow, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8663
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8664
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8665
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8666
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8667
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8668
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8669
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8670
instruct minI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8671
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8672
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8673
  predicate(!VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8674
  ins_cost(3 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8675
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8676
  format %{ "MinI $dst $src1,$src2\t MinI" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8677
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8678
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8679
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8680
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8681
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8682
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8683
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8684
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8685
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8686
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8687
    } else if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8688
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8689
      __ z_brl(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8690
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8691
    } else if (Rdst == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8692
      __ z_cr(Rsrc2, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8693
      __ z_brl(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8694
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8695
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8696
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8697
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8698
      __ z_brl(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8699
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8700
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8701
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8702
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8703
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8704
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8705
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8706
instruct z196_minI_reg_imm32(iRegI dst, iRegI src1, immI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8707
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8708
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8709
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8710
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8711
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8712
  format %{ "MinI $dst $src1,$src2\t MinI const32 (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8713
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8714
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8715
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8716
    int      Isrc2 = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8717
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8718
    if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8719
      __ load_const_optimized(Z_R0_scratch, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8720
      __ z_cfi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8721
      __ z_locr(Rdst, Z_R0_scratch, Assembler::bcondNotLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8722
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8723
      __ load_const_optimized(Rdst, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8724
      __ z_cfi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8725
      __ z_locr(Rdst, Rsrc1, Assembler::bcondLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8726
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8727
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8728
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8729
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8730
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8731
instruct minI_reg_imm32(iRegI dst, iRegI src1, immI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8732
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8733
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8734
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8735
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8736
  format %{ "MinI $dst $src1,$src2\t MinI const32" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8737
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8738
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8739
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8740
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8741
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8742
    __ z_cfi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8743
    __ z_brl(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8744
    __ z_lgfi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8745
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8746
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8747
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8748
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8749
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8750
instruct z196_minI_reg_imm16(iRegI dst, iRegI src1, immI16 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8751
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8752
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8753
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8754
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8755
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8756
  format %{ "MinI $dst $src1,$src2\t MinI const16 (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8757
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8758
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8759
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8760
    int      Isrc2 = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8761
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8762
    if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8763
      __ load_const_optimized(Z_R0_scratch, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8764
      __ z_chi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8765
      __ z_locr(Rdst, Z_R0_scratch, Assembler::bcondNotLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8766
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8767
      __ load_const_optimized(Rdst, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8768
      __ z_chi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8769
      __ z_locr(Rdst, Rsrc1, Assembler::bcondLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8770
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8771
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8772
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8773
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8774
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8775
instruct minI_reg_imm16(iRegI dst, iRegI src1, immI16 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8776
  match(Set dst (MinI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8777
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8778
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8779
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8780
  format %{ "MinI $dst $src1,$src2\t MinI const16" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8781
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8782
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8783
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8784
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8785
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8786
    __ z_chi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8787
    __ z_brl(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8788
    __ z_lghi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8789
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8790
  %}
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 z10_minI_reg_imm8(iRegI dst, iRegI src1, immI8 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8795
  match(Set dst (MinI src1 src2));
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
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8798
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8799
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8800
  format %{ "MinI $dst $src1,$src2\t MinI const8 (z10 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8801
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8802
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8803
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8804
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8805
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8806
    __ z_cij($src1$$Register, $src2$$constant, Assembler::bcondLow, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8807
    __ z_lghi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8808
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8809
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8810
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8811
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8812
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8813
// Max Register with Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8814
instruct z196_maxI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8815
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8816
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8817
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8818
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8819
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8820
  format %{ "MaxI $dst $src1,$src2\t MaxI (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8821
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8822
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8823
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8824
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8825
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8826
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8827
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8828
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8829
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8830
    } else if (Rdst == Rsrc1) { // Rdst preset with src1.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8831
      __ z_cr(Rsrc1, Rsrc2);    // Move src2 only if src1 is NotHigh.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8832
      __ z_locr(Rdst, Rsrc2, Assembler::bcondNotHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8833
    } else if (Rdst == Rsrc2) { // Rdst preset with src2.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8834
      __ z_cr(Rsrc2, Rsrc1);    // Move src1 only if src2 is NotHigh.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8835
      __ z_locr(Rdst, Rsrc1, Assembler::bcondNotHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8836
    } else {                    // Rdst is disjoint from operands, move in either case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8837
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8838
      __ z_locr(Rdst, Rsrc2, Assembler::bcondNotHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8839
      __ z_locr(Rdst, Rsrc1, Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8840
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8841
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8842
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8843
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8844
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8845
// Max Register with Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8846
instruct z10_maxI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8847
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8848
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8849
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8850
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8851
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8852
  format %{ "MaxI $dst $src1,$src2\t MaxI (z10 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8853
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8854
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8855
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8856
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8857
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8858
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8859
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8860
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8861
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8862
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8863
    } else if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8864
      __ z_crj(Rsrc1, Rsrc2, Assembler::bcondHigh, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8865
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8866
    } else if (Rdst == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8867
      __ z_crj(Rsrc2, Rsrc1, Assembler::bcondHigh, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8868
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8869
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8870
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8871
      __ z_crj(Rsrc1, Rsrc2, Assembler::bcondHigh, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8872
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8873
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8874
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8875
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8876
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8877
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8878
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8879
instruct maxI_reg_reg(iRegI dst, iRegI src1, iRegI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8880
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8881
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8882
  predicate(!VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8883
  ins_cost(3 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8884
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8885
  format %{ "MaxI $dst $src1,$src2\t MaxI" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8886
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8887
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8888
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8889
    Register Rsrc2 = $src2$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8890
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8891
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8892
    if (Rsrc1 == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8893
      if (Rdst != Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8894
        __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8895
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8896
    } else if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8897
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8898
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8899
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8900
    } else if (Rdst == Rsrc2) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8901
      __ z_cr(Rsrc2, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8902
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8903
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8904
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8905
      __ z_lgfr(Rdst, Rsrc1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8906
      __ z_cr(Rsrc1, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8907
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8908
      __ z_lgfr(Rdst, Rsrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8909
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8910
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8911
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8912
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8913
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8914
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8915
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8916
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8917
instruct z196_maxI_reg_imm32(iRegI dst, iRegI src1, immI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8918
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8919
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8920
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8921
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8922
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8923
  format %{ "MaxI $dst $src1,$src2\t MaxI const32 (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8924
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8925
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8926
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8927
    int      Isrc2 = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8928
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8929
    if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8930
      __ load_const_optimized(Z_R0_scratch, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8931
      __ z_cfi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8932
      __ z_locr(Rdst, Z_R0_scratch, Assembler::bcondNotHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8933
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8934
      __ load_const_optimized(Rdst, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8935
      __ z_cfi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8936
      __ z_locr(Rdst, Rsrc1, Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8937
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8938
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8939
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8940
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8941
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8942
instruct maxI_reg_imm32(iRegI dst, iRegI src1, immI src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8943
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8944
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8945
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8946
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8947
  format %{ "MaxI $dst $src1,$src2\t MaxI const32" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8948
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8949
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8950
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8951
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8952
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8953
    __ z_cfi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8954
    __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8955
    __ z_lgfi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8956
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8957
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8958
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8959
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8960
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8961
instruct z196_maxI_reg_imm16(iRegI dst, iRegI src1, immI16 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8962
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8963
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8964
  predicate(VM_Version::has_LoadStoreConditional());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8965
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8966
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8967
  format %{ "MaxI $dst $src1,$src2\t MaxI const16 (z196 only)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8968
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8969
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8970
    Register Rsrc1 = $src1$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8971
    int      Isrc2 = $src2$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8972
    if (Rdst == Rsrc1) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8973
      __ load_const_optimized(Z_R0_scratch, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8974
      __ z_chi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8975
      __ z_locr(Rdst, Z_R0_scratch, Assembler::bcondNotHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8976
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8977
      __ load_const_optimized(Rdst, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8978
      __ z_chi(Rsrc1, Isrc2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8979
      __ z_locr(Rdst, Rsrc1, Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8980
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8981
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8982
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8983
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8984
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8985
instruct maxI_reg_imm16(iRegI dst, iRegI src1, immI16 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8986
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8987
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8988
  ins_cost(2 * DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8989
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8990
  format %{ "MaxI $dst $src1,$src2\t MaxI const16" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8991
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8992
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8993
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8994
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8995
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8996
    __ z_chi($src1$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8997
    __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8998
    __ z_lghi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  8999
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9000
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9001
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9002
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9003
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9004
instruct z10_maxI_reg_imm8(iRegI dst, iRegI src1, immI8 src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9005
  match(Set dst (MaxI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9006
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9007
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9008
  ins_cost(DEFAULT_COST + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9009
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9010
  format %{ "MaxI $dst $src1,$src2\t MaxI const8" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9011
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9012
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9013
    if ($dst$$Register != $src1$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9014
      __ z_lgfr($dst$$Register, $src1$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9015
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9016
    __ z_cij($src1$$Register, $src2$$constant, Assembler::bcondHigh, done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9017
    __ z_lghi($dst$$Register, $src2$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9018
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9019
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9020
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9021
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9022
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9023
//----------Abs---------------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9024
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9025
instruct absI_reg(iRegI dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9026
  match(Set dst (AbsI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9027
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9028
  ins_cost(DEFAULT_COST_LOW);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9029
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9030
  format %{ "LPR     $dst, $src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9031
  opcode(LPR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9032
  ins_encode(z_rrform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9033
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9034
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9035
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9036
instruct negabsI_reg(iRegI dst, iRegI src, immI_0 zero, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9037
  match(Set dst (SubI zero (AbsI src)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9038
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9039
  ins_cost(DEFAULT_COST_LOW);
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 %{ "LNR     $dst, $src" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9042
  opcode(LNR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9043
  ins_encode(z_rrform(dst, src));
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
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9046
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9047
//----------Float Compares----------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9048
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9049
// Compare floating, generate condition code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9050
instruct cmpF_cc(flagsReg cr, regF src1, regF src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9051
  match(Set cr (CmpF src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9052
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9053
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9054
  format %{ "FCMPcc   $src1,$src2\t # float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9055
  ins_encode %{ __ z_cebr($src1$$FloatRegister, $src2$$FloatRegister); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9056
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9057
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9058
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9059
instruct cmpD_cc(flagsReg cr, regD src1, regD src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9060
  match(Set cr (CmpD src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9061
  ins_cost(ALU_REG_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9062
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9063
  format %{ "FCMPcc   $src1,$src2 \t # double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9064
  ins_encode %{ __ z_cdbr($src1$$FloatRegister, $src2$$FloatRegister); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9065
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9066
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9067
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9068
instruct cmpF_cc_mem(flagsReg cr, regF src1, memoryRX src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9069
  match(Set cr (CmpF src1 (LoadF src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9070
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9071
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9072
  format %{ "FCMPcc_mem $src1,$src2\t # floatMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9073
  opcode(CEB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9074
  ins_encode(z_form_rt_memFP(src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9075
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9076
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9077
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9078
instruct cmpD_cc_mem(flagsReg cr, regD src1, memoryRX src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9079
  match(Set cr (CmpD src1 (LoadD src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9080
  ins_cost(ALU_MEMORY_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9081
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9082
  format %{ "DCMPcc_mem $src1,$src2\t # doubleMemory" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9083
  opcode(CDB_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9084
  ins_encode(z_form_rt_memFP(src1, src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9085
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9086
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9087
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9088
// Compare floating, generate condition code
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9089
instruct cmpF0_cc(flagsReg cr, regF src1, immFpm0 src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9090
  match(Set cr (CmpF src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9091
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9092
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9093
  format %{ "LTEBR    $src1,$src1\t # float" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9094
  opcode(LTEBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9095
  ins_encode(z_rreform(src1, src1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9096
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9097
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9098
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9099
instruct cmpD0_cc(flagsReg cr, regD src1, immDpm0 src2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9100
  match(Set cr (CmpD src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9101
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9102
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9103
  format %{ "LTDBR    $src1,$src1 \t # double" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9104
  opcode(LTDBR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9105
  ins_encode(z_rreform(src1, src1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9106
  ins_pipe(pipe_class_dummy);
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
// Compare floating, generate -1,0,1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9110
instruct cmpF_reg(iRegI dst, regF src1, regF src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9111
  match(Set dst (CmpF3 src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9112
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9113
  ins_cost(DEFAULT_COST * 5 + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9114
  size(24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9115
  format %{ "CmpF3    $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9116
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9117
    // compare registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9118
    __ z_cebr($src1$$FloatRegister, $src2$$FloatRegister);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9119
    // Convert condition code into -1,0,1, where
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9120
    // -1 means unordered or less
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9121
    //  0 means equal
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9122
    //  1 means greater.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9123
    if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9124
      Register one       = Z_R0_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9125
      Register minus_one = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9126
      __ z_lghi(minus_one, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9127
      __ z_lghi(one, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9128
      __ z_lghi( $dst$$Register, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9129
      __ z_locgr($dst$$Register, one,       Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9130
      __ z_locgr($dst$$Register, minus_one, Assembler::bcondLowOrNotOrdered);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9131
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9132
      Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9133
      __ clear_reg($dst$$Register, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9134
      __ z_bre(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9135
      __ z_lhi($dst$$Register, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9136
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9137
      __ z_lhi($dst$$Register, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9138
      __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9139
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9140
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9141
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9142
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9143
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9144
instruct cmpD_reg(iRegI dst, regD src1, regD src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9145
  match(Set dst (CmpD3 src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9146
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9147
  ins_cost(DEFAULT_COST * 5 + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9148
  size(24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9149
  format %{ "CmpD3    $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9150
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9151
    // compare registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9152
    __ z_cdbr($src1$$FloatRegister, $src2$$FloatRegister);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9153
    // Convert condition code into -1,0,1, where
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9154
    // -1 means unordered or less
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9155
    //  0 means equal
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9156
    //  1 means greater.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9157
    if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9158
      Register one       = Z_R0_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9159
      Register minus_one = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9160
      __ z_lghi(minus_one, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9161
      __ z_lghi(one, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9162
      __ z_lghi( $dst$$Register, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9163
      __ z_locgr($dst$$Register, one,       Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9164
      __ z_locgr($dst$$Register, minus_one, Assembler::bcondLowOrNotOrdered);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9165
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9166
      Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9167
      // indicate unused result
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9168
      (void) __ clear_reg($dst$$Register, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9169
      __ z_bre(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9170
      __ z_lhi($dst$$Register, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9171
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9172
      __ z_lhi($dst$$Register, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9173
      __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9174
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9175
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9176
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9177
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9178
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9179
//----------Branches---------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9180
// Jump
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9181
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9182
// Direct Branch.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9183
instruct branch(label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9184
  match(Goto);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9185
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9186
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9187
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9188
  format %{ "BRU     $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9189
  ins_encode(z_enc_bru(labl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9190
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9191
  // If set to 1 this indicates that the current instruction is a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9192
  // short variant of a long branch. This avoids using this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9193
  // instruction in first-pass matching. It will then only be used in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9194
  // the `Shorten_branches' pass.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9195
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9196
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9197
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9198
// Direct Branch.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9199
instruct branchFar(label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9200
  match(Goto);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9201
  effect(USE labl);
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
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9204
  format %{ "BRUL   $labl" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9205
  ins_encode(z_enc_brul(labl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9206
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9207
  // This is not a short variant of a branch, but the long variant.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9208
  ins_short_branch(0);
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
// Conditional Near Branch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9212
instruct branchCon(cmpOp cmp, flagsReg cr, label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9213
  // Same match rule as `branchConFar'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9214
  match(If cmp cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9215
  effect(USE lbl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9216
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9217
  size(4);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  9218
  format %{ "branch_con_short,$cmp   $lbl" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9219
  ins_encode(z_enc_branch_con_short(cmp, lbl));
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
  // If set to 1 this indicates that the current instruction is a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9222
  // short variant of a long branch. This avoids using this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9223
  // instruction in first-pass matching. It will then only be used in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9224
  // the `Shorten_branches' pass.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9225
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9226
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9227
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9228
// This is for cases when the z/Architecture conditional branch instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9229
// does not reach far enough. So we emit a far branch here, which is
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9230
// more expensive.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9231
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9232
// Conditional Far Branch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9233
instruct branchConFar(cmpOp cmp, flagsReg cr, label lbl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9234
  // Same match rule as `branchCon'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9235
  match(If cmp cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9236
  effect(USE cr, USE lbl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9237
  // Make more expensive to prefer compare_and_branch over separate instructions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9238
  ins_cost(2 * BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9239
  size(6);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  9240
  format %{ "branch_con_far,$cmp   $lbl" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9241
  ins_encode(z_enc_branch_con_far(cmp, lbl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9242
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9243
  // This is not a short variant of a branch, but the long variant..
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9244
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9245
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9246
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9247
instruct branchLoopEnd(cmpOp cmp, flagsReg cr, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9248
  match(CountedLoopEnd cmp cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9249
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9250
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9251
  size(4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9252
  format %{ "branch_con_short,$cmp   $labl\t # counted loop end" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9253
  ins_encode(z_enc_branch_con_short(cmp, labl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9254
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9255
  // If set to 1 this indicates that the current instruction is a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9256
  // short variant of a long branch. This avoids using this
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9257
  // instruction in first-pass matching. It will then only be used in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9258
  // the `Shorten_branches' pass.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9259
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9260
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9261
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9262
instruct branchLoopEndFar(cmpOp cmp, flagsReg cr, label labl) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9263
  match(CountedLoopEnd cmp cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9264
  effect(USE labl);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9265
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9266
  size(6);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9267
  format %{ "branch_con_far,$cmp   $labl\t # counted loop end" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9268
  ins_encode(z_enc_branch_con_far(cmp, labl));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9269
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9270
  // This is not a short variant of a branch, but the long variant.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9271
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9272
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9273
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9274
//----------Compare and Branch (short distance)------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9275
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9276
// INT REG operands for loop counter processing.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9277
instruct testAndBranchLoopEnd_Reg(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9278
  match(CountedLoopEnd boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9279
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9280
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9281
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9282
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9283
  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
  9284
  opcode(CRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9285
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9286
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9287
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9288
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9289
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9290
// INT REG operands.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9291
instruct cmpb_RegI(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9292
  match(If boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9293
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9294
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9295
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9296
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9297
  format %{ "CRJ,$boolnode  $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9298
  opcode(CRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9299
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9300
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9301
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9302
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9303
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9304
// Unsigned INT REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9305
instruct cmpbU_RegI(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9306
  match(If boolnode (CmpU src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9307
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9308
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9309
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9310
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9311
  format %{ "CLRJ,$boolnode  $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9312
  opcode(CLRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9313
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9314
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9315
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9316
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9317
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9318
// LONG REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9319
instruct cmpb_RegL(cmpOpT boolnode, iRegL src1, iRegL src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9320
  match(If boolnode (CmpL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9321
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9322
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9323
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9324
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9325
  format %{ "CGRJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9326
  opcode(CGRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9327
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9328
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9329
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9330
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9331
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9332
//  PTR REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9333
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9334
// Separate rules for regular and narrow oops.  ADLC can't recognize
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9335
// rules with polymorphic operands to be sisters -> shorten_branches
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9336
// will not shorten.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9337
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9338
instruct cmpb_RegPP(cmpOpT boolnode, iRegP src1, iRegP src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9339
  match(If boolnode (CmpP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9340
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9341
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9342
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9343
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9344
  format %{ "CLGRJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9345
  opcode(CLGRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9346
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9347
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9348
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9349
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9350
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9351
instruct cmpb_RegNN(cmpOpT boolnode, iRegN src1, iRegN src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9352
  match(If boolnode (CmpP (DecodeN src1) (DecodeN src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9353
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9354
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9355
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9356
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9357
  format %{ "CLGRJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9358
  opcode(CLGRJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9359
  ins_encode(z_enc_cmpb_regreg(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9360
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9361
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9362
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9363
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9364
// INT REG/IMM operands for loop counter processing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9365
instruct testAndBranchLoopEnd_Imm(cmpOpT boolnode, iRegI src1, immI8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9366
  match(CountedLoopEnd boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9367
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9368
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9369
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9370
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9371
  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
  9372
  opcode(CIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9373
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9374
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9375
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9376
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9377
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9378
// INT REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9379
instruct cmpb_RegI_imm(cmpOpT boolnode, iRegI src1, immI8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9380
  match(If boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9381
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9382
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9383
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9384
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9385
  format %{ "CIJ,$boolnode  $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9386
  opcode(CIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9387
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9388
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9389
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9390
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9391
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9392
// INT REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9393
instruct cmpbU_RegI_imm(cmpOpT boolnode, iRegI src1, uimmI8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9394
  match(If boolnode (CmpU src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9395
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9396
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9397
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9398
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9399
  format %{ "CLIJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9400
  opcode(CLIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9401
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9402
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9403
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9404
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9405
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9406
// LONG REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9407
instruct cmpb_RegL_imm(cmpOpT boolnode, iRegL src1, immL8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9408
  match(If boolnode (CmpL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9409
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9410
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9411
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9412
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9413
  format %{ "CGIJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9414
  opcode(CGIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9415
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9416
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9417
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9418
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9419
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9420
// PTR REG-imm operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9421
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9422
// Separate rules for regular and narrow oops. ADLC can't recognize
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9423
// rules with polymorphic operands to be sisters -> shorten_branches
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9424
// will not shorten.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9425
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9426
instruct cmpb_RegP_immP(cmpOpT boolnode, iRegP src1, immP8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9427
  match(If boolnode (CmpP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9428
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9429
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9430
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9431
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9432
  format %{ "CLGIJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9433
  opcode(CLGIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9434
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9435
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9436
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9437
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9438
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9439
// Compare against zero only, do not mix N and P oops (encode/decode required).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9440
instruct cmpb_RegN_immP0(cmpOpT boolnode, iRegN src1, immP0 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9441
  match(If boolnode (CmpP (DecodeN src1) src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9442
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9443
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9444
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9445
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9446
  format %{ "CLGIJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9447
  opcode(CLGIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9448
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9449
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9450
  ins_short_branch(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9451
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9452
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9453
instruct cmpb_RegN_imm(cmpOpT boolnode, iRegN src1, immN8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9454
  match(If boolnode (CmpP (DecodeN src1) (DecodeN src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9455
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9456
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9457
  ins_cost(BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9458
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9459
  format %{ "CLGIJ,$boolnode $src1,$src2,$labl\t # SHORT" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9460
  opcode(CLGIJ_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9461
  ins_encode(z_enc_cmpb_regimm(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9462
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9463
  ins_short_branch(1);
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
//----------Compare and Branch (far distance)------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9468
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9469
// INT REG operands for loop counter processing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9470
instruct testAndBranchLoopEnd_RegFar(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9471
  match(CountedLoopEnd boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9472
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9473
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9474
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9475
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9476
  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
  9477
  opcode(CR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9478
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9479
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9480
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9481
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9482
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9483
// INT REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9484
instruct cmpb_RegI_Far(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9485
  match(If boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9486
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9487
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9488
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9489
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9490
  format %{ "CRJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9491
  opcode(CR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9492
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9493
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9494
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9495
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9496
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9497
// INT REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9498
instruct cmpbU_RegI_Far(cmpOpT boolnode, iRegI src1, iRegI src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9499
  match(If boolnode (CmpU src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9500
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9501
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9502
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9503
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9504
  format %{ "CLRJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9505
  opcode(CLR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9506
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9507
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9508
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9509
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9510
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9511
// LONG REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9512
instruct cmpb_RegL_Far(cmpOpT boolnode, iRegL src1, iRegL src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9513
  match(If boolnode (CmpL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9514
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9515
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9516
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9517
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9518
  format %{ "CGRJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9519
  opcode(CGR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9520
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9521
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9522
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9523
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9524
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9525
// PTR REG operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9526
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9527
// Separate rules for regular and narrow oops. ADLC can't recognize
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9528
// rules with polymorphic operands to be sisters -> shorten_branches
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9529
// will not shorten.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9530
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9531
instruct cmpb_RegPP_Far(cmpOpT boolnode, iRegP src1, iRegP src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9532
  match(If boolnode (CmpP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9533
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9534
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9535
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9536
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9537
  format %{ "CLGRJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9538
  opcode(CLGR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9539
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9540
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9541
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9542
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9543
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9544
instruct cmpb_RegNN_Far(cmpOpT boolnode, iRegN src1, iRegN src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9545
  match(If boolnode (CmpP (DecodeN src1) (DecodeN src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9546
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9547
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9548
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9549
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9550
  format %{ "CLGRJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9551
  opcode(CLGR_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9552
  ins_encode(z_enc_cmpb_regregFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9553
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9554
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9555
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9556
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9557
// INT REG/IMM operands for loop counter processing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9558
instruct testAndBranchLoopEnd_ImmFar(cmpOpT boolnode, iRegI src1, immI8 src2, label labl, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9559
  match(CountedLoopEnd boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9560
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9561
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9562
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9563
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9564
  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
  9565
  opcode(CHI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9566
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9567
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9568
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9569
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9570
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9571
// INT REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9572
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
  9573
  match(If boolnode (CmpI src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9574
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9575
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9576
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9577
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9578
  format %{ "CIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9579
  opcode(CHI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9580
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9581
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9582
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9583
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9584
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9585
// INT REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9586
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
  9587
  match(If boolnode (CmpU src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9588
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9589
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9590
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9591
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9592
  format %{ "CLIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9593
  opcode(CLFI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9594
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9595
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9596
  ins_short_branch(0);
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
// LONG REG/IMM operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9600
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
  9601
  match(If boolnode (CmpL src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9602
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9603
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9604
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9605
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9606
  format %{ "CGIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9607
  opcode(CGHI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9608
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9609
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9610
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9611
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9612
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9613
// PTR REG-imm operands
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9614
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9615
// Separate rules for regular and narrow oops. ADLC can't recognize
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9616
// rules with polymorphic operands to be sisters -> shorten_branches
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9617
// will not shorten.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9618
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9619
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
  9620
  match(If boolnode (CmpP src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9621
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9622
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9623
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9624
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9625
  format %{ "CLGIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9626
  opcode(CLGFI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9627
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9628
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9629
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9630
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9631
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9632
// Compare against zero only, do not mix N and P oops (encode/decode required).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9633
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
  9634
  match(If boolnode (CmpP (DecodeN src1) src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9635
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9636
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9637
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9638
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9639
  format %{ "CLGIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9640
  opcode(CLGFI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9641
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9642
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9643
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9644
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9645
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9646
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
  9647
  match(If boolnode (CmpP (DecodeN src1) (DecodeN src2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9648
  effect(USE labl, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9649
  predicate(VM_Version::has_CompareBranch());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9650
  ins_cost(BRANCH_COST+DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9651
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9652
  format %{ "CLGIJ,$boolnode   $src1,$src2,$labl\t # FAR(substituted)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9653
  opcode(CLGFI_ZOPC, BRCL_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9654
  ins_encode(z_enc_cmpb_regimmFar(src1, src2, labl, boolnode));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9655
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9656
  ins_short_branch(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9657
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9658
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9659
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9660
// Long Compare
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9661
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9662
// Due to a shortcoming in the ADLC, it mixes up expressions like:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9663
// (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
  9664
// difference between 'Y' and '0L'. The tree-matches for the CmpI sections
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9665
// are collapsed internally in the ADLC's dfa-gen code. The match for
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9666
// (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
  9667
// 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
  9668
// reg-reg and reg-zero forms of long-compare. This is unfortunate because
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9669
// both forms beat the trinary form of long-compare and both are very useful
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9670
// on platforms which have few registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9671
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9672
// Manifest a CmpL3 result in an integer register. Very painful.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9673
// This is the test to avoid.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9674
instruct cmpL3_reg_reg(iRegI dst, iRegL src1, iRegL src2, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9675
  match(Set dst (CmpL3 src1 src2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9676
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9677
  ins_cost(DEFAULT_COST * 5 + BRANCH_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9678
  size(24);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9679
  format %{ "CmpL3 $dst,$src1,$src2" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9680
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9681
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9682
    // compare registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9683
    __ z_cgr($src1$$Register, $src2$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9684
    // Convert condition code into -1,0,1, where
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9685
    // -1 means less
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9686
    //  0 means equal
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9687
    //  1 means greater.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9688
    if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9689
      Register one       = Z_R0_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9690
      Register minus_one = Z_R1_scratch;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9691
      __ z_lghi(minus_one, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9692
      __ z_lghi(one, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9693
      __ z_lghi( $dst$$Register, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9694
      __ z_locgr($dst$$Register, one,       Assembler::bcondHigh);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9695
      __ z_locgr($dst$$Register, minus_one, Assembler::bcondLow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9696
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9697
      __ clear_reg($dst$$Register, true, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9698
      __ z_bre(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9699
      __ z_lhi($dst$$Register, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9700
      __ z_brh(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9701
      __ z_lhi($dst$$Register, -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9702
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9703
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9704
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9705
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9706
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9707
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9708
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9709
// Safepoint Instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9710
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9711
instruct safePoint() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9712
  match(SafePoint);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9713
  predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9714
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9715
  format %{ "UNIMPLEMENTED Safepoint_ " %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9716
  ins_encode(enc_unimplemented());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9717
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9718
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9719
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9720
instruct safePoint_poll(iRegP poll, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9721
  match(SafePoint poll);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9722
  effect(USE poll, KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9723
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9724
  format %{ "TM      #0[,$poll],#111\t # Safepoint: poll for GC" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9725
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9726
    // Mark the code position where the load from the safepoint
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9727
    // polling page was emitted as relocInfo::poll_type.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9728
    __ relocate(relocInfo::poll_type);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9729
    __ load_from_polling_page($poll$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9730
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9731
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9732
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9733
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9734
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9735
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9736
// Call Instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9737
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9738
// Call Java Static Instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9739
instruct CallStaticJavaDirect_dynTOC(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9740
  match(CallStaticJava);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9741
  effect(USE meth);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9742
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9743
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9744
  format %{ "CALL,static dynTOC $meth; ==> " %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9745
  ins_encode( z_enc_java_static_call(meth) );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9746
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9747
  ins_alignment(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9748
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9749
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9750
// Call Java Dynamic Instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9751
instruct CallDynamicJavaDirect_dynTOC(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9752
  match(CallDynamicJava);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9753
  effect(USE meth);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9754
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9755
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9756
  format %{ "CALL,dynamic dynTOC $meth; ==> " %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9757
  ins_encode(z_enc_java_dynamic_call(meth));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9758
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9759
  ins_alignment(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9760
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9761
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9762
// Call Runtime Instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9763
instruct CallRuntimeDirect(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9764
  match(CallRuntime);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9765
  effect(USE meth);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9766
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9767
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9768
  ins_num_consts(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9769
  ins_alignment(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9770
  format %{ "CALL,runtime" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9771
  ins_encode( z_enc_java_to_runtime_call(meth) );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9772
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9773
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9774
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9775
// Call runtime without safepoint - same as CallRuntime
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9776
instruct CallLeafDirect(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9777
  match(CallLeaf);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9778
  effect(USE meth);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9779
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9780
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9781
  ins_num_consts(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9782
  ins_alignment(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9783
  format %{ "CALL,runtime leaf $meth" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9784
  ins_encode( z_enc_java_to_runtime_call(meth) );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9785
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9786
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9787
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9788
// Call runtime without safepoint - same as CallLeaf
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9789
instruct CallLeafNoFPDirect(method meth) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9790
  match(CallLeafNoFP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9791
  effect(USE meth);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9792
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9793
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9794
  ins_num_consts(1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9795
  format %{ "CALL,runtime leaf nofp $meth" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9796
  ins_encode( z_enc_java_to_runtime_call(meth) );
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9797
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9798
  ins_alignment(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9799
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9800
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9801
// Tail Call; Jump from runtime stub to Java code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9802
// Also known as an 'interprocedural jump'.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9803
// Target of jump will eventually return to caller.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9804
// TailJump below removes the return address.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9805
instruct TailCalljmpInd(iRegP jump_target, inline_cache_regP method_oop) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9806
  match(TailCall jump_target method_oop);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9807
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9808
  size(2);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
  9809
  format %{ "Jmp     $jump_target\t # $method_oop holds method oop" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9810
  ins_encode %{ __ z_br($jump_target$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9811
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9812
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9813
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9814
// Return Instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9815
instruct Ret() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9816
  match(Return);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9817
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9818
  format %{ "BR(Z_R14) // branch to link register" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9819
  ins_encode %{ __ z_br(Z_R14); %}
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
// Tail Jump; remove the return address; jump to target.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9824
// TailCall above leaves the return address around.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9825
// TailJump is used in only one place, the rethrow_Java stub (fancy_jump=2).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9826
// 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
  9827
// "restore" before this instruction (in Epilogue), we need to materialize it
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9828
// in %i0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9829
instruct tailjmpInd(iRegP jump_target, rarg1RegP ex_oop) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9830
  match(TailJump jump_target ex_oop);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9831
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9832
  size(8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9833
  format %{ "TailJump $jump_target" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9834
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9835
    __ z_lg(Z_ARG2/* issuing pc */, _z_abi(return_pc), Z_SP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9836
    __ z_br($jump_target$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9837
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9838
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9839
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9840
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9841
// Create exception oop: created by stack-crawling runtime code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9842
// Created exception is now available to this handler, and is setup
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9843
// just prior to jumping to this handler. No code emitted.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9844
instruct CreateException(rarg1RegP ex_oop) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9845
  match(Set ex_oop (CreateEx));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9846
  ins_cost(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9847
  size(0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9848
  format %{ "# exception oop; no code emitted" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9849
  ins_encode(/*empty*/);
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
// Rethrow exception: The exception oop will come in the first
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9854
// argument position. Then JUMP (not call) to the rethrow stub code.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9855
instruct RethrowException() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9856
  match(Rethrow);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9857
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9858
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9859
  format %{ "Jmp    rethrow_stub" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9860
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9861
    cbuf.set_insts_mark();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9862
    __ load_const_optimized(Z_R1_scratch, (address)OptoRuntime::rethrow_stub());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9863
    __ z_br(Z_R1_scratch);
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
// Die now.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9869
instruct ShouldNotReachHere() %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9870
  match(Halt);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9871
  ins_cost(CALL_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9872
  size(2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9873
  format %{ "ILLTRAP; ShouldNotReachHere" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9874
  ins_encode %{ __ z_illtrap(); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9875
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9876
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9877
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9878
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9879
// The 2nd slow-half of a subtype check. Scan the subklass's 2ndary superklass
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9880
// array for an instance of the superklass. Set a hidden internal cache on a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9881
// hit (cache is checked with exposed code in gen_subtype_check()). Return
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9882
// 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
  9883
instruct partialSubtypeCheck(rarg1RegP index, rarg2RegP sub, rarg3RegP super, flagsReg pcc,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9884
                             rarg4RegP scratch1, rarg5RegP scratch2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9885
  match(Set index (PartialSubtypeCheck sub super));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9886
  effect(KILL pcc, KILL scratch1, KILL scratch2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9887
  ins_cost(10 * DEFAULT_COST);
51009
44b07bd68f6d 8206459: [s390] Prevent restoring incorrect bcp and locals in interpreter and avoid incorrect size of partialSubtypeCheckNode in C2
mdoerr
parents: 50162
diff changeset
  9888
  // TODO: s390 port size(FIXED_SIZE);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9889
  format %{ "  CALL   PartialSubtypeCheck\n" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9890
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9891
    AddressLiteral stub_address(StubRoutines::zarch::partial_subtype_check());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9892
    __ load_const_optimized(Z_ARG4, stub_address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9893
    __ z_basr(Z_R14, Z_ARG4);
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
instruct partialSubtypeCheck_vs_zero(flagsReg pcc, rarg2RegP sub, rarg3RegP super, immP0 zero,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9899
                                     rarg1RegP index, rarg4RegP scratch1, rarg5RegP scratch2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9900
  match(Set pcc (CmpI (PartialSubtypeCheck sub super) zero));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9901
  effect(KILL scratch1, KILL scratch2, KILL index);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9902
  ins_cost(10 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9903
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9904
  format %{ "CALL   PartialSubtypeCheck_vs_zero\n" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9905
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9906
    AddressLiteral stub_address(StubRoutines::zarch::partial_subtype_check());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9907
    __ load_const_optimized(Z_ARG4, stub_address);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9908
    __ z_basr(Z_R14, Z_ARG4);
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
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9914
// inlined locking and unlocking
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9915
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9916
instruct cmpFastLock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9917
  match(Set pcc (FastLock oop box));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9918
  effect(TEMP tmp1, TEMP tmp2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9919
  ins_cost(100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9920
  // TODO: s390 port size(VARIABLE_SIZE); // Uses load_const_optimized.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9921
  format %{ "FASTLOCK  $oop, $box; KILL Z_ARG4, Z_ARG5" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9922
  ins_encode %{ __ compiler_fast_lock_object($oop$$Register, $box$$Register, $tmp1$$Register, $tmp2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9923
                                             UseBiasedLocking && !UseOptoBiasInlining); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9924
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9925
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9926
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9927
instruct cmpFastUnlock(flagsReg pcc, iRegP_N2P oop, iRegP_N2P box, iRegP tmp1, iRegP tmp2) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9928
  match(Set pcc (FastUnlock oop box));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9929
  effect(TEMP tmp1, TEMP tmp2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9930
  ins_cost(100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9931
  // TODO: s390 port size(FIXED_SIZE);  // emitted code depends on UseBiasedLocking being on/off.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9932
  format %{ "FASTUNLOCK  $oop, $box; KILL Z_ARG4, Z_ARG5" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9933
  ins_encode %{ __ compiler_fast_unlock_object($oop$$Register, $box$$Register, $tmp1$$Register, $tmp2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9934
                                               UseBiasedLocking && !UseOptoBiasInlining); %}
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 inlineCallClearArrayConst(SSlenDW cnt, iRegP_N2P base, Universe dummy, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9939
  match(Set dummy (ClearArray cnt base));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9940
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9941
  ins_cost(100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9942
  // TODO: s390 port size(VARIABLE_SIZE);       // Variable in size due to varying #instructions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9943
  format %{ "ClearArrayConst $cnt,$base" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9944
  ins_encode %{ __ Clear_Array_Const($cnt$$constant, $base$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9945
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9946
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9947
54542
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  9948
instruct inlineCallClearArrayConstBig(immL cnt, iRegP_N2P base, Universe dummy, allRoddRegL tmpL, flagsReg cr) %{
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9949
  match(Set dummy (ClearArray cnt base));
54542
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  9950
  effect(TEMP tmpL, KILL cr); // R0, R1 are killed, too.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9951
  ins_cost(200);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9952
  // TODO: s390 port size(VARIABLE_SIZE);       // Variable in size due to optimized constant loader.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9953
  format %{ "ClearArrayConstBig $cnt,$base" %}
54542
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  9954
  ins_encode %{ __ Clear_Array_Const_Big($cnt$$constant, $base$$Register, $tmpL$$Register); %}
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  9955
  ins_pipe(pipe_class_dummy);
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  9956
%}
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  9957
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  9958
instruct inlineCallClearArray(iRegL cnt, iRegP_N2P base, Universe dummy, allRoddRegL tmpL, flagsReg cr) %{
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9959
  match(Set dummy (ClearArray cnt base));
54542
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  9960
  effect(TEMP tmpL, KILL cr); // R0, R1 are killed, too.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9961
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9962
  // 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
  9963
  format %{ "ClearArrayVar $cnt,$base" %}
54542
0a4214c90a55 8222271: [s390] optimize register usage in C2 instruction forms for clearing arrays
rrich
parents: 52412
diff changeset
  9964
  ins_encode %{ __ Clear_Array($cnt$$Register, $base$$Register, $tmpL$$Register); %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9965
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9966
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9967
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9968
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9969
// CompactStrings
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9970
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9971
// String equals
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9972
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
  9973
  match(Set result (StrEquals (Binary str1 str2) cnt));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9974
  effect(TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9975
  predicate(((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9976
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9977
  format %{ "String Equals byte[] $str1,$str2,$cnt -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9978
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9979
    __ array_equals(false, $str1$$Register, $str2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9980
                    $cnt$$Register, $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9981
                    $result$$Register, true /* byte */);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9982
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9983
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9984
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9985
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9986
instruct 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
  9987
  match(Set result (StrEquals (Binary str1 str2) cnt));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9988
  effect(TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9989
  predicate(((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::UU || ((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9990
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9991
  format %{ "String Equals char[] $str1,$str2,$cnt -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9992
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9993
    __ array_equals(false, $str1$$Register, $str2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9994
                    $cnt$$Register, $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9995
                    $result$$Register, false /* byte */);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9996
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9997
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9998
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  9999
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10000
instruct string_equals_imm(iRegP str1, iRegP str2, uimmI8 cnt, iRegI result, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10001
  match(Set result (StrEquals (Binary str1 str2) cnt));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10002
  effect(KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10003
  predicate(((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::LL || ((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::UU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10004
  ins_cost(100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10005
  format %{ "String Equals byte[] $str1,$str2,$cnt -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10006
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10007
    const int cnt_imm = $cnt$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10008
    if (cnt_imm) { __ z_clc(0, cnt_imm - 1, $str1$$Register, 0, $str2$$Register); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10009
    __ z_lhi($result$$Register, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10010
    if (cnt_imm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10011
      if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10012
        __ z_lhi(Z_R0_scratch, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10013
        __ z_locr($result$$Register, Z_R0_scratch, Assembler::bcondNotEqual);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10014
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10015
        Label Lskip;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10016
        __ z_bre(Lskip);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10017
        __ clear_reg($result$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10018
        __ bind(Lskip);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10019
      }
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
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10023
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10024
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10025
instruct string_equalsC_imm(iRegP str1, iRegP str2, immI8 cnt, iRegI result, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10026
  match(Set result (StrEquals (Binary str1 str2) cnt));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10027
  effect(KILL cr); // R0 is killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10028
  predicate(((StrEqualsNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10029
  ins_cost(100);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10030
  format %{ "String Equals $str1,$str2,$cnt -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10031
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10032
    const int cnt_imm = $cnt$$constant; // positive immI8 (7 bits used)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10033
    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
 10034
    __ z_lhi($result$$Register, 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10035
    if (cnt_imm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10036
      if (VM_Version::has_LoadStoreConditional()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10037
        __ z_lhi(Z_R0_scratch, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10038
        __ z_locr($result$$Register, Z_R0_scratch, Assembler::bcondNotEqual);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10039
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10040
        Label Lskip;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10041
        __ z_bre(Lskip);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10042
        __ clear_reg($result$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10043
        __ bind(Lskip);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10044
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10045
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10046
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10047
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10048
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10049
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10050
// Array equals
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10051
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
 10052
  match(Set result (AryEq ary1 ary2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10053
  effect(TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10054
  predicate(((AryEqNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10055
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10056
  format %{ "Array Equals $ary1,$ary2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10057
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10058
    __ array_equals(true, $ary1$$Register, $ary2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10059
                    noreg, $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10060
                    $result$$Register, true /* byte */);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10061
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10062
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10063
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10064
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10065
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
 10066
  match(Set result (AryEq ary1 ary2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10067
  effect(TEMP oddReg, TEMP evenReg, KILL cr); // R0, R1 are killed, too.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10068
  predicate(((AryEqNode*)n)->encoding() == StrIntrinsicNode::UU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10069
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10070
  format %{ "Array Equals $ary1,$ary2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10071
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10072
    __ array_equals(true, $ary1$$Register, $ary2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10073
                    noreg, $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10074
                    $result$$Register, false /* byte */);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10075
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10076
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10077
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10078
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10079
// String CompareTo
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10080
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
 10081
  match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10082
  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
 10083
  predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10084
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10085
  format %{ "String Compare byte[] $str1,$cnt1,$str2,$cnt2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10086
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10087
    __ string_compare($str1$$Register, $str2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10088
                      $cnt1$$Register, $cnt2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10089
                      $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10090
                      $result$$Register, StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10091
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10092
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10093
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10094
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10095
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
 10096
  match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10097
  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
 10098
  predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::UU || ((StrCompNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10099
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10100
  format %{ "String Compare char[] $str1,$cnt1,$str2,$cnt2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10101
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10102
    __ string_compare($str1$$Register, $str2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10103
                      $cnt1$$Register, $cnt2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10104
                      $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10105
                      $result$$Register, StrIntrinsicNode::UU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10106
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10107
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10108
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10109
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10110
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
 10111
  match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10112
  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
 10113
  predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::LU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10114
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10115
  format %{ "String Compare byte[],char[] $str1,$cnt1,$str2,$cnt2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10116
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10117
    __ string_compare($str1$$Register, $str2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10118
                      $cnt1$$Register, $cnt2$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10119
                      $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10120
                      $result$$Register, StrIntrinsicNode::LU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10121
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10122
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10123
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10124
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10125
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
 10126
  match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10127
  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
 10128
  predicate(((StrCompNode*)n)->encoding() == StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10129
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10130
  format %{ "String Compare char[],byte[] $str1,$cnt1,$str2,$cnt2 -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10131
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10132
    __ string_compare($str2$$Register, $str1$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10133
                      $cnt2$$Register, $cnt1$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10134
                      $oddReg$$Register, $evenReg$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10135
                      $result$$Register, StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10136
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10137
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10138
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10139
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10140
// String IndexOfChar
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10141
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
 10142
  match(Set result (StrIndexOfChar (Binary haystack haycnt) ch));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10143
  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
 10144
  ins_cost(200);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10145
  format %{ "String IndexOfChar [0..$haycnt]($haystack), $ch -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10146
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10147
    __ string_indexof_char($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10148
                           $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10149
                           $ch$$Register, 0 /* unused, ch is in register */,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10150
                           $oddReg$$Register, $evenReg$$Register, false /*is_byte*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10151
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10152
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10153
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10154
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10155
instruct indexOf_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
 10156
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10157
  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
 10158
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU || ((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10159
  ins_cost(200);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10160
  format %{ "String IndexOf UL [0..$haycnt]($haystack), [0]($needle) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10161
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10162
    immPOper *needleOper = (immPOper *)$needle;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10163
    const TypeOopPtr *t = needleOper->type()->isa_oopptr();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10164
    ciTypeArray* needle_values = t->const_oop()->as_type_array();  // Pointer to live char *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10165
    jchar chr;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10166
#ifdef VM_LITTLE_ENDIAN
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10167
    Unimplemented();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10168
#else
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10169
    chr = (((jchar)(unsigned char)needle_values->element_value(0).as_byte()) << 8) |
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10170
           ((jchar)(unsigned char)needle_values->element_value(1).as_byte());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10171
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10172
    __ string_indexof_char($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10173
                           $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10174
                           noreg, chr,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10175
                           $oddReg$$Register, $evenReg$$Register, false /*is_byte*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10176
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10177
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10178
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10179
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10180
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
 10181
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10182
  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
 10183
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10184
  ins_cost(200);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10185
  format %{ "String IndexOf L [0..$haycnt]($haystack), [0]($needle) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10186
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10187
    immPOper *needleOper = (immPOper *)$needle;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10188
    const TypeOopPtr *t = needleOper->type()->isa_oopptr();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10189
    ciTypeArray* needle_values = t->const_oop()->as_type_array();  // Pointer to live char *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10190
    jchar chr = (jchar)needle_values->element_value(0).as_byte();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10191
    __ string_indexof_char($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10192
                           $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10193
                           noreg, chr,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10194
                           $oddReg$$Register, $evenReg$$Register, true /*is_byte*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10195
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10196
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10197
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10198
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10199
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
 10200
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10201
  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
 10202
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10203
  ins_cost(200);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10204
  format %{ "String IndexOf UL [0..$haycnt]($haystack), [0]($needle) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10205
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10206
    immPOper *needleOper = (immPOper *)$needle;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10207
    const TypeOopPtr *t = needleOper->type()->isa_oopptr();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10208
    ciTypeArray* needle_values = t->const_oop()->as_type_array();  // Pointer to live char *
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10209
    jchar chr = (jchar)needle_values->element_value(0).as_byte();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10210
    __ string_indexof_char($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10211
                           $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10212
                           noreg, chr,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10213
                           $oddReg$$Register, $evenReg$$Register, false /*is_byte*/);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10214
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10215
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10216
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10217
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10218
// String IndexOf
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10219
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
 10220
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecntImm)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10221
  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
 10222
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU || ((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10223
  ins_cost(250);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10224
  format %{ "String IndexOf U [0..$needlecntImm]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10225
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10226
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10227
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10228
                      $needle$$Register, noreg, $needlecntImm$$constant,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10229
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::UU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10230
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10231
  ins_pipe(pipe_class_dummy);
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
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
 10235
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecntImm)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10236
  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
 10237
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10238
  ins_cost(250);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10239
  format %{ "String IndexOf L [0..$needlecntImm]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10240
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10241
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10242
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10243
                      $needle$$Register, noreg, $needlecntImm$$constant,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10244
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10245
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10246
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10247
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10248
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10249
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
 10250
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecntImm)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10251
  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
 10252
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10253
  ins_cost(250);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10254
  format %{ "String IndexOf UL [0..$needlecntImm]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10255
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10256
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10257
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10258
                      $needle$$Register, noreg, $needlecntImm$$constant,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10259
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10260
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10261
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10262
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10263
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10264
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
 10265
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10266
  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
 10267
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU || ((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::none);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10268
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10269
  format %{ "String IndexOf U [0..$needlecnt]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10270
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10271
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10272
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10273
                      $needle$$Register, $needlecnt$$Register, 0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10274
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::UU);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10275
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10276
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10277
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10278
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10279
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
 10280
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10281
  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
 10282
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10283
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10284
  format %{ "String IndexOf L [0..$needlecnt]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10285
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10286
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10287
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10288
                      $needle$$Register, $needlecnt$$Register, 0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10289
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::LL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10290
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10291
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10292
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10293
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10294
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
 10295
  match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10296
  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
 10297
  predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10298
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10299
  format %{ "String IndexOf UL [0..$needlecnt]($needle) .in. [0..$haycnt]($haystack) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10300
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10301
    __ string_indexof($result$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10302
                      $haystack$$Register, $haycnt$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10303
                      $needle$$Register, $needlecnt$$Register, 0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10304
                      $oddReg$$Register, $evenReg$$Register, StrIntrinsicNode::UL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10305
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10306
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10307
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10308
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10309
// char[] to byte[] compression
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10310
instruct string_compress(iRegP src, iRegP dst, iRegI result, iRegI len, iRegI tmp, flagsReg cr) %{
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10311
  match(Set result (StrCompressedCopy src (Binary dst len)));
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10312
  effect(TEMP_DEF result, TEMP tmp, KILL cr); // R0, R1 are killed, too.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10313
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10314
  format %{ "String Compress $src->$dst($len) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10315
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10316
    __ string_compress($result$$Register, $src$$Register, $dst$$Register, $len$$Register,
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10317
                       $tmp$$Register, false);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10318
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10319
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10320
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10321
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10322
// 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
 10323
//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
 10324
//  match(Set dummy (StrInflatedCopy src (Binary dst len)));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10325
//  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
 10326
//  predicate(VM_Version::has_ETF2Enhancements());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10327
//  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10328
//  format %{ "String Inflate (trot) $dst,$src($len)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10329
//  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10330
//    __ string_inflate_trot($src$$Register, $dst$$Register, $len$$Register, $tmp$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10331
//  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10332
//  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10333
//%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10334
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10335
// byte[] to char[] inflation
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10336
instruct string_inflate(Universe dummy, iRegP src, iRegP dst, iRegI len, iRegI tmp, flagsReg cr) %{
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10337
  match(Set dummy (StrInflatedCopy src (Binary dst len)));
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10338
  effect(TEMP tmp, KILL cr); // R0, R1 are killed, too.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10339
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10340
  format %{ "String Inflate $src->$dst($len)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10341
  ins_encode %{
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10342
    __ string_inflate($src$$Register, $dst$$Register, $len$$Register, $tmp$$Register);
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10343
  %}
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10344
  ins_pipe(pipe_class_dummy);
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10345
%}
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10346
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10347
// byte[] to char[] inflation
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10348
instruct string_inflate_const(Universe dummy, iRegP src, iRegP dst, iRegI tmp, immI len, flagsReg cr) %{
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10349
  match(Set dummy (StrInflatedCopy src (Binary dst len)));
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10350
  effect(TEMP tmp, KILL cr); // R0, R1 are killed, too.
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10351
  ins_cost(300);
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10352
  format %{ "String Inflate (constLen) $src->$dst($len)" %}
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10353
  ins_encode %{
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10354
    __ string_inflate_const($src$$Register, $dst$$Register, $tmp$$Register, $len$$constant);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10355
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10356
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10357
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10358
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10359
// StringCoding.java intrinsics
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10360
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
 10361
  match(Set result (HasNegatives ary1 len));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10362
  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
 10363
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10364
  format %{ "has negatives byte[] $ary1($len) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10365
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10366
    __ has_negatives($result$$Register, $ary1$$Register, $len$$Register,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10367
                     $oddReg$$Register, $evenReg$$Register, $tmp$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10368
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10369
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10370
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10371
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10372
// encode char[] to byte[] in ISO_8859_1
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10373
instruct encode_iso_array(iRegP src, iRegP dst, iRegI result, iRegI len, iRegI tmp, flagsReg cr) %{
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10374
  match(Set result (EncodeISOArray src (Binary dst len)));
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10375
  effect(TEMP_DEF result, TEMP tmp, KILL cr); // R0, R1 are killed, too.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10376
  ins_cost(300);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10377
  format %{ "Encode array $src->$dst($len) -> $result" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10378
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10379
    __ string_compress($result$$Register, $src$$Register, $dst$$Register, $len$$Register,
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47606
diff changeset
 10380
                       $tmp$$Register, true);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10381
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10382
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10383
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10384
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10385
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10386
//----------PEEPHOLE RULES-----------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10387
// These must follow all instruction definitions as they use the names
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10388
// defined in the instructions definitions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10389
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10390
// peepmatch (root_instr_name [preceeding_instruction]*);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10391
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10392
// peepconstraint %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10393
// (instruction_number.operand_name relational_op instruction_number.operand_name
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10394
//  [, ...]);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10395
// // instruction numbers are zero-based using left to right order in peepmatch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10396
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10397
// peepreplace (instr_name([instruction_number.operand_name]*));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10398
// // provide an instruction_number.operand_name for each operand that appears
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10399
// // in the replacement instruction's match rule
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10400
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10401
// ---------VM FLAGS---------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10402
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10403
// All peephole optimizations can be turned off using -XX:-OptoPeephole
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10404
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10405
// Each peephole rule is given an identifying number starting with zero and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10406
// increasing by one in the order seen by the parser. An individual peephole
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10407
// can be enabled, and all others disabled, by using -XX:OptoPeepholeAt=#
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10408
// on the command-line.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10409
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10410
// ---------CURRENT LIMITATIONS----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10411
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10412
// Only match adjacent instructions in same basic block
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10413
// Only equality constraints
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10414
// Only constraints between operands, not (0.dest_reg == EAX_enc)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10415
// Only one replacement instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10416
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10417
// ---------EXAMPLE----------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10418
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10419
// // pertinent parts of existing instructions in architecture description
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10420
// instruct movI(eRegI dst, eRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10421
//   match(Set dst (CopyI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10422
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10423
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10424
// instruct incI_eReg(eRegI dst, immI1 src, eFlagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10425
//   match(Set dst (AddI dst src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10426
//   effect(KILL cr);
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
// // Change (inc mov) to lea
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10430
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10431
//   // increment preceeded by register-register move
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10432
//   peepmatch (incI_eReg movI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10433
//   // require that the destination register of the increment
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10434
//   // match the destination register of the move
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10435
//   peepconstraint (0.dst == 1.dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10436
//   // construct a replacement instruction that sets
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10437
//   // the destination to (move's source register + one)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10438
//   peepreplace (leaI_eReg_immI(0.dst 1.src 0.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10439
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10440
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10441
// Implementation no longer uses movX instructions since
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10442
// machine-independent system no longer uses CopyX nodes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10443
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10444
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10445
//   peepmatch (incI_eReg movI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10446
//   peepconstraint (0.dst == 1.dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10447
//   peepreplace (leaI_eReg_immI(0.dst 1.src 0.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10448
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10449
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10450
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10451
//   peepmatch (decI_eReg movI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10452
//   peepconstraint (0.dst == 1.dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10453
//   peepreplace (leaI_eReg_immI(0.dst 1.src 0.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10454
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10455
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10456
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10457
//   peepmatch (addI_eReg_imm movI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10458
//   peepconstraint (0.dst == 1.dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10459
//   peepreplace (leaI_eReg_immI(0.dst 1.src 0.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10460
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10461
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10462
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10463
//   peepmatch (addP_eReg_imm movP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10464
//   peepconstraint (0.dst == 1.dst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10465
//   peepreplace (leaP_eReg_immI(0.dst 1.src 0.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10466
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10467
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10468
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10469
//  This peephole rule does not work, probably because ADLC can't handle two effects:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10470
//  Effect 1 is defining 0.op1 and effect 2 is setting CC
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10471
// condense a load from memory and subsequent test for zero
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10472
// into a single, more efficient ICM instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10473
// peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10474
//   peepmatch (compI_iReg_imm0 loadI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10475
//   peepconstraint (1.dst == 0.op1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10476
//   peepreplace (loadtest15_iReg_mem(0.op1 0.op1 1.mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10477
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10478
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10479
// // Change load of spilled value to only a spill
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10480
// instruct storeI(memory mem, eRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10481
//   match(Set mem (StoreI mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10482
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10483
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10484
// instruct loadI(eRegI dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10485
//   match(Set dst (LoadI mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10486
// %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10487
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10488
peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10489
  peepmatch (loadI storeI);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10490
  peepconstraint (1.src == 0.dst, 1.mem == 0.mem);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10491
  peepreplace (storeI(1.mem 1.mem 1.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10492
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10493
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10494
peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10495
  peepmatch (loadL storeL);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10496
  peepconstraint (1.src == 0.dst, 1.mem == 0.mem);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10497
  peepreplace (storeL(1.mem 1.mem 1.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10498
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10499
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10500
peephole %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10501
  peepmatch (loadP storeP);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10502
  peepconstraint (1.src == 0.dst, 1.dst == 0.mem);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10503
  peepreplace (storeP(1.dst 1.dst 1.src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10504
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10505
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10506
//----------SUPERWORD RULES---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10507
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10508
//  Expand rules for special cases
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10509
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10510
instruct expand_storeF(stackSlotF mem, regF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10511
  // No match rule, false predicate, for expand only.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10512
  effect(DEF mem, USE src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10513
  predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10514
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10515
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10516
  format %{ "STE      $src,$mem\t # replicate(float2stack)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10517
  opcode(STE_ZOPC, STE_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10518
  ins_encode(z_form_rt_mem(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10519
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10520
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10521
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10522
instruct expand_LoadLogical_I2L(iRegL dst, stackSlotF mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10523
  // No match rule, false predicate, for expand only.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10524
  effect(DEF dst, USE mem);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10525
  predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10526
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10527
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10528
  format %{ "LLGF     $dst,$mem\t # replicate(stack2reg(unsigned))" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10529
  opcode(LLGF_ZOPC, LLGF_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10530
  ins_encode(z_form_rt_mem(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10531
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10532
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10533
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10534
// Replicate scalar int to packed int values (8 Bytes)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10535
instruct expand_Repl2I_reg(iRegL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10536
  // Dummy match rule, false predicate, for expand only.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10537
  match(Set dst (ConvI2L src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10538
  predicate(false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10539
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10540
  // TODO: s390 port size(FIXED_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10541
  format %{ "REPLIC2F $dst,$src\t # replicate(pack2F)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10542
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10543
    if ($dst$$Register == $src$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10544
      __ z_sllg(Z_R0_scratch, $src$$Register, 64-32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10545
      __ z_ogr($dst$$Register, Z_R0_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10546
    }  else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10547
      __ z_sllg($dst$$Register, $src$$Register, 64-32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10548
      __ z_ogr( $dst$$Register, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10549
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10550
  %}
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
// Replication
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10555
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10556
// Exploit rotate_then_insert, if available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10557
// Replicate scalar byte to packed byte values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10558
instruct Repl8B_reg_risbg(iRegL dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10559
  match(Set dst (ReplicateB src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10560
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10561
  predicate((n->as_Vector()->length() == 8));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10562
  format %{ "REPLIC8B $dst,$src\t # pack8B" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10563
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10564
    if ($dst$$Register != $src$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10565
      __ z_lgr($dst$$Register, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10566
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10567
    __ rotate_then_insert($dst$$Register, $dst$$Register, 48, 55,  8, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10568
    __ rotate_then_insert($dst$$Register, $dst$$Register, 32, 47, 16, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10569
    __ rotate_then_insert($dst$$Register, $dst$$Register,  0, 31, 32, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10570
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10571
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10572
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10573
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10574
// Replicate scalar byte to packed byte values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10575
instruct Repl8B_imm(iRegL dst, immB_n0m1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10576
  match(Set dst (ReplicateB src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10577
  predicate(n->as_Vector()->length() == 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10578
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10579
  format %{ "REPLIC8B $dst,$src\t # pack8B imm" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10580
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10581
    int64_t  Isrc8 = $src$$constant & 0x000000ff;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10582
    int64_t Isrc16 =  Isrc8 <<  8 |  Isrc8;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10583
    int64_t Isrc32 = Isrc16 << 16 | Isrc16;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10584
    assert(Isrc8 != 0x000000ff && Isrc8 != 0, "should be handled by other match rules.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10585
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10586
    __ z_llilf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10587
    __ z_iihf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10588
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10589
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10590
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10591
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10592
// Replicate scalar byte to packed byte values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10593
instruct Repl8B_imm0(iRegL dst, immI_0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10594
  match(Set dst (ReplicateB src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10595
  predicate(n->as_Vector()->length() == 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10596
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10597
  format %{ "REPLIC8B $dst,$src\t # pack8B imm0" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10598
  ins_encode %{ __ z_laz($dst$$Register, 0, Z_R0); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10599
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10600
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10601
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10602
// Replicate scalar byte to packed byte values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10603
instruct Repl8B_immm1(iRegL dst, immB_minus1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10604
  match(Set dst (ReplicateB src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10605
  predicate(n->as_Vector()->length() == 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10606
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10607
  format %{ "REPLIC8B $dst,$src\t # pack8B immm1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10608
  ins_encode %{ __ z_lghi($dst$$Register, -1); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10609
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10610
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10611
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10612
// Exploit rotate_then_insert, if available
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10613
// Replicate scalar short to packed short values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10614
instruct Repl4S_reg_risbg(iRegL dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10615
  match(Set dst (ReplicateS src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10616
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10617
  predicate((n->as_Vector()->length() == 4));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10618
  format %{ "REPLIC4S $dst,$src\t # pack4S" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10619
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10620
    if ($dst$$Register != $src$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10621
      __ z_lgr($dst$$Register, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10622
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10623
    __ rotate_then_insert($dst$$Register, $dst$$Register, 32, 47, 16, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10624
    __ rotate_then_insert($dst$$Register, $dst$$Register,  0, 31, 32, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10625
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10626
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10627
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10628
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10629
// Replicate scalar short to packed short values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10630
instruct Repl4S_imm(iRegL dst, immS_n0m1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10631
  match(Set dst (ReplicateS src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10632
  predicate(n->as_Vector()->length() == 4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10633
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10634
  format %{ "REPLIC4S $dst,$src\t # pack4S imm" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10635
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10636
    int64_t Isrc16 = $src$$constant & 0x0000ffff;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10637
    int64_t Isrc32 = Isrc16 << 16 | Isrc16;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10638
    assert(Isrc16 != 0x0000ffff && Isrc16 != 0, "Repl4S_imm: (src == " INT64_FORMAT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10639
           ") should be handled by other match rules.", $src$$constant);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10640
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10641
    __ z_llilf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10642
    __ z_iihf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10643
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10644
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10645
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10646
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10647
// Replicate scalar short to packed short values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10648
instruct Repl4S_imm0(iRegL dst, immI_0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10649
  match(Set dst (ReplicateS src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10650
  predicate(n->as_Vector()->length() == 4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10651
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10652
  format %{ "REPLIC4S $dst,$src\t # pack4S imm0" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10653
  ins_encode %{ __ z_laz($dst$$Register, 0, Z_R0); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10654
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10655
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10656
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10657
// Replicate scalar short to packed short values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10658
instruct Repl4S_immm1(iRegL dst, immS_minus1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10659
  match(Set dst (ReplicateS src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10660
  predicate(n->as_Vector()->length() == 4);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10661
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10662
  format %{ "REPLIC4S $dst,$src\t # pack4S immm1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10663
  ins_encode %{ __ z_lghi($dst$$Register, -1); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10664
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10665
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10666
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10667
// Exploit rotate_then_insert, if available.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10668
// Replicate scalar int to packed int values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10669
instruct Repl2I_reg_risbg(iRegL dst, iRegI src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10670
  match(Set dst (ReplicateI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10671
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10672
  predicate((n->as_Vector()->length() == 2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10673
  format %{ "REPLIC2I $dst,$src\t # pack2I" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10674
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10675
    if ($dst$$Register != $src$$Register) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10676
      __ z_lgr($dst$$Register, $src$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10677
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10678
    __ rotate_then_insert($dst$$Register, $dst$$Register, 0, 31, 32, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10679
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10680
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10681
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10682
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10683
// Replicate scalar int to packed int values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10684
instruct Repl2I_imm(iRegL dst, immI_n0m1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10685
  match(Set dst (ReplicateI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10686
  predicate(n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10687
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10688
  format %{ "REPLIC2I $dst,$src\t # pack2I imm" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10689
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10690
    int64_t Isrc32 = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10691
    assert(Isrc32 != -1 && Isrc32 != 0, "should be handled by other match rules.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10692
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10693
    __ z_llilf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10694
    __ z_iihf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10695
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10696
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10697
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10698
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10699
// Replicate scalar int to packed int values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10700
instruct Repl2I_imm0(iRegL dst, immI_0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10701
  match(Set dst (ReplicateI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10702
  predicate(n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10703
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10704
  format %{ "REPLIC2I $dst,$src\t # pack2I imm0" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10705
  ins_encode %{ __ z_laz($dst$$Register, 0, Z_R0); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10706
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10707
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10708
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10709
// Replicate scalar int to packed int values (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10710
instruct Repl2I_immm1(iRegL dst, immI_minus1 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10711
  match(Set dst (ReplicateI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10712
  predicate(n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10713
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10714
  format %{ "REPLIC2I $dst,$src\t # pack2I immm1" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10715
  ins_encode %{ __ z_lghi($dst$$Register, -1); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10716
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10717
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10718
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10719
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10720
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10721
instruct Repl2F_reg_indirect(iRegL dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10722
  match(Set dst (ReplicateF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10723
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10724
  predicate(!VM_Version::has_FPSupportEnhancements() && n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10725
  format %{ "REPLIC2F $dst,$src\t # pack2F indirect" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10726
  expand %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10727
    stackSlotF tmp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10728
    iRegL      tmp2;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10729
    expand_storeF(tmp, src);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10730
    expand_LoadLogical_I2L(tmp2, tmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10731
    expand_Repl2I_reg(dst, tmp2);
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
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10735
// Replicate scalar float to packed float values in GREG (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10736
instruct Repl2F_reg_direct(iRegL dst, regF src, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10737
  match(Set dst (ReplicateF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10738
  effect(KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10739
  predicate(VM_Version::has_FPSupportEnhancements() && n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10740
  format %{ "REPLIC2F $dst,$src\t # pack2F direct" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10741
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10742
    assert(VM_Version::has_FPSupportEnhancements(), "encoder should never be called on old H/W");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10743
    __ z_lgdr($dst$$Register, $src$$FloatRegister);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10744
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10745
    __ 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
 10746
    __ z_iilf($dst$$Register, 0);                 // Save a "result not ready" stall.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10747
    __ z_ogr($dst$$Register, Z_R0_scratch);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10748
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10749
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10750
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10751
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10752
// Replicate scalar float immediate to packed float values in GREG (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10753
instruct Repl2F_imm(iRegL dst, immF src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10754
  match(Set dst (ReplicateF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10755
  predicate(n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10756
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10757
  format %{ "REPLIC2F $dst,$src\t # pack2F imm" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10758
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10759
    union {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10760
      int   Isrc32;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10761
      float Fsrc32;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10762
    };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10763
    Fsrc32 = $src$$constant;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10764
    __ z_llilf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10765
    __ z_iihf($dst$$Register, Isrc32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10766
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10767
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10768
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10769
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10770
// Replicate scalar float immediate zeroes to packed float values in GREG (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10771
// Do this only for 'real' zeroes, especially don't loose sign of negative zeroes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10772
instruct Repl2F_imm0(iRegL dst, immFp0 src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10773
  match(Set dst (ReplicateF src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10774
  predicate(n->as_Vector()->length() == 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10775
  ins_should_rematerialize(true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10776
  format %{ "REPLIC2F $dst,$src\t # pack2F imm0" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10777
  ins_encode %{ __ z_laz($dst$$Register, 0, Z_R0); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10778
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10779
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10780
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10781
// Store
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10782
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10783
// Store Aligned Packed Byte register to memory (8 Bytes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10784
instruct storeA8B(memory mem, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10785
  match(Set mem (StoreVector mem src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10786
  predicate(n->as_StoreVector()->memory_size() == 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10787
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10788
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10789
  format %{ "STG     $src,$mem\t # ST(packed8B)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10790
  opcode(STG_ZOPC, STG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10791
  ins_encode(z_form_rt_mem_opt(src, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10792
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10793
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10794
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10795
// Load
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10796
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10797
instruct loadV8(iRegL dst, memory mem) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10798
  match(Set dst (LoadVector mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10799
  predicate(n->as_LoadVector()->memory_size() == 8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10800
  ins_cost(MEMORY_REF_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10801
  // TODO: s390 port size(VARIABLE_SIZE);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10802
  format %{ "LG      $dst,$mem\t # L(packed8B)" %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10803
  opcode(LG_ZOPC, LG_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10804
  ins_encode(z_form_rt_mem_opt(dst, mem));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10805
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10806
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10807
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10808
//----------POPULATION COUNT RULES--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10809
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10810
// Byte reverse
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10811
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10812
instruct bytes_reverse_int(iRegI dst, iRegI src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10813
  match(Set dst (ReverseBytesI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10814
  predicate(UseByteReverseInstruction);  // See Matcher::match_rule_supported
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10815
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10816
  size(4);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10817
  format %{ "LRVR    $dst,$src\t # byte reverse int" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10818
  opcode(LRVR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10819
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10820
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10821
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10822
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10823
instruct bytes_reverse_long(iRegL dst, iRegL src) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10824
  match(Set dst (ReverseBytesL src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10825
  predicate(UseByteReverseInstruction);  // See Matcher::match_rule_supported
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10826
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10827
  // TODO: s390 port size(FIXED_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10828
  format %{ "LRVGR   $dst,$src\t # byte reverse long" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10829
  opcode(LRVGR_ZOPC);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10830
  ins_encode(z_rreform(dst, src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10831
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10832
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10833
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10834
// Leading zeroes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10835
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10836
// The instruction FLOGR (Find Leftmost One in Grande (64bit) Register)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10837
// returns the bit position of the leftmost 1 in the 64bit source register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10838
// As the bits are numbered from left to right (0..63), the returned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10839
// position index is equivalent to the number of leading zeroes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10840
// If no 1-bit is found (i.e. the regsiter contains zero), the instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10841
// returns position 64. That's exactly what we need.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10842
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10843
instruct countLeadingZerosI(revenRegI dst, iRegI src, roddRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10844
  match(Set dst (CountLeadingZerosI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10845
  effect(KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10846
  ins_cost(3 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10847
  size(14);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10848
  format %{ "SLLG    $dst,$src,32\t # no need to always count 32 zeroes first\n\t"
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10849
            "IILH    $dst,0x8000 \t # insert \"stop bit\" to force result 32 for zero src.\n\t"
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10850
            "FLOGR   $dst,$dst"
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10851
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10852
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10853
    // Performance experiments indicate that "FLOGR" is using some kind of
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10854
    // iteration to find the leftmost "1" bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10855
    //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10856
    // The prior implementation zero-extended the 32-bit argument to 64 bit,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10857
    // thus forcing "FLOGR" to count 32 bits of which we know they are zero.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10858
    // We could gain measurable speedup in micro benchmark:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10859
    //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10860
    //               leading   trailing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10861
    //   z10:   int     2.04       1.68
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10862
    //         long     1.00       1.02
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10863
    //   z196:  int     0.99       1.23
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10864
    //         long     1.00       1.11
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10865
    //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10866
    // By shifting the argument into the high-word instead of zero-extending it.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10867
    // The add'l branch on condition (taken for a zero argument, very infrequent,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10868
    // good prediction) is well compensated for by the savings.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10869
    //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10870
    // We leave the previous implementation in for some time in the future when
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10871
    // the "FLOGR" instruction may become less iterative.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10872
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10873
    // Version 2: shows 62%(z9), 204%(z10), -1%(z196) improvement over original
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10874
    __ 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
 10875
    __ 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
 10876
    __ z_flogr($dst$$Register, $dst$$Register);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10877
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10878
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10879
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10880
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10881
instruct countLeadingZerosL(revenRegI dst, iRegL src, roddRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10882
  match(Set dst (CountLeadingZerosL src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10883
  effect(KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10884
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10885
  size(4);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10886
  format %{ "FLOGR   $dst,$src \t # count leading zeros (long)\n\t" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10887
  ins_encode %{ __ z_flogr($dst$$Register, $src$$Register); %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10888
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10889
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10890
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10891
// trailing zeroes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10892
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10893
// We transform the trailing zeroes problem to a leading zeroes problem
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10894
// such that can use the FLOGR instruction to our advantage.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10895
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10896
// With
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10897
//   tmp1 = src - 1
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10898
// we flip all trailing zeroes to ones and the rightmost one to zero.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10899
// All other bits remain unchanged.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10900
// With the complement
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10901
//   tmp2 = ~src
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10902
// we get all ones in the trailing zeroes positions. Thus,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10903
//   tmp3 = tmp1 & tmp2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10904
// yields ones in the trailing zeroes positions and zeroes elsewhere.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10905
// Now we can apply FLOGR and get 64-(trailing zeroes).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10906
instruct countTrailingZerosI(revenRegI dst, iRegI src, roddRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10907
  match(Set dst (CountTrailingZerosI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10908
  effect(TEMP_DEF dst, TEMP tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10909
  ins_cost(8 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10910
  // TODO: s390 port size(FIXED_SIZE);  // Emitted code depends on PreferLAoverADD being on/off.
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10911
  format %{ "LLGFR   $dst,$src  \t # clear upper 32 bits (we are dealing with int)\n\t"
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10912
            "LCGFR   $tmp,$src  \t # load 2's complement (32->64 bit)\n\t"
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10913
            "AGHI    $dst,-1    \t # tmp1 = src-1\n\t"
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10914
            "AGHI    $tmp,-1    \t # tmp2 = -src-1 = ~src\n\t"
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10915
            "NGR     $dst,$tmp  \t # tmp3 = tmp1&tmp2\n\t"
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10916
            "FLOGR   $dst,$dst  \t # count trailing zeros (int)\n\t"
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10917
            "AHI     $dst,-64   \t # tmp4 = 64-(trailing zeroes)-64\n\t"
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10918
            "LCR     $dst,$dst  \t # res = -tmp4"
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10919
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10920
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10921
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10922
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10923
    // Rtmp only needed for for zero-argument shortcut. With kill effect in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10924
    // match rule Rsrc = roddReg would be possible, saving one register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10925
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10926
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10927
    assert_different_registers(Rdst, Rsrc, Rtmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10928
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10929
    // Algorithm:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10930
    // - Isolate the least significant (rightmost) set bit using (src & (-src)).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10931
    //   All other bits in the result are zero.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10932
    // - Find the "leftmost one" bit position in the single-bit result from previous step.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10933
    // - 63-("leftmost one" bit position) gives the # of trailing zeros.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10934
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10935
    // Version 2: shows 79%(z9), 68%(z10), 23%(z196) improvement over original.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10936
    Label done;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10937
    __ load_const_optimized(Rdst, 32); // Prepare for shortcut (zero argument), result will be 32.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10938
    __ z_lcgfr(Rtmp, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10939
    __ z_bre(done);                    // Taken very infrequently, good prediction, no BHT entry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10940
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10941
    __ z_nr(Rtmp, Rsrc);               // (src) & (-src) leaves nothing but least significant bit.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10942
    __ z_ahi(Rtmp,  -1);               // Subtract one to fill all trailing zero positions with ones.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10943
                                       // Use 32bit op to prevent borrow propagation (case Rdst = 0x80000000)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10944
                                       // into upper half of reg. Not relevant with sllg below.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10945
    __ z_sllg(Rdst, Rtmp, 32);         // Shift interesting contents to upper half of register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10946
    __ z_bre(done);                    // Shortcut for argument = 1, result will be 0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10947
                                       // Depends on CC set by ahi above.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10948
                                       // Taken very infrequently, good prediction, no BHT entry.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10949
                                       // Branch delayed to have Rdst set correctly (Rtmp == 0(32bit)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10950
                                       // after SLLG Rdst == 0(64bit)).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10951
    __ z_flogr(Rdst, Rdst);            // Kills tmp which is the oddReg for dst.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10952
    __ add2reg(Rdst,  -32);            // 32-pos(leftmost1) is #trailing zeros
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10953
    __ z_lcgfr(Rdst, Rdst);            // Provide 64bit result at no cost.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10954
    __ bind(done);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10955
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10956
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10957
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10958
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10959
instruct countTrailingZerosL(revenRegI dst, iRegL src, roddRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10960
  match(Set dst (CountTrailingZerosL src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10961
  effect(TEMP_DEF dst, KILL tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10962
  ins_cost(8 * DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10963
  // TODO: s390 port size(FIXED_SIZE);  // Emitted code depends on PreferLAoverADD being on/off.
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10964
  format %{ "LCGR    $dst,$src  \t # preserve src\n\t"
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10965
            "NGR     $dst,$src  \t #\n\t"
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10966
            "AGHI    $dst,-1    \t # tmp1 = src-1\n\t"
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10967
            "FLOGR   $dst,$dst  \t # count trailing zeros (long), kill $tmp\n\t"
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10968
            "AHI     $dst,-64   \t # tmp4 = 64-(trailing zeroes)-64\n\t"
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10969
            "LCR     $dst,$dst  \t #"
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10970
         %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10971
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10972
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10973
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10974
    assert_different_registers(Rdst, Rsrc); // Rtmp == Rsrc allowed.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10975
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10976
    // New version: shows 5%(z9), 2%(z10), 11%(z196) improvement over original.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10977
    __ z_lcgr(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10978
    __ z_ngr(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10979
    __ add2reg(Rdst,   -1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10980
    __ z_flogr(Rdst, Rdst); // Kills tmp which is the oddReg for dst.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10981
    __ add2reg(Rdst,  -64);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10982
    __ z_lcgfr(Rdst, Rdst); // Provide 64bit result at no cost.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10983
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10984
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10985
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10986
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10987
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10988
// bit count
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10989
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10990
instruct popCountI(iRegI dst, iRegI src, iRegI tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10991
  match(Set dst (PopCountI src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10992
  effect(TEMP_DEF dst, TEMP tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10993
  predicate(UsePopCountInstruction && VM_Version::has_PopCount());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10994
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10995
  size(24);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 10996
  format %{ "POPCNT  $dst,$src\t # pop count int" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10997
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10998
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 10999
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11000
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11001
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11002
    // Prefer compile-time assertion over run-time SIGILL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11003
    assert(VM_Version::has_PopCount(), "bad predicate for countLeadingZerosI");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11004
    assert_different_registers(Rdst, Rtmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11005
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11006
    // Version 2: shows 10%(z196) improvement over original.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11007
    __ z_popcnt(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11008
    __ z_srlg(Rtmp, Rdst, 16); // calc  byte4+byte6 and byte5+byte7
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11009
    __ z_alr(Rdst, Rtmp);      //   into byte6 and byte7
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11010
    __ z_srlg(Rtmp, Rdst,  8); // calc (byte4+byte6) + (byte5+byte7)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11011
    __ z_alr(Rdst, Rtmp);      //   into byte7
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11012
    __ z_llgcr(Rdst, Rdst);    // zero-extend sum
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11013
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11014
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11015
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11016
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11017
instruct popCountL(iRegI dst, iRegL src, iRegL tmp, flagsReg cr) %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11018
  match(Set dst (PopCountL src));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11019
  effect(TEMP_DEF dst, TEMP tmp, KILL cr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11020
  predicate(UsePopCountInstruction && VM_Version::has_PopCount());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11021
  ins_cost(DEFAULT_COST);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11022
  // TODO: s390 port size(FIXED_SIZE);
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 54780
diff changeset
 11023
  format %{ "POPCNT  $dst,$src\t # pop count long" %}
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11024
  ins_encode %{
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11025
    Register Rdst = $dst$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11026
    Register Rsrc = $src$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11027
    Register Rtmp = $tmp$$Register;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11028
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11029
    // Prefer compile-time assertion over run-time SIGILL.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11030
    assert(VM_Version::has_PopCount(), "bad predicate for countLeadingZerosI");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11031
    assert_different_registers(Rdst, Rtmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11032
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11033
    // 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
 11034
    __ z_popcnt(Rdst, Rsrc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11035
    __ z_ahhlr(Rdst, Rdst, Rdst);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11036
    __ z_sllg(Rtmp, Rdst, 16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11037
    __ z_algr(Rdst, Rtmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11038
    __ z_sllg(Rtmp, Rdst,  8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11039
    __ z_algr(Rdst, Rtmp);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11040
    __ z_srlg(Rdst, Rdst, 56);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11041
  %}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11042
  ins_pipe(pipe_class_dummy);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11043
%}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11044
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11045
//----------SMARTSPILL RULES---------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11046
// These must follow all instruction definitions as they use the names
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11047
// defined in the instructions definitions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11048
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11049
// ============================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
 11050
// TYPE PROFILING RULES