src/hotspot/cpu/s390/assembler_s390.hpp
author lucy
Tue, 21 May 2019 15:51:35 +0200
changeset 54960 e46fe26d7f77
parent 53244 9807daeb47c4
permissions -rw-r--r--
8213084: Rework and enhance Print[Opto]Assembly output Reviewed-by: kvn, thartmann
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
     1
/*
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 51966
diff changeset
     2
 * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 53244
diff changeset
     3
 * Copyright (c) 2016, 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
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 51966
diff changeset
    26
#ifndef CPU_S390_ASSEMBLER_S390_HPP
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 51966
diff changeset
    27
#define CPU_S390_ASSEMBLER_S390_HPP
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    28
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    29
#undef  LUCY_DBG
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    30
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    31
// Immediate is an abstraction to represent the various immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    32
// operands which exist on z/Architecture. Neither this class nor
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    33
// instances hereof have an own state. It consists of methods only.
49364
601146c66cad 8173070: Remove ValueObj class for allocation subclassing for runtime code
coleenp
parents: 48331
diff changeset
    34
class Immediate {
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    35
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    36
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    37
    static bool is_simm(int64_t x, unsigned int nbits) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    38
      // nbits < 2   --> false
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    39
      // nbits >= 64 --> true
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    40
      assert(2 <= nbits && nbits < 64, "Don't call, use statically known result.");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    41
      const int64_t min      = -(1L << (nbits-1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    42
      const int64_t maxplus1 =  (1L << (nbits-1));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    43
      return min <= x && x < maxplus1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    44
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    45
    static bool is_simm32(int64_t x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    46
      return is_simm(x, 32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    47
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    48
    static bool is_simm20(int64_t x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    49
      return is_simm(x, 20);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    50
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    51
    static bool is_simm16(int64_t x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    52
      return is_simm(x, 16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    53
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    54
    static bool is_simm8(int64_t x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    55
      return is_simm(x,  8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    56
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    57
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    58
    // Test if x is within signed immediate range for nbits.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    59
    static bool is_uimm(int64_t x, unsigned int nbits) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    60
      // nbits == 0  --> false
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    61
      // nbits >= 64 --> true
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    62
      assert(1 <= nbits && nbits < 64, "don't call, use statically known result");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    63
      const uint64_t xu       = (unsigned long)x;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    64
      const uint64_t maxplus1 = 1UL << nbits;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    65
      return xu < maxplus1; // Unsigned comparison. Negative inputs appear to be very large.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    66
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    67
    static bool is_uimm32(int64_t x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    68
      return is_uimm(x, 32);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    69
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    70
    static bool is_uimm16(int64_t x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    71
      return is_uimm(x, 16);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    72
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    73
    static bool is_uimm12(int64_t x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    74
      return is_uimm(x, 12);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    75
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    76
    static bool is_uimm8(int64_t x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    77
      return is_uimm(x,  8);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    78
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    79
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    80
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    81
// Displacement is an abstraction to represent the various
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    82
// displacements which exist with addresses on z/ArchiTecture.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    83
// Neither this class nor instances hereof have an own state. It
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    84
// consists of methods only.
49364
601146c66cad 8173070: Remove ValueObj class for allocation subclassing for runtime code
coleenp
parents: 48331
diff changeset
    85
class Displacement {
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    86
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    87
 public: // These tests are used outside the (Macro)Assembler world, e.g. in ad-file.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    88
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    89
  static bool is_longDisp(int64_t x) {  // Fits in a 20-bit displacement field.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    90
    return Immediate::is_simm20(x);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    91
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    92
  static bool is_shortDisp(int64_t x) { // Fits in a 12-bit displacement field.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    93
    return Immediate::is_uimm12(x);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    94
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    95
  static bool is_validDisp(int64_t x) { // Is a valid displacement, regardless of length constraints.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    96
    return is_longDisp(x);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    97
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    98
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
    99
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   100
// RelAddr is an abstraction to represent relative addresses in the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   101
// form they are used on z/Architecture for instructions which access
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   102
// their operand with pc-relative addresses. Neither this class nor
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   103
// instances hereof have an own state. It consists of methods only.
49364
601146c66cad 8173070: Remove ValueObj class for allocation subclassing for runtime code
coleenp
parents: 48331
diff changeset
   104
class RelAddr {
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   105
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   106
 private: // No public use at all. Solely for (Macro)Assembler.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   107
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   108
  static bool is_in_range_of_RelAddr(address target, address pc, bool shortForm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   109
    // Guard against illegal branch targets, e.g. -1. Occurrences in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   110
    // CompiledStaticCall and ad-file. Do not assert (it's a test
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   111
    // function!). Just return false in case of illegal operands.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   112
    if ((((uint64_t)target) & 0x0001L) != 0) return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   113
    if ((((uint64_t)pc)     & 0x0001L) != 0) return false;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   114
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   115
    if (shortForm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   116
      return Immediate::is_simm((int64_t)(target-pc), 17); // Relative short addresses can reach +/- 2**16 bytes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   117
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   118
      return Immediate::is_simm((int64_t)(target-pc), 33); // Relative long addresses can reach +/- 2**32 bytes.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   119
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   120
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   121
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   122
  static bool is_in_range_of_RelAddr16(address target, address pc) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   123
    return is_in_range_of_RelAddr(target, pc, true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   124
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   125
  static bool is_in_range_of_RelAddr16(ptrdiff_t distance) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   126
    return is_in_range_of_RelAddr((address)distance, 0, true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   127
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   128
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   129
  static bool is_in_range_of_RelAddr32(address target, address pc) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   130
    return is_in_range_of_RelAddr(target, pc, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   131
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   132
  static bool is_in_range_of_RelAddr32(ptrdiff_t distance) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   133
    return is_in_range_of_RelAddr((address)distance, 0, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   134
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   135
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   136
  static int pcrel_off(address target, address pc, bool shortForm) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   137
    assert(((uint64_t)target & 0x0001L) == 0, "target of a relative address must be aligned");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   138
    assert(((uint64_t)pc     & 0x0001L) == 0, "origin of a relative address must be aligned");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   139
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   140
    if ((target == NULL) || (target == pc)) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   141
      return 0;  // Yet unknown branch destination.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   142
    } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   143
      guarantee(is_in_range_of_RelAddr(target, pc, shortForm), "target not within reach");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   144
      return (int)((target - pc)>>1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   145
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   146
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   147
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   148
  static int pcrel_off16(address target, address pc) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   149
    return pcrel_off(target, pc, true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   150
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   151
  static int pcrel_off16(ptrdiff_t distance) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   152
    return pcrel_off((address)distance, 0, true);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   153
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   154
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   155
  static int pcrel_off32(address target, address pc) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   156
    return pcrel_off(target, pc, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   157
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   158
  static int pcrel_off32(ptrdiff_t distance) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   159
    return pcrel_off((address)distance, 0, false);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   160
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   161
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   162
  static ptrdiff_t inv_pcrel_off16(int offset) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   163
    return ((ptrdiff_t)offset)<<1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   164
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   165
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   166
  static ptrdiff_t inv_pcrel_off32(int offset) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   167
    return ((ptrdiff_t)offset)<<1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   168
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   169
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   170
  friend class Assembler;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   171
  friend class MacroAssembler;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   172
  friend class NativeGeneralJump;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   173
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   174
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   175
// Address is an abstraction used to represent a memory location
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   176
// as passed to Z assembler instructions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   177
//
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   178
// Note: A register location is represented via a Register, not
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   179
// via an address for efficiency & simplicity reasons.
49364
601146c66cad 8173070: Remove ValueObj class for allocation subclassing for runtime code
coleenp
parents: 48331
diff changeset
   180
class Address {
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   181
 private:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   182
  Register _base;    // Base register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   183
  Register _index;   // Index register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   184
  intptr_t _disp;    // Constant displacement.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   185
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   186
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   187
  Address() :
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   188
    _base(noreg),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   189
    _index(noreg),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   190
    _disp(0) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   191
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   192
  Address(Register base, Register index, intptr_t disp = 0) :
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   193
    _base(base),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   194
    _index(index),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   195
    _disp(disp) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   197
  Address(Register base, intptr_t disp = 0) :
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   198
    _base(base),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   199
    _index(noreg),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   200
    _disp(disp) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   201
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   202
  Address(Register base, RegisterOrConstant roc, intptr_t disp = 0) :
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   203
    _base(base),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   204
    _index(noreg),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   205
    _disp(disp) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   206
    if (roc.is_constant()) _disp += roc.as_constant(); else _index = roc.as_register();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   207
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   208
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   209
#ifdef ASSERT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   210
  // ByteSize is only a class when ASSERT is defined, otherwise it's an int.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   211
  Address(Register base, ByteSize disp) :
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   212
    _base(base),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   213
    _index(noreg),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   214
    _disp(in_bytes(disp)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   215
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   216
  Address(Register base, Register index, ByteSize disp) :
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   217
    _base(base),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   218
    _index(index),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   219
    _disp(in_bytes(disp)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   220
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   221
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   222
  // Aborts if disp is a register and base and index are set already.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   223
  Address plus_disp(RegisterOrConstant disp) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   224
    Address a = (*this);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   225
    a._disp += disp.constant_or_zero();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   226
    if (disp.is_register()) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   227
      if (a._index == noreg) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   228
        a._index = disp.as_register();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   229
      } else {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   230
        guarantee(_base == noreg, "can not encode"); a._base = disp.as_register();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   231
      }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   232
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   233
    return a;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   234
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   235
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   236
  // A call to this is generated by adlc for replacement variable $xxx$$Address.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   237
  static Address make_raw(int base, int index, int scale, int disp, relocInfo::relocType disp_reloc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   238
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   239
  bool is_same_address(Address a) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   240
    return _base == a._base && _index == a._index && _disp == a._disp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   241
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   242
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   243
  // testers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   244
  bool has_base()  const { return _base  != noreg; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   245
  bool has_index() const { return _index != noreg; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   246
  bool has_disp()  const { return true; } // There is no "invalid" value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   247
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   248
  bool is_disp12() const { return Immediate::is_uimm12(disp()); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   249
  bool is_disp20() const { return Immediate::is_simm20(disp()); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   250
  bool is_RSform()  { return has_base() && !has_index() && is_disp12(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   251
  bool is_RSYform() { return has_base() && !has_index() && is_disp20(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   252
  bool is_RXform()  { return has_base() &&  has_index() && is_disp12(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   253
  bool is_RXYform() { return has_base() &&  has_index() && is_disp20(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   254
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   255
  bool uses(Register r) { return _base == r || _index == r; };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   256
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   257
  // accessors
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   258
  Register base()      const { return _base; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   259
  Register baseOrR0()  const { assert(_base  != Z_R0, ""); return _base  == noreg ? Z_R0 : _base; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   260
  Register index()     const { return _index; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   261
  Register indexOrR0() const { assert(_index != Z_R0, ""); return _index == noreg ? Z_R0 : _index; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   262
  intptr_t disp() const { return _disp; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   263
  // Specific version for short displacement instructions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   264
  int      disp12() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   265
    assert(is_disp12(), "displacement out of range for uimm12");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   266
    return _disp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   267
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   268
  // Specific version for long displacement instructions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   269
  int      disp20() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   270
    assert(is_disp20(), "displacement out of range for simm20");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   271
    return _disp;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   272
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   273
  intptr_t value() const { return _disp; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   274
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   275
  friend class Assembler;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   276
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   277
49364
601146c66cad 8173070: Remove ValueObj class for allocation subclassing for runtime code
coleenp
parents: 48331
diff changeset
   278
class AddressLiteral {
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   279
 private:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   280
  address          _address;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   281
  RelocationHolder _rspec;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   282
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   283
  RelocationHolder rspec_from_rtype(relocInfo::relocType rtype, address addr) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   284
    switch (rtype) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   285
    case relocInfo::external_word_type:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   286
      return external_word_Relocation::spec(addr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   287
    case relocInfo::internal_word_type:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   288
      return internal_word_Relocation::spec(addr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   289
    case relocInfo::opt_virtual_call_type:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   290
      return opt_virtual_call_Relocation::spec();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   291
    case relocInfo::static_call_type:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   292
      return static_call_Relocation::spec();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   293
    case relocInfo::runtime_call_w_cp_type:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   294
      return runtime_call_w_cp_Relocation::spec();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   295
    case relocInfo::none:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   296
      return RelocationHolder();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   297
    default:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   298
      ShouldNotReachHere();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   299
      return RelocationHolder();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   300
    }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   301
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   302
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   303
 protected:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   304
  // creation
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   305
  AddressLiteral() : _address(NULL), _rspec(NULL) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   306
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   307
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   308
  AddressLiteral(address addr, RelocationHolder const& rspec)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   309
    : _address(addr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   310
      _rspec(rspec) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   311
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   312
  // Some constructors to avoid casting at the call site.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   313
  AddressLiteral(jobject obj, RelocationHolder const& rspec)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   314
    : _address((address) obj),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   315
      _rspec(rspec) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   316
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   317
  AddressLiteral(intptr_t value, RelocationHolder const& rspec)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   318
    : _address((address) value),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   319
      _rspec(rspec) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   320
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   321
  AddressLiteral(address addr, relocInfo::relocType rtype = relocInfo::none)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   322
    : _address((address) addr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   323
    _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   324
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   325
  // Some constructors to avoid casting at the call site.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   326
  AddressLiteral(address* addr, relocInfo::relocType rtype = relocInfo::none)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   327
    : _address((address) addr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   328
    _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   329
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   330
  AddressLiteral(bool* addr, relocInfo::relocType rtype = relocInfo::none)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   331
    : _address((address) addr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   332
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   333
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   334
  AddressLiteral(const bool* addr, relocInfo::relocType rtype = relocInfo::none)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   335
    : _address((address) addr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   336
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   337
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   338
  AddressLiteral(signed char* addr, relocInfo::relocType rtype = relocInfo::none)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   339
    : _address((address) addr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   340
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   341
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   342
  AddressLiteral(int* addr, relocInfo::relocType rtype = relocInfo::none)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   343
    : _address((address) addr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   344
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   345
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   346
  AddressLiteral(intptr_t addr, relocInfo::relocType rtype = relocInfo::none)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   347
    : _address((address) addr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   348
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   349
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   350
  AddressLiteral(intptr_t* addr, relocInfo::relocType rtype = relocInfo::none)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   351
    : _address((address) addr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   352
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   353
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   354
  AddressLiteral(oop addr, relocInfo::relocType rtype = relocInfo::none)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   355
    : _address((address) addr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   356
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   357
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   358
  AddressLiteral(oop* addr, relocInfo::relocType rtype = relocInfo::none)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   359
    : _address((address) addr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   360
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   361
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   362
  AddressLiteral(float* addr, relocInfo::relocType rtype = relocInfo::none)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   363
    : _address((address) addr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   364
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   365
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   366
  AddressLiteral(double* addr, relocInfo::relocType rtype = relocInfo::none)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   367
    : _address((address) addr),
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   368
      _rspec(rspec_from_rtype(rtype, (address) addr)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   369
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   370
  intptr_t value() const { return (intptr_t) _address; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   371
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   372
  const relocInfo::relocType rtype() const { return _rspec.type(); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   373
  const RelocationHolder&    rspec() const { return _rspec; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   374
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   375
  RelocationHolder rspec(int offset) const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   376
    return offset == 0 ? _rspec : _rspec.plus(offset);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   377
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   378
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   379
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   380
// Convenience classes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   381
class ExternalAddress: public AddressLiteral {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   382
 private:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   383
  static relocInfo::relocType reloc_for_target(address target) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   384
    // Sometimes ExternalAddress is used for values which aren't
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   385
    // exactly addresses, like the card table base.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   386
    // External_word_type can't be used for values in the first page
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   387
    // so just skip the reloc in that case.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   388
    return external_word_Relocation::can_be_relocated(target) ? relocInfo::external_word_type : relocInfo::none;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   389
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   390
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   391
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   392
  ExternalAddress(address target) : AddressLiteral(target, reloc_for_target(          target)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   393
  ExternalAddress(oop*    target) : AddressLiteral(target, reloc_for_target((address) target)) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   394
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   395
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   396
// Argument is an abstraction used to represent an outgoing actual
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   397
// argument or an incoming formal parameter, whether it resides in
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   398
// memory or in a register, in a manner consistent with the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   399
// z/Architecture Application Binary Interface, or ABI. This is often
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   400
// referred to as the native or C calling convention.
49364
601146c66cad 8173070: Remove ValueObj class for allocation subclassing for runtime code
coleenp
parents: 48331
diff changeset
   401
class Argument {
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   402
 private:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   403
  int _number;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   404
  bool _is_in;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   405
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   406
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   407
  enum {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   408
    // Only 5 registers may contain integer parameters.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   409
    n_register_parameters = 5,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   410
    // Can have up to 4 floating registers.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   411
    n_float_register_parameters = 4
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   412
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   413
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   414
  // creation
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   415
  Argument(int number, bool is_in) : _number(number), _is_in(is_in) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   416
  Argument(int number) : _number(number) {}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   417
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   418
  int number() const { return _number; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   419
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   420
  Argument successor() const { return Argument(number() + 1); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   421
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   422
  // Locating register-based arguments:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   423
  bool is_register() const { return _number < n_register_parameters; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   424
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   425
  // Locating Floating Point register-based arguments:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   426
  bool is_float_register() const { return _number < n_float_register_parameters; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   427
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   428
  FloatRegister as_float_register() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   429
    assert(is_float_register(), "must be a register argument");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   430
    return as_FloatRegister((number() *2) + 1);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   431
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   432
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   433
  FloatRegister as_double_register() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   434
    assert(is_float_register(), "must be a register argument");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   435
    return as_FloatRegister((number() *2));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   436
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   437
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   438
  Register as_register() const {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   439
    assert(is_register(), "must be a register argument");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   440
    return as_Register(number() + Z_ARG1->encoding());
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   441
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   442
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   443
  // debugging
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   444
  const char* name() const;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   445
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   446
  friend class Assembler;
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
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   450
// The z/Architecture Assembler: Pure assembler doing NO optimizations
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   451
// on the instruction level; i.e., what you write is what you get. The
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   452
// Assembler is generating code into a CodeBuffer.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   453
class Assembler : public AbstractAssembler {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   454
 protected:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   455
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   456
  friend class AbstractAssembler;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   457
  friend class AddressLiteral;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   458
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   459
  // Code patchers need various routines like inv_wdisp().
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   460
  friend class NativeInstruction;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   461
#ifndef COMPILER2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   462
  friend class NativeGeneralJump;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   463
#endif
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   464
  friend class Relocation;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   465
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   466
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   467
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   468
// Addressing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   469
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   470
// address calculation
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   471
#define LA_ZOPC     (unsigned  int)(0x41  << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   472
#define LAY_ZOPC    (unsigned long)(0xe3L << 40 | 0x71L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   473
#define LARL_ZOPC   (unsigned long)(0xc0L << 40 | 0x00L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   474
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   475
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   476
// Data Transfer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   477
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   478
// register to register transfer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   479
#define LR_ZOPC     (unsigned  int)(24 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   480
#define LBR_ZOPC    (unsigned  int)(0xb926 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   481
#define LHR_ZOPC    (unsigned  int)(0xb927 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   482
#define LGBR_ZOPC   (unsigned  int)(0xb906 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   483
#define LGHR_ZOPC   (unsigned  int)(0xb907 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   484
#define LGFR_ZOPC   (unsigned  int)(0xb914 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   485
#define LGR_ZOPC    (unsigned  int)(0xb904 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   486
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   487
#define LLHR_ZOPC   (unsigned  int)(0xb995 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   488
#define LLGCR_ZOPC  (unsigned  int)(0xb984 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   489
#define LLGHR_ZOPC  (unsigned  int)(0xb985 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   490
#define LLGTR_ZOPC  (unsigned  int)(185 << 24 | 23 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   491
#define LLGFR_ZOPC  (unsigned  int)(185 << 24 | 22 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   492
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   493
#define LTR_ZOPC    (unsigned  int)(18 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   494
#define LTGFR_ZOPC  (unsigned  int)(185 << 24 | 18 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   495
#define LTGR_ZOPC   (unsigned  int)(185 << 24 | 2 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   496
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   497
#define LER_ZOPC    (unsigned  int)(56 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   498
#define LEDBR_ZOPC  (unsigned  int)(179 << 24 | 68 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   499
#define LEXBR_ZOPC  (unsigned  int)(179 << 24 | 70 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   500
#define LDEBR_ZOPC  (unsigned  int)(179 << 24 | 4 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   501
#define LDR_ZOPC    (unsigned  int)(40 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   502
#define LDXBR_ZOPC  (unsigned  int)(179 << 24 | 69 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   503
#define LXEBR_ZOPC  (unsigned  int)(179 << 24 | 6 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   504
#define LXDBR_ZOPC  (unsigned  int)(179 << 24 | 5 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   505
#define LXR_ZOPC    (unsigned  int)(179 << 24 | 101 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   506
#define LTEBR_ZOPC  (unsigned  int)(179 << 24 | 2 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   507
#define LTDBR_ZOPC  (unsigned  int)(179 << 24 | 18 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   508
#define LTXBR_ZOPC  (unsigned  int)(179 << 24 | 66 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   509
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   510
#define LRVR_ZOPC   (unsigned  int)(0xb91f << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   511
#define LRVGR_ZOPC  (unsigned  int)(0xb90f << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   512
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   513
#define LDGR_ZOPC   (unsigned  int)(0xb3c1 << 16)                // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   514
#define LGDR_ZOPC   (unsigned  int)(0xb3cd << 16)                // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   515
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   516
#define LOCR_ZOPC   (unsigned  int)(0xb9f2 << 16)                // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   517
#define LOCGR_ZOPC  (unsigned  int)(0xb9e2 << 16)                // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   518
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   519
// immediate to register transfer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   520
#define IIHH_ZOPC   (unsigned  int)(165 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   521
#define IIHL_ZOPC   (unsigned  int)(165 << 24 | 1 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   522
#define IILH_ZOPC   (unsigned  int)(165 << 24 | 2 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   523
#define IILL_ZOPC   (unsigned  int)(165 << 24 | 3 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   524
#define IIHF_ZOPC   (unsigned long)(0xc0L << 40 | 8L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   525
#define IILF_ZOPC   (unsigned long)(0xc0L << 40 | 9L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   526
#define LLIHH_ZOPC  (unsigned  int)(165 << 24 | 12 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   527
#define LLIHL_ZOPC  (unsigned  int)(165 << 24 | 13 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   528
#define LLILH_ZOPC  (unsigned  int)(165 << 24 | 14 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   529
#define LLILL_ZOPC  (unsigned  int)(165 << 24 | 15 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   530
#define LLIHF_ZOPC  (unsigned long)(0xc0L << 40 | 14L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   531
#define LLILF_ZOPC  (unsigned long)(0xc0L << 40 | 15L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   532
#define LHI_ZOPC    (unsigned  int)(167 << 24 | 8 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   533
#define LGHI_ZOPC   (unsigned  int)(167 << 24 | 9 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   534
#define LGFI_ZOPC   (unsigned long)(0xc0L << 40 | 1L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   535
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   536
#define LZER_ZOPC   (unsigned  int)(0xb374 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   537
#define LZDR_ZOPC   (unsigned  int)(0xb375 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   538
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   539
// LOAD: memory to register transfer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   540
#define LB_ZOPC     (unsigned long)(227L << 40 | 118L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   541
#define LH_ZOPC     (unsigned  int)(72 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   542
#define LHY_ZOPC    (unsigned long)(227L << 40 | 120L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   543
#define L_ZOPC      (unsigned  int)(88 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   544
#define LY_ZOPC     (unsigned long)(227L << 40 | 88L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   545
#define LT_ZOPC     (unsigned long)(0xe3L << 40 | 0x12L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   546
#define LGB_ZOPC    (unsigned long)(227L << 40 | 119L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   547
#define LGH_ZOPC    (unsigned long)(227L << 40 | 21L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   548
#define LGF_ZOPC    (unsigned long)(227L << 40 | 20L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   549
#define LG_ZOPC     (unsigned long)(227L << 40 | 4L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   550
#define LTG_ZOPC    (unsigned long)(0xe3L << 40 | 0x02L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   551
#define LTGF_ZOPC   (unsigned long)(0xe3L << 40 | 0x32L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   552
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   553
#define LLC_ZOPC    (unsigned long)(0xe3L << 40 | 0x94L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   554
#define LLH_ZOPC    (unsigned long)(0xe3L << 40 | 0x95L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   555
#define LLGT_ZOPC   (unsigned long)(227L << 40 | 23L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   556
#define LLGC_ZOPC   (unsigned long)(227L << 40 | 144L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   557
#define LLGH_ZOPC   (unsigned long)(227L << 40 | 145L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   558
#define LLGF_ZOPC   (unsigned long)(227L << 40 | 22L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   559
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   560
#define IC_ZOPC     (unsigned  int)(0x43  << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   561
#define ICY_ZOPC    (unsigned long)(0xe3L << 40 | 0x73L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   562
#define ICM_ZOPC    (unsigned  int)(0xbf  << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   563
#define ICMY_ZOPC   (unsigned long)(0xebL << 40 | 0x81L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   564
#define ICMH_ZOPC   (unsigned long)(0xebL << 40 | 0x80L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   565
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   566
#define LRVH_ZOPC   (unsigned long)(0xe3L << 40 | 0x1fL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   567
#define LRV_ZOPC    (unsigned long)(0xe3L << 40 | 0x1eL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   568
#define LRVG_ZOPC   (unsigned long)(0xe3L << 40 | 0x0fL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   569
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   570
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   571
// LOAD relative: memory to register transfer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   572
#define LHRL_ZOPC   (unsigned long)(0xc4L << 40 | 0x05L << 32)  // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   573
#define LRL_ZOPC    (unsigned long)(0xc4L << 40 | 0x0dL << 32)  // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   574
#define LGHRL_ZOPC  (unsigned long)(0xc4L << 40 | 0x04L << 32)  // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   575
#define LGFRL_ZOPC  (unsigned long)(0xc4L << 40 | 0x0cL << 32)  // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   576
#define LGRL_ZOPC   (unsigned long)(0xc4L << 40 | 0x08L << 32)  // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   577
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   578
#define LLHRL_ZOPC  (unsigned long)(0xc4L << 40 | 0x02L << 32)  // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   579
#define LLGHRL_ZOPC (unsigned long)(0xc4L << 40 | 0x06L << 32)  // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   580
#define LLGFRL_ZOPC (unsigned long)(0xc4L << 40 | 0x0eL << 32)  // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   581
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   582
#define LOC_ZOPC    (unsigned long)(0xebL << 40 | 0xf2L)        // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   583
#define LOCG_ZOPC   (unsigned long)(0xebL << 40 | 0xe2L)        // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   584
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   585
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   586
// LOAD multiple registers at once
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   587
#define LM_ZOPC     (unsigned  int)(0x98  << 24)
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   588
#define LMY_ZOPC    (unsigned long)(0xebL << 40 | 0x98L)
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   589
#define LMG_ZOPC    (unsigned long)(0xebL << 40 | 0x04L)
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   590
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   591
#define LE_ZOPC     (unsigned  int)(0x78 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   592
#define LEY_ZOPC    (unsigned long)(237L << 40 | 100L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   593
#define LDEB_ZOPC   (unsigned long)(237L << 40 | 4)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   594
#define LD_ZOPC     (unsigned  int)(0x68 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   595
#define LDY_ZOPC    (unsigned long)(237L << 40 | 101L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   596
#define LXEB_ZOPC   (unsigned long)(237L << 40 | 6)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   597
#define LXDB_ZOPC   (unsigned long)(237L << 40 | 5)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   598
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   599
// STORE: register to memory transfer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   600
#define STC_ZOPC    (unsigned  int)(0x42 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   601
#define STCY_ZOPC   (unsigned long)(227L << 40 | 114L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   602
#define STH_ZOPC    (unsigned  int)(64 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   603
#define STHY_ZOPC   (unsigned long)(227L << 40 | 112L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   604
#define ST_ZOPC     (unsigned  int)(80 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   605
#define STY_ZOPC    (unsigned long)(227L << 40 | 80L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   606
#define STG_ZOPC    (unsigned long)(227L << 40 | 36L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   607
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   608
#define STCM_ZOPC   (unsigned long)(0xbeL << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   609
#define STCMY_ZOPC  (unsigned long)(0xebL << 40 | 0x2dL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   610
#define STCMH_ZOPC  (unsigned long)(0xebL << 40 | 0x2cL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   611
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   612
// STORE relative: memory to register transfer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   613
#define STHRL_ZOPC  (unsigned long)(0xc4L << 40 | 0x07L << 32)  // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   614
#define STRL_ZOPC   (unsigned long)(0xc4L << 40 | 0x0fL << 32)  // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   615
#define STGRL_ZOPC  (unsigned long)(0xc4L << 40 | 0x0bL << 32)  // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   616
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   617
#define STOC_ZOPC   (unsigned long)(0xebL << 40 | 0xf3L)        // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   618
#define STOCG_ZOPC  (unsigned long)(0xebL << 40 | 0xe3L)        // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   619
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   620
// STORE multiple registers at once
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   621
#define STM_ZOPC    (unsigned  int)(0x90  << 24)
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   622
#define STMY_ZOPC   (unsigned long)(0xebL << 40 | 0x90L)
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   623
#define STMG_ZOPC   (unsigned long)(0xebL << 40 | 0x24L)
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   624
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   625
#define STE_ZOPC    (unsigned  int)(0x70 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   626
#define STEY_ZOPC   (unsigned long)(237L << 40 | 102L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   627
#define STD_ZOPC    (unsigned  int)(0x60 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   628
#define STDY_ZOPC   (unsigned long)(237L << 40 | 103L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   629
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   630
// MOVE: immediate to memory transfer
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   631
#define MVHHI_ZOPC  (unsigned long)(0xe5L << 40 | 0x44L << 32)   // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   632
#define MVHI_ZOPC   (unsigned long)(0xe5L << 40 | 0x4cL << 32)   // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   633
#define MVGHI_ZOPC  (unsigned long)(0xe5L << 40 | 0x48L << 32)   // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   634
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   635
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   636
//  ALU operations
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   637
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   638
// Load Positive
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   639
#define LPR_ZOPC    (unsigned  int)(16 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   640
#define LPGFR_ZOPC  (unsigned  int)(185 << 24 | 16 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   641
#define LPGR_ZOPC   (unsigned  int)(185 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   642
#define LPEBR_ZOPC  (unsigned  int)(179 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   643
#define LPDBR_ZOPC  (unsigned  int)(179 << 24 | 16 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   644
#define LPXBR_ZOPC  (unsigned  int)(179 << 24 | 64 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   645
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   646
// Load Negative
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   647
#define LNR_ZOPC    (unsigned  int)(17 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   648
#define LNGFR_ZOPC  (unsigned  int)(185 << 24 | 17 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   649
#define LNGR_ZOPC   (unsigned  int)(185 << 24 | 1 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   650
#define LNEBR_ZOPC  (unsigned  int)(179 << 24 | 1 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   651
#define LNDBR_ZOPC  (unsigned  int)(179 << 24 | 17 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   652
#define LNXBR_ZOPC  (unsigned  int)(179 << 24 | 65 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   653
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   654
// Load Complement
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   655
#define LCR_ZOPC    (unsigned  int)(19 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   656
#define LCGFR_ZOPC  (unsigned  int)(185 << 24 | 19 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   657
#define LCGR_ZOPC   (unsigned  int)(185 << 24 | 3 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   658
#define LCEBR_ZOPC  (unsigned  int)(179 << 24 | 3 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   659
#define LCDBR_ZOPC  (unsigned  int)(179 << 24 | 19 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   660
#define LCXBR_ZOPC  (unsigned  int)(179 << 24 | 67 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   661
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   662
// Add
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   663
// RR, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   664
#define AR_ZOPC     (unsigned  int)(26 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   665
#define AGFR_ZOPC   (unsigned  int)(0xb9 << 24 | 0x18 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   666
#define AGR_ZOPC    (unsigned  int)(0xb9 << 24 | 0x08 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   667
// RRF, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   668
#define ARK_ZOPC    (unsigned  int)(0xb9 << 24 | 0x00f8 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   669
#define AGRK_ZOPC   (unsigned  int)(0xb9 << 24 | 0x00e8 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   670
// RI, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   671
#define AHI_ZOPC    (unsigned  int)(167 << 24 | 10 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   672
#define AFI_ZOPC    (unsigned long)(0xc2L << 40 | 9L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   673
#define AGHI_ZOPC   (unsigned  int)(167 << 24 | 11 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   674
#define AGFI_ZOPC   (unsigned long)(0xc2L << 40 | 8L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   675
// RIE, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   676
#define AHIK_ZOPC   (unsigned long)(0xecL << 40 | 0x00d8L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   677
#define AGHIK_ZOPC  (unsigned long)(0xecL << 40 | 0x00d9L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   678
#define AIH_ZOPC    (unsigned long)(0xccL << 40 | 0x08L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   679
// RM, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   680
#define AHY_ZOPC    (unsigned long)(227L << 40 | 122L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   681
#define A_ZOPC      (unsigned  int)(90 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   682
#define AY_ZOPC     (unsigned long)(227L << 40 | 90L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   683
#define AGF_ZOPC    (unsigned long)(227L << 40 | 24L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   684
#define AG_ZOPC     (unsigned long)(227L << 40 | 8L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   685
// In-memory arithmetic (add signed, add logical with signed immediate).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   686
// MI, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   687
#define ASI_ZOPC    (unsigned long)(0xebL << 40 | 0x6aL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   688
#define AGSI_ZOPC   (unsigned long)(0xebL << 40 | 0x7aL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   689
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   690
// RR, Logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   691
#define ALR_ZOPC    (unsigned  int)(30 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   692
#define ALGFR_ZOPC  (unsigned  int)(185 << 24 | 26 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   693
#define ALGR_ZOPC   (unsigned  int)(185 << 24 | 10 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   694
#define ALCGR_ZOPC  (unsigned  int)(185 << 24 | 136 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   695
// RRF, Logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   696
#define ALRK_ZOPC   (unsigned  int)(0xb9 << 24 | 0x00fa << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   697
#define ALGRK_ZOPC  (unsigned  int)(0xb9 << 24 | 0x00ea << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   698
// RI, Logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   699
#define ALFI_ZOPC   (unsigned long)(0xc2L << 40 | 0x0bL << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   700
#define ALGFI_ZOPC  (unsigned long)(0xc2L << 40 | 0x0aL << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   701
// RIE, Logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   702
#define ALHSIK_ZOPC (unsigned long)(0xecL << 40 | 0x00daL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   703
#define ALGHSIK_ZOPC (unsigned long)(0xecL << 40 | 0x00dbL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   704
// RM, Logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   705
#define AL_ZOPC     (unsigned  int)(0x5e << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   706
#define ALY_ZOPC    (unsigned long)(227L << 40 | 94L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   707
#define ALGF_ZOPC   (unsigned long)(227L << 40 | 26L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   708
#define ALG_ZOPC    (unsigned long)(227L << 40 | 10L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   709
// In-memory arithmetic (add signed, add logical with signed immediate).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   710
// MI, Logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   711
#define ALSI_ZOPC   (unsigned long)(0xebL << 40 | 0x6eL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   712
#define ALGSI_ZOPC  (unsigned long)(0xebL << 40 | 0x7eL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   713
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   714
// RR, BFP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   715
#define AEBR_ZOPC   (unsigned  int)(179 << 24 | 10 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   716
#define ADBR_ZOPC   (unsigned  int)(179 << 24 | 26 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   717
#define AXBR_ZOPC   (unsigned  int)(179 << 24 | 74 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   718
// RM, BFP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   719
#define AEB_ZOPC    (unsigned long)(237L << 40 | 10)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   720
#define ADB_ZOPC    (unsigned long)(237L << 40 | 26)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   721
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   722
// Subtract
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   723
// RR, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   724
#define SR_ZOPC     (unsigned  int)(27 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   725
#define SGFR_ZOPC   (unsigned  int)(185 << 24 | 25 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   726
#define SGR_ZOPC    (unsigned  int)(185 << 24 | 9 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   727
// RRF, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   728
#define SRK_ZOPC    (unsigned  int)(0xb9 << 24 | 0x00f9 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   729
#define SGRK_ZOPC   (unsigned  int)(0xb9 << 24 | 0x00e9 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   730
//   RM, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   731
#define SH_ZOPC     (unsigned  int)(0x4b << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   732
#define SHY_ZOPC    (unsigned long)(227L << 40 | 123L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   733
#define S_ZOPC      (unsigned  int)(0x5B << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   734
#define SY_ZOPC     (unsigned long)(227L << 40 | 91L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   735
#define SGF_ZOPC    (unsigned long)(227L << 40 | 25)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   736
#define SG_ZOPC     (unsigned long)(227L << 40 | 9)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   737
// RR, Logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   738
#define SLR_ZOPC    (unsigned  int)(31 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   739
#define SLGFR_ZOPC  (unsigned  int)(185 << 24 | 27 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   740
#define SLGR_ZOPC   (unsigned  int)(185 << 24 | 11 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   741
// RIL, Logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   742
#define SLFI_ZOPC   (unsigned long)(0xc2L << 40 | 0x05L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   743
#define SLGFI_ZOPC  (unsigned long)(0xc2L << 40 | 0x04L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   744
// RRF, Logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   745
#define SLRK_ZOPC   (unsigned  int)(0xb9 << 24 | 0x00fb << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   746
#define SLGRK_ZOPC  (unsigned  int)(0xb9 << 24 | 0x00eb << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   747
// RM, Logical
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   748
#define SLY_ZOPC    (unsigned long)(227L << 40 | 95L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   749
#define SLGF_ZOPC   (unsigned long)(227L << 40 | 27L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   750
#define SLG_ZOPC    (unsigned long)(227L << 40 | 11L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   751
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   752
// RR, BFP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   753
#define SEBR_ZOPC   (unsigned  int)(179 << 24 | 11 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   754
#define SDBR_ZOPC   (unsigned  int)(179 << 24 | 27 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   755
#define SXBR_ZOPC   (unsigned  int)(179 << 24 | 75 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   756
// RM, BFP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   757
#define SEB_ZOPC    (unsigned long)(237L << 40 | 11)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   758
#define SDB_ZOPC    (unsigned long)(237L << 40 | 27)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   759
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   760
// Multiply
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   761
// RR, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   762
#define MR_ZOPC     (unsigned  int)(28 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   763
#define MSR_ZOPC    (unsigned  int)(178 << 24 | 82 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   764
#define MSGFR_ZOPC  (unsigned  int)(185 << 24 | 28 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   765
#define MSGR_ZOPC   (unsigned  int)(185 << 24 | 12 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   766
// RI, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   767
#define MHI_ZOPC    (unsigned  int)(167 << 24 | 12 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   768
#define MGHI_ZOPC   (unsigned  int)(167 << 24 | 13 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   769
#define MSFI_ZOPC   (unsigned long)(0xc2L << 40 | 0x01L << 32)   // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   770
#define MSGFI_ZOPC  (unsigned long)(0xc2L << 40 | 0x00L << 32)   // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   771
// RM, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   772
#define M_ZOPC      (unsigned  int)(92 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   773
#define MS_ZOPC     (unsigned  int)(0x71 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   774
#define MHY_ZOPC    (unsigned long)(0xe3L<< 40 | 0x7cL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   775
#define MSY_ZOPC    (unsigned long)(227L << 40 | 81L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   776
#define MSGF_ZOPC   (unsigned long)(227L << 40 | 28L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   777
#define MSG_ZOPC    (unsigned long)(227L << 40 | 12L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   778
// RR, unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   779
#define MLR_ZOPC    (unsigned  int)(185 << 24 | 150 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   780
#define MLGR_ZOPC   (unsigned  int)(185 << 24 | 134 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   781
// RM, unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   782
#define ML_ZOPC     (unsigned long)(227L << 40 | 150L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   783
#define MLG_ZOPC    (unsigned long)(227L << 40 | 134L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   784
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   785
// RR, BFP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   786
#define MEEBR_ZOPC  (unsigned  int)(179 << 24 | 23 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   787
#define MDEBR_ZOPC  (unsigned  int)(179 << 24 | 12 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   788
#define MDBR_ZOPC   (unsigned  int)(179 << 24 | 28 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   789
#define MXDBR_ZOPC  (unsigned  int)(179 << 24 | 7 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   790
#define MXBR_ZOPC   (unsigned  int)(179 << 24 | 76 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   791
// RM, BFP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   792
#define MEEB_ZOPC   (unsigned long)(237L << 40 | 23)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   793
#define MDEB_ZOPC   (unsigned long)(237L << 40 | 12)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   794
#define MDB_ZOPC    (unsigned long)(237L << 40 | 28)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   795
#define MXDB_ZOPC   (unsigned long)(237L << 40 | 7)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   796
42897
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
   797
// Multiply-Add
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
   798
#define MAEBR_ZOPC  (unsigned  int)(179 << 24 | 14 << 16)
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
   799
#define MADBR_ZOPC  (unsigned  int)(179 << 24 | 30 << 16)
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
   800
#define MSEBR_ZOPC  (unsigned  int)(179 << 24 | 15 << 16)
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
   801
#define MSDBR_ZOPC  (unsigned  int)(179 << 24 | 31 << 16)
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
   802
#define MAEB_ZOPC   (unsigned long)(237L << 40 | 14)
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
   803
#define MADB_ZOPC   (unsigned long)(237L << 40 | 30)
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
   804
#define MSEB_ZOPC   (unsigned long)(237L << 40 | 15)
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
   805
#define MSDB_ZOPC   (unsigned long)(237L << 40 | 31)
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
   806
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   807
// Divide
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   808
// RR, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   809
#define DSGFR_ZOPC  (unsigned  int)(0xb91d << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   810
#define DSGR_ZOPC   (unsigned  int)(0xb90d << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   811
// RM, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   812
#define D_ZOPC      (unsigned  int)(93 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   813
#define DSGF_ZOPC   (unsigned long)(227L << 40 | 29L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   814
#define DSG_ZOPC    (unsigned long)(227L << 40 | 13L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   815
// RR, unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   816
#define DLR_ZOPC    (unsigned  int)(185 << 24 | 151 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   817
#define DLGR_ZOPC   (unsigned  int)(185 << 24 | 135 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   818
// RM, unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   819
#define DL_ZOPC     (unsigned long)(227L << 40 | 151L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   820
#define DLG_ZOPC    (unsigned long)(227L << 40 | 135L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   821
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   822
// RR, BFP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   823
#define DEBR_ZOPC   (unsigned  int)(179 << 24 | 13 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   824
#define DDBR_ZOPC   (unsigned  int)(179 << 24 | 29 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   825
#define DXBR_ZOPC   (unsigned  int)(179 << 24 | 77 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   826
// RM, BFP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   827
#define DEB_ZOPC    (unsigned long)(237L << 40 | 13)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   828
#define DDB_ZOPC    (unsigned long)(237L << 40 | 29)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   829
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   830
// Square Root
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   831
// RR, BFP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   832
#define SQEBR_ZOPC  (unsigned  int)(0xb314 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   833
#define SQDBR_ZOPC  (unsigned  int)(0xb315 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   834
#define SQXBR_ZOPC  (unsigned  int)(0xb316 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   835
// RM, BFP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   836
#define SQEB_ZOPC   (unsigned long)(237L << 40 | 20)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   837
#define SQDB_ZOPC   (unsigned long)(237L << 40 | 21)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   838
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   839
// Compare and Test
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   840
// RR, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   841
#define CR_ZOPC     (unsigned  int)(25 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   842
#define CGFR_ZOPC   (unsigned  int)(185 << 24 | 48 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   843
#define CGR_ZOPC    (unsigned  int)(185 << 24 | 32 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   844
// RI, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   845
#define CHI_ZOPC    (unsigned  int)(167 << 24 | 14 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   846
#define CFI_ZOPC    (unsigned long)(0xc2L << 40 | 0xdL << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   847
#define CGHI_ZOPC   (unsigned  int)(167 << 24 | 15 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   848
#define CGFI_ZOPC   (unsigned long)(0xc2L << 40 | 0xcL << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   849
// RM, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   850
#define CH_ZOPC     (unsigned  int)(0x49 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   851
#define CHY_ZOPC    (unsigned long)(227L << 40 | 121L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   852
#define C_ZOPC      (unsigned  int)(0x59 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   853
#define CY_ZOPC     (unsigned long)(227L << 40 | 89L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   854
#define CGF_ZOPC    (unsigned long)(227L << 40 | 48L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   855
#define CG_ZOPC     (unsigned long)(227L << 40 | 32L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   856
// RR, unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   857
#define CLR_ZOPC    (unsigned  int)(21 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   858
#define CLGFR_ZOPC  (unsigned  int)(185 << 24 | 49 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   859
#define CLGR_ZOPC   (unsigned  int)(185 << 24 | 33 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   860
// RIL, unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   861
#define CLFI_ZOPC   (unsigned long)(0xc2L << 40 | 0xfL << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   862
#define CLGFI_ZOPC  (unsigned long)(0xc2L << 40 | 0xeL << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   863
// RM, unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   864
#define CL_ZOPC     (unsigned  int)(0x55 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   865
#define CLY_ZOPC    (unsigned long)(227L << 40 | 85L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   866
#define CLGF_ZOPC   (unsigned long)(227L << 40 | 49L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   867
#define CLG_ZOPC    (unsigned long)(227L << 40 | 33L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   868
// RI, unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   869
#define TMHH_ZOPC   (unsigned  int)(167 << 24 | 2 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   870
#define TMHL_ZOPC   (unsigned  int)(167 << 24 | 3 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   871
#define TMLH_ZOPC   (unsigned  int)(167 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   872
#define TMLL_ZOPC   (unsigned  int)(167 << 24 | 1 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   873
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   874
// RR, BFP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   875
#define CEBR_ZOPC   (unsigned  int)(179 << 24 | 9 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   876
#define CDBR_ZOPC   (unsigned  int)(179 << 24 | 25 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   877
#define CXBR_ZOPC   (unsigned  int)(179 << 24 | 73 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   878
// RM, BFP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   879
#define CEB_ZOPC    (unsigned long)(237L << 40 | 9)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   880
#define CDB_ZOPC    (unsigned long)(237L << 40 | 25)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   881
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   882
// Shift
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   883
// arithmetic
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   884
#define SLA_ZOPC    (unsigned  int)(0x8b  << 24)
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   885
#define SLAK_ZOPC   (unsigned long)(0xebL << 40 | 0xddL)
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   886
#define SLAG_ZOPC   (unsigned long)(0xebL << 40 | 0x0bL)
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   887
#define SRA_ZOPC    (unsigned  int)(0x8a  << 24)
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   888
#define SRAK_ZOPC   (unsigned long)(0xebL << 40 | 0xdcL)
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   889
#define SRAG_ZOPC   (unsigned long)(0xebL << 40 | 0x0aL)
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   890
// logical
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   891
#define SLL_ZOPC    (unsigned  int)(0x89  << 24)
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   892
#define SLLK_ZOPC   (unsigned long)(0xebL << 40 | 0xdfL)
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   893
#define SLLG_ZOPC   (unsigned long)(0xebL << 40 | 0x0dL)
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   894
#define SRL_ZOPC    (unsigned  int)(0x88  << 24)
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   895
#define SRLK_ZOPC   (unsigned long)(0xebL << 40 | 0xdeL)
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
   896
#define SRLG_ZOPC   (unsigned long)(0xebL << 40 | 0x0cL)
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   897
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   898
// Rotate, then AND/XOR/OR/insert
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   899
// rotate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   900
#define RLL_ZOPC    (unsigned long)(0xebL << 40 | 0x1dL)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   901
#define RLLG_ZOPC   (unsigned long)(0xebL << 40 | 0x1cL)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   902
// rotate and {AND|XOR|OR|INS}
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   903
#define RNSBG_ZOPC  (unsigned long)(0xecL << 40 | 0x54L)         // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   904
#define RXSBG_ZOPC  (unsigned long)(0xecL << 40 | 0x57L)         // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   905
#define ROSBG_ZOPC  (unsigned long)(0xecL << 40 | 0x56L)         // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   906
#define RISBG_ZOPC  (unsigned long)(0xecL << 40 | 0x55L)         // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   907
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   908
// AND
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   909
// RR, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   910
#define NR_ZOPC     (unsigned  int)(20 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   911
#define NGR_ZOPC    (unsigned  int)(185 << 24 | 128 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   912
// RRF, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   913
#define NRK_ZOPC    (unsigned  int)(0xb9 << 24 | 0x00f4 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   914
#define NGRK_ZOPC   (unsigned  int)(0xb9 << 24 | 0x00e4 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   915
// RI, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   916
#define NIHH_ZOPC   (unsigned  int)(165 << 24 | 4 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   917
#define NIHL_ZOPC   (unsigned  int)(165 << 24 | 5 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   918
#define NILH_ZOPC   (unsigned  int)(165 << 24 | 6 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   919
#define NILL_ZOPC   (unsigned  int)(165 << 24 | 7 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   920
#define NIHF_ZOPC   (unsigned long)(0xc0L << 40 | 10L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   921
#define NILF_ZOPC   (unsigned long)(0xc0L << 40 | 11L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   922
// RM, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   923
#define N_ZOPC      (unsigned  int)(0x54 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   924
#define NY_ZOPC     (unsigned long)(227L << 40 | 84L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   925
#define NG_ZOPC     (unsigned long)(227L << 40 | 128L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   926
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   927
// OR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   928
// RR, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   929
#define OR_ZOPC     (unsigned  int)(22 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   930
#define OGR_ZOPC    (unsigned  int)(185 << 24 | 129 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   931
// RRF, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   932
#define ORK_ZOPC    (unsigned  int)(0xb9 << 24 | 0x00f6 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   933
#define OGRK_ZOPC   (unsigned  int)(0xb9 << 24 | 0x00e6 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   934
// RI, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   935
#define OIHH_ZOPC   (unsigned  int)(165 << 24 | 8 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   936
#define OIHL_ZOPC   (unsigned  int)(165 << 24 | 9 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   937
#define OILH_ZOPC   (unsigned  int)(165 << 24 | 10 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   938
#define OILL_ZOPC   (unsigned  int)(165 << 24 | 11 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   939
#define OIHF_ZOPC   (unsigned long)(0xc0L << 40 | 12L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   940
#define OILF_ZOPC   (unsigned long)(0xc0L << 40 | 13L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   941
// RM, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   942
#define O_ZOPC      (unsigned  int)(0x56 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   943
#define OY_ZOPC     (unsigned long)(227L << 40 | 86L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   944
#define OG_ZOPC     (unsigned long)(227L << 40 | 129L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   945
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   946
// XOR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   947
// RR, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   948
#define XR_ZOPC     (unsigned  int)(23 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   949
#define XGR_ZOPC    (unsigned  int)(185 << 24 | 130 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   950
// RRF, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   951
#define XRK_ZOPC    (unsigned  int)(0xb9 << 24 | 0x00f7 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   952
#define XGRK_ZOPC   (unsigned  int)(0xb9 << 24 | 0x00e7 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   953
// RI, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   954
#define XIHF_ZOPC   (unsigned long)(0xc0L << 40 | 6L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   955
#define XILF_ZOPC   (unsigned long)(0xc0L << 40 | 7L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   956
// RM, signed
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   957
#define X_ZOPC      (unsigned  int)(0x57 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   958
#define XY_ZOPC     (unsigned long)(227L << 40 | 87L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   959
#define XG_ZOPC     (unsigned long)(227L << 40 | 130L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   960
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   961
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   962
// Data Conversion
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   963
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   964
// INT to BFP
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   965
#define CEFBR_ZOPC  (unsigned  int)(179 << 24 | 148 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   966
#define CDFBR_ZOPC  (unsigned  int)(179 << 24 | 149 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   967
#define CXFBR_ZOPC  (unsigned  int)(179 << 24 | 150 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   968
#define CEGBR_ZOPC  (unsigned  int)(179 << 24 | 164 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   969
#define CDGBR_ZOPC  (unsigned  int)(179 << 24 | 165 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   970
#define CXGBR_ZOPC  (unsigned  int)(179 << 24 | 166 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   971
// BFP to INT
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   972
#define CFEBR_ZOPC  (unsigned  int)(179 << 24 | 152 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   973
#define CFDBR_ZOPC  (unsigned  int)(179 << 24 | 153 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   974
#define CFXBR_ZOPC  (unsigned  int)(179 << 24 | 154 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   975
#define CGEBR_ZOPC  (unsigned  int)(179 << 24 | 168 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   976
#define CGDBR_ZOPC  (unsigned  int)(179 << 24 | 169 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   977
#define CGXBR_ZOPC  (unsigned  int)(179 << 24 | 170 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   978
// INT to DEC
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   979
#define CVD_ZOPC    (unsigned  int)(0x4e << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   980
#define CVDY_ZOPC   (unsigned long)(0xe3L << 40 | 0x26L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   981
#define CVDG_ZOPC   (unsigned long)(0xe3L << 40 | 0x2eL)
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
// BFP Control
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   985
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   986
#define SRNM_ZOPC   (unsigned  int)(178 << 24 | 153 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   987
#define EFPC_ZOPC   (unsigned  int)(179 << 24 | 140 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   988
#define SFPC_ZOPC   (unsigned  int)(179 << 24 | 132 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   989
#define STFPC_ZOPC  (unsigned  int)(178 << 24 | 156 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   990
#define LFPC_ZOPC   (unsigned  int)(178 << 24 | 157 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   991
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   992
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   993
// Branch Instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   994
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   995
// Register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   996
#define BCR_ZOPC    (unsigned  int)(7 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   997
#define BALR_ZOPC   (unsigned  int)(5 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   998
#define BASR_ZOPC   (unsigned  int)(13 << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
   999
#define BCTGR_ZOPC  (unsigned long)(0xb946 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1000
// Absolute
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1001
#define BC_ZOPC     (unsigned  int)(71 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1002
#define BAL_ZOPC    (unsigned  int)(69 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1003
#define BAS_ZOPC    (unsigned  int)(77 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1004
#define BXH_ZOPC    (unsigned  int)(134 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1005
#define BXHG_ZOPC   (unsigned long)(235L << 40 | 68)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1006
// Relative
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1007
#define BRC_ZOPC    (unsigned  int)(167 << 24 | 4 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1008
#define BRCL_ZOPC   (unsigned long)(192L << 40 | 4L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1009
#define BRAS_ZOPC   (unsigned  int)(167 << 24 | 5 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1010
#define BRASL_ZOPC  (unsigned long)(192L << 40 | 5L << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1011
#define BRCT_ZOPC   (unsigned  int)(167 << 24 | 6 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1012
#define BRCTG_ZOPC  (unsigned  int)(167 << 24 | 7 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1013
#define BRXH_ZOPC   (unsigned  int)(132 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1014
#define BRXHG_ZOPC  (unsigned long)(236L << 40 | 68)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1015
#define BRXLE_ZOPC  (unsigned  int)(133 << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1016
#define BRXLG_ZOPC  (unsigned long)(236L << 40 | 69)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1017
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1018
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1019
// Compare and Branch Instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1020
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1021
// signed comp reg/reg, branch Absolute
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1022
#define CRB_ZOPC    (unsigned long)(0xecL << 40 | 0xf6L)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1023
#define CGRB_ZOPC   (unsigned long)(0xecL << 40 | 0xe4L)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1024
// signed comp reg/reg, branch Relative
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1025
#define CRJ_ZOPC    (unsigned long)(0xecL << 40 | 0x76L)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1026
#define CGRJ_ZOPC   (unsigned long)(0xecL << 40 | 0x64L)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1027
// signed comp reg/imm, branch absolute
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1028
#define CIB_ZOPC    (unsigned long)(0xecL << 40 | 0xfeL)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1029
#define CGIB_ZOPC   (unsigned long)(0xecL << 40 | 0xfcL)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1030
// signed comp reg/imm, branch relative
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1031
#define CIJ_ZOPC    (unsigned long)(0xecL << 40 | 0x7eL)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1032
#define CGIJ_ZOPC   (unsigned long)(0xecL << 40 | 0x7cL)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1033
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1034
// unsigned comp reg/reg, branch Absolute
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1035
#define CLRB_ZOPC   (unsigned long)(0xecL << 40 | 0xf7L)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1036
#define CLGRB_ZOPC  (unsigned long)(0xecL << 40 | 0xe5L)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1037
// unsigned comp reg/reg, branch Relative
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1038
#define CLRJ_ZOPC   (unsigned long)(0xecL << 40 | 0x77L)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1039
#define CLGRJ_ZOPC  (unsigned long)(0xecL << 40 | 0x65L)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1040
// unsigned comp reg/imm, branch absolute
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1041
#define CLIB_ZOPC   (unsigned long)(0xecL << 40 | 0xffL)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1042
#define CLGIB_ZOPC  (unsigned long)(0xecL << 40 | 0xfdL)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1043
// unsigned comp reg/imm, branch relative
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1044
#define CLIJ_ZOPC   (unsigned long)(0xecL << 40 | 0x7fL)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1045
#define CLGIJ_ZOPC  (unsigned long)(0xecL << 40 | 0x7dL)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1046
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1047
// comp reg/reg, trap
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1048
#define CRT_ZOPC    (unsigned  int)(0xb972 << 16)                // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1049
#define CGRT_ZOPC   (unsigned  int)(0xb960 << 16)                // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1050
#define CLRT_ZOPC   (unsigned  int)(0xb973 << 16)                // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1051
#define CLGRT_ZOPC  (unsigned  int)(0xb961 << 16)                // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1052
// comp reg/imm, trap
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1053
#define CIT_ZOPC    (unsigned long)(0xecL << 40 | 0x72L)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1054
#define CGIT_ZOPC   (unsigned long)(0xecL << 40 | 0x70L)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1055
#define CLFIT_ZOPC  (unsigned long)(0xecL << 40 | 0x73L)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1056
#define CLGIT_ZOPC  (unsigned long)(0xecL << 40 | 0x71L)         // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1057
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1058
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1059
// Direct Memory Operations
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1060
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1061
// Compare
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1062
#define CLI_ZOPC    (unsigned  int)(0x95  << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1063
#define CLIY_ZOPC   (unsigned long)(0xebL << 40 | 0x55L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1064
#define CLC_ZOPC    (unsigned long)(0xd5L << 40)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1065
#define CLCL_ZOPC   (unsigned  int)(0x0f  <<  8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1066
#define CLCLE_ZOPC  (unsigned  int)(0xa9  << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1067
#define CLCLU_ZOPC  (unsigned long)(0xebL << 40 | 0x8fL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1068
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1069
// Move
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1070
#define MVI_ZOPC    (unsigned  int)(0x92  << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1071
#define MVIY_ZOPC   (unsigned long)(0xebL << 40 | 0x52L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1072
#define MVC_ZOPC    (unsigned long)(0xd2L << 40)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1073
#define MVCL_ZOPC   (unsigned  int)(0x0e  <<  8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1074
#define MVCLE_ZOPC  (unsigned  int)(0xa8  << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1075
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1076
// Test
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1077
#define TM_ZOPC     (unsigned  int)(0x91  << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1078
#define TMY_ZOPC    (unsigned long)(0xebL << 40 | 0x51L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1079
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1080
// AND
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1081
#define NI_ZOPC     (unsigned  int)(0x94  << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1082
#define NIY_ZOPC    (unsigned long)(0xebL << 40 | 0x54L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1083
#define NC_ZOPC     (unsigned long)(0xd4L << 40)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1084
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1085
// OR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1086
#define OI_ZOPC     (unsigned  int)(0x96  << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1087
#define OIY_ZOPC    (unsigned long)(0xebL << 40 | 0x56L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1088
#define OC_ZOPC     (unsigned long)(0xd6L << 40)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1089
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1090
// XOR
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1091
#define XI_ZOPC     (unsigned  int)(0x97  << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1092
#define XIY_ZOPC    (unsigned long)(0xebL << 40 | 0x57L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1093
#define XC_ZOPC     (unsigned long)(0xd7L << 40)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1094
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1095
// Search String
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1096
#define SRST_ZOPC   (unsigned  int)(178 << 24 | 94 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1097
#define SRSTU_ZOPC  (unsigned  int)(185 << 24 | 190 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1098
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1099
// Translate characters
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1100
#define TROO_ZOPC   (unsigned  int)(0xb9 << 24 | 0x93 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1101
#define TROT_ZOPC   (unsigned  int)(0xb9 << 24 | 0x92 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1102
#define TRTO_ZOPC   (unsigned  int)(0xb9 << 24 | 0x91 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1103
#define TRTT_ZOPC   (unsigned  int)(0xb9 << 24 | 0x90 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1104
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1105
47531
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1106
//---------------------------
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1107
//--  Vector Instructions  --
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1108
//---------------------------
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1109
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1110
//---<  Vector Support Instructions  >---
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1111
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1112
//---  Load (memory)  ---
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1113
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1114
#define VLM_ZOPC    (unsigned long)(0xe7L << 40 | 0x36L << 0)   // load full vreg range (n * 128 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1115
#define VL_ZOPC     (unsigned long)(0xe7L << 40 | 0x06L << 0)   // load full vreg (128 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1116
#define VLEB_ZOPC   (unsigned long)(0xe7L << 40 | 0x00L << 0)   // load vreg element (8 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1117
#define VLEH_ZOPC   (unsigned long)(0xe7L << 40 | 0x01L << 0)   // load vreg element (16 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1118
#define VLEF_ZOPC   (unsigned long)(0xe7L << 40 | 0x03L << 0)   // load vreg element (32 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1119
#define VLEG_ZOPC   (unsigned long)(0xe7L << 40 | 0x02L << 0)   // load vreg element (64 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1120
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1121
#define VLREP_ZOPC  (unsigned long)(0xe7L << 40 | 0x05L << 0)   // load and replicate into all vector elements
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1122
#define VLLEZ_ZOPC  (unsigned long)(0xe7L << 40 | 0x04L << 0)   // load logical element and zero.
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1123
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1124
// vector register gather
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1125
#define VGEF_ZOPC   (unsigned long)(0xe7L << 40 | 0x13L << 0)   // gather element (32 bit), V1(M3) = [D2(V2(M3),B2)]
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1126
#define VGEG_ZOPC   (unsigned long)(0xe7L << 40 | 0x12L << 0)   // gather element (64 bit), V1(M3) = [D2(V2(M3),B2)]
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1127
// vector register scatter
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1128
#define VSCEF_ZOPC  (unsigned long)(0xe7L << 40 | 0x1bL << 0)   // vector scatter element FW
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1129
#define VSCEG_ZOPC  (unsigned long)(0xe7L << 40 | 0x1aL << 0)   // vector scatter element DW
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1130
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1131
#define VLBB_ZOPC   (unsigned long)(0xe7L << 40 | 0x07L << 0)   // load vreg to block boundary (load to alignment).
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1132
#define VLL_ZOPC    (unsigned long)(0xe7L << 40 | 0x37L << 0)   // load vreg with length.
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1133
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1134
//---  Load (register)  ---
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1135
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1136
#define VLR_ZOPC    (unsigned long)(0xe7L << 40 | 0x56L << 0)   // copy full vreg (128 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1137
#define VLGV_ZOPC   (unsigned long)(0xe7L << 40 | 0x21L << 0)   // copy vreg element -> GR
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1138
#define VLVG_ZOPC   (unsigned long)(0xe7L << 40 | 0x22L << 0)   // copy GR -> vreg element
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1139
#define VLVGP_ZOPC  (unsigned long)(0xe7L << 40 | 0x62L << 0)   // copy GR2, GR3 (disjoint pair) -> vreg
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1140
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1141
// vector register pack: cut in half the size the source vector elements
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1142
#define VPK_ZOPC    (unsigned long)(0xe7L << 40 | 0x94L << 0)   // just cut
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1143
#define VPKS_ZOPC   (unsigned long)(0xe7L << 40 | 0x97L << 0)   // saturate as signed values
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1144
#define VPKLS_ZOPC  (unsigned long)(0xe7L << 40 | 0x95L << 0)   // saturate as unsigned values
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1145
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1146
// vector register unpack: double in size the source vector elements
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1147
#define VUPH_ZOPC   (unsigned long)(0xe7L << 40 | 0xd7L << 0)   // signed, left half of the source vector elements
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1148
#define VUPLH_ZOPC  (unsigned long)(0xe7L << 40 | 0xd5L << 0)   // unsigned, left half of the source vector elements
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1149
#define VUPL_ZOPC   (unsigned long)(0xe7L << 40 | 0xd6L << 0)   // signed, right half of the source vector elements
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1150
#define VUPLL_ZOPC  (unsigned long)(0xe7L << 40 | 0xd4L << 0)   // unsigned, right half of the source vector element
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1151
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1152
// vector register merge
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1153
#define VMRH_ZOPC   (unsigned long)(0xe7L << 40 | 0x61L << 0)   // register merge high (left half of source registers)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1154
#define VMRL_ZOPC   (unsigned long)(0xe7L << 40 | 0x60L << 0)   // register merge low (right half of source registers)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1155
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1156
// vector register permute
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1157
#define VPERM_ZOPC  (unsigned long)(0xe7L << 40 | 0x8cL << 0)   // vector permute
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1158
#define VPDI_ZOPC   (unsigned long)(0xe7L << 40 | 0x84L << 0)   // vector permute DW immediate
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1159
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1160
// vector register replicate
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1161
#define VREP_ZOPC   (unsigned long)(0xe7L << 40 | 0x4dL << 0)   // vector replicate
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1162
#define VREPI_ZOPC  (unsigned long)(0xe7L << 40 | 0x45L << 0)   // vector replicate immediate
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1163
#define VSEL_ZOPC   (unsigned long)(0xe7L << 40 | 0x8dL << 0)   // vector select
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1164
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1165
#define VSEG_ZOPC   (unsigned long)(0xe7L << 40 | 0x5fL << 0)   // vector sign-extend to DW (rightmost element in each DW).
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1166
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1167
//---  Load (immediate)  ---
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1168
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1169
#define VLEIB_ZOPC  (unsigned long)(0xe7L << 40 | 0x40L << 0)   // load vreg element (16 bit imm to 8 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1170
#define VLEIH_ZOPC  (unsigned long)(0xe7L << 40 | 0x41L << 0)   // load vreg element (16 bit imm to 16 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1171
#define VLEIF_ZOPC  (unsigned long)(0xe7L << 40 | 0x43L << 0)   // load vreg element (16 bit imm to 32 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1172
#define VLEIG_ZOPC  (unsigned long)(0xe7L << 40 | 0x42L << 0)   // load vreg element (16 bit imm to 64 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1173
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1174
//---  Store  ---
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1175
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1176
#define VSTM_ZOPC   (unsigned long)(0xe7L << 40 | 0x3eL << 0)   // store full vreg range (n * 128 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1177
#define VST_ZOPC    (unsigned long)(0xe7L << 40 | 0x0eL << 0)   // store full vreg (128 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1178
#define VSTEB_ZOPC  (unsigned long)(0xe7L << 40 | 0x08L << 0)   // store vreg element (8 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1179
#define VSTEH_ZOPC  (unsigned long)(0xe7L << 40 | 0x09L << 0)   // store vreg element (16 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1180
#define VSTEF_ZOPC  (unsigned long)(0xe7L << 40 | 0x0bL << 0)   // store vreg element (32 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1181
#define VSTEG_ZOPC  (unsigned long)(0xe7L << 40 | 0x0aL << 0)   // store vreg element (64 bit)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1182
#define VSTL_ZOPC   (unsigned long)(0xe7L << 40 | 0x3fL << 0)   // store vreg with length.
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1183
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1184
//---  Misc  ---
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1185
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1186
#define VGM_ZOPC    (unsigned long)(0xe7L << 40 | 0x46L << 0)   // generate bit  mask, [start..end] = '1', else '0'
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1187
#define VGBM_ZOPC   (unsigned long)(0xe7L << 40 | 0x44L << 0)   // generate byte mask, bits(imm16) -> bytes
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1188
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1189
//---<  Vector Arithmetic Instructions  >---
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1190
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1191
// Load
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1192
#define VLC_ZOPC    (unsigned long)(0xe7L << 40 | 0xdeL << 0)   // V1 := -V2,   element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1193
#define VLP_ZOPC    (unsigned long)(0xe7L << 40 | 0xdfL << 0)   // V1 := |V2|,  element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1194
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1195
// ADD
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1196
#define VA_ZOPC     (unsigned long)(0xe7L << 40 | 0xf3L << 0)   // V1 := V2 + V3, element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1197
#define VACC_ZOPC   (unsigned long)(0xe7L << 40 | 0xf1L << 0)   // V1 := carry(V2 + V3), element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1198
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1199
// SUB
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1200
#define VS_ZOPC     (unsigned long)(0xe7L << 40 | 0xf7L << 0)   // V1 := V2 - V3, element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1201
#define VSCBI_ZOPC  (unsigned long)(0xe7L << 40 | 0xf5L << 0)   // V1 := borrow(V2 - V3), element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1202
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1203
// MUL
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1204
#define VML_ZOPC    (unsigned long)(0xe7L << 40 | 0xa2L << 0)   // V1 := V2 * V3, element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1205
#define VMH_ZOPC    (unsigned long)(0xe7L << 40 | 0xa3L << 0)   // V1 := V2 * V3, element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1206
#define VMLH_ZOPC   (unsigned long)(0xe7L << 40 | 0xa1L << 0)   // V1 := V2 * V3, element size = 2**m, unsigned
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1207
#define VME_ZOPC    (unsigned long)(0xe7L << 40 | 0xa6L << 0)   // V1 := V2 * V3, element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1208
#define VMLE_ZOPC   (unsigned long)(0xe7L << 40 | 0xa4L << 0)   // V1 := V2 * V3, element size = 2**m, unsigned
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1209
#define VMO_ZOPC    (unsigned long)(0xe7L << 40 | 0xa7L << 0)   // V1 := V2 * V3, element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1210
#define VMLO_ZOPC   (unsigned long)(0xe7L << 40 | 0xa5L << 0)   // V1 := V2 * V3, element size = 2**m, unsigned
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1211
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1212
// MUL & ADD
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1213
#define VMAL_ZOPC   (unsigned long)(0xe7L << 40 | 0xaaL << 0)   // V1 := V2 * V3 + V4, element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1214
#define VMAH_ZOPC   (unsigned long)(0xe7L << 40 | 0xabL << 0)   // V1 := V2 * V3 + V4, element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1215
#define VMALH_ZOPC  (unsigned long)(0xe7L << 40 | 0xa9L << 0)   // V1 := V2 * V3 + V4, element size = 2**m, unsigned
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1216
#define VMAE_ZOPC   (unsigned long)(0xe7L << 40 | 0xaeL << 0)   // V1 := V2 * V3 + V4, element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1217
#define VMALE_ZOPC  (unsigned long)(0xe7L << 40 | 0xacL << 0)   // V1 := V2 * V3 + V4, element size = 2**m, unsigned
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1218
#define VMAO_ZOPC   (unsigned long)(0xe7L << 40 | 0xafL << 0)   // V1 := V2 * V3 + V4, element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1219
#define VMALO_ZOPC  (unsigned long)(0xe7L << 40 | 0xadL << 0)   // V1 := V2 * V3 + V4, element size = 2**m, unsigned
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1220
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1221
// Vector SUM
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1222
#define VSUM_ZOPC   (unsigned long)(0xe7L << 40 | 0x64L << 0)   // V1[j] := toFW(sum(V2[i]) + V3[j]), subelements: byte or HW
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1223
#define VSUMG_ZOPC  (unsigned long)(0xe7L << 40 | 0x65L << 0)   // V1[j] := toDW(sum(V2[i]) + V3[j]), subelements: HW or FW
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1224
#define VSUMQ_ZOPC  (unsigned long)(0xe7L << 40 | 0x67L << 0)   // V1[j] := toQW(sum(V2[i]) + V3[j]), subelements: FW or DW
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1225
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1226
// Average
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1227
#define VAVG_ZOPC   (unsigned long)(0xe7L << 40 | 0xf2L << 0)   // V1 := (V2+V3+1)/2, signed,   element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1228
#define VAVGL_ZOPC  (unsigned long)(0xe7L << 40 | 0xf0L << 0)   // V1 := (V2+V3+1)/2, unsigned, element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1229
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1230
// VECTOR Galois Field Multiply Sum
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1231
#define VGFM_ZOPC   (unsigned long)(0xe7L << 40 | 0xb4L << 0)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1232
#define VGFMA_ZOPC  (unsigned long)(0xe7L << 40 | 0xbcL << 0)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1233
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1234
//---<  Vector Logical Instructions  >---
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1235
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1236
// AND
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1237
#define VN_ZOPC     (unsigned long)(0xe7L << 40 | 0x68L << 0)   // V1 := V2 & V3,  element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1238
#define VNC_ZOPC    (unsigned long)(0xe7L << 40 | 0x69L << 0)   // V1 := V2 & ~V3, element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1239
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1240
// XOR
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1241
#define VX_ZOPC     (unsigned long)(0xe7L << 40 | 0x6dL << 0)   // V1 := V2 ^ V3,  element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1242
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1243
// NOR
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1244
#define VNO_ZOPC    (unsigned long)(0xe7L << 40 | 0x6bL << 0)   // V1 := !(V2 | V3),  element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1245
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1246
// OR
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1247
#define VO_ZOPC     (unsigned long)(0xe7L << 40 | 0x6aL << 0)   // V1 := V2 | V3,  element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1248
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1249
// Comparison (element-wise)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1250
#define VCEQ_ZOPC   (unsigned long)(0xe7L << 40 | 0xf8L << 0)   // V1 := (V2 == V3) ? 0xffff : 0x0000, element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1251
#define VCH_ZOPC    (unsigned long)(0xe7L << 40 | 0xfbL << 0)   // V1 := (V2  > V3) ? 0xffff : 0x0000, element size = 2**m, signed
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1252
#define VCHL_ZOPC   (unsigned long)(0xe7L << 40 | 0xf9L << 0)   // V1 := (V2  > V3) ? 0xffff : 0x0000, element size = 2**m, unsigned
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1253
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1254
// Max/Min (element-wise)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1255
#define VMX_ZOPC    (unsigned long)(0xe7L << 40 | 0xffL << 0)   // V1 := (V2 > V3) ? V2 : V3, element size = 2**m, signed
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1256
#define VMXL_ZOPC   (unsigned long)(0xe7L << 40 | 0xfdL << 0)   // V1 := (V2 > V3) ? V2 : V3, element size = 2**m, unsigned
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1257
#define VMN_ZOPC    (unsigned long)(0xe7L << 40 | 0xfeL << 0)   // V1 := (V2 < V3) ? V2 : V3, element size = 2**m, signed
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1258
#define VMNL_ZOPC   (unsigned long)(0xe7L << 40 | 0xfcL << 0)   // V1 := (V2 < V3) ? V2 : V3, element size = 2**m, unsigned
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1259
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1260
// Leading/Trailing Zeros, population count
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1261
#define VCLZ_ZOPC   (unsigned long)(0xe7L << 40 | 0x53L << 0)   // V1 := leadingzeros(V2),  element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1262
#define VCTZ_ZOPC   (unsigned long)(0xe7L << 40 | 0x52L << 0)   // V1 := trailingzeros(V2), element size = 2**m
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1263
#define VPOPCT_ZOPC (unsigned long)(0xe7L << 40 | 0x50L << 0)   // V1 := popcount(V2), bytewise!!
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1264
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1265
// Rotate/Shift
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1266
#define VERLLV_ZOPC (unsigned long)(0xe7L << 40 | 0x73L << 0)   // V1 := rotateleft(V2), rotate count in V3 element
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1267
#define VERLL_ZOPC  (unsigned long)(0xe7L << 40 | 0x33L << 0)   // V1 := rotateleft(V3), rotate count from d2(b2).
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1268
#define VERIM_ZOPC  (unsigned long)(0xe7L << 40 | 0x72L << 0)   // Rotate then insert under mask. Read Principles of Operation!!
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1269
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1270
#define VESLV_ZOPC  (unsigned long)(0xe7L << 40 | 0x70L << 0)   // V1 := SLL(V2, V3), unsigned, element-wise
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1271
#define VESL_ZOPC   (unsigned long)(0xe7L << 40 | 0x30L << 0)   // V1 := SLL(V3), unsigned, shift count from d2(b2).
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1272
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1273
#define VESRAV_ZOPC (unsigned long)(0xe7L << 40 | 0x7AL << 0)   // V1 := SRA(V2, V3), signed, element-wise
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1274
#define VESRA_ZOPC  (unsigned long)(0xe7L << 40 | 0x3AL << 0)   // V1 := SRA(V3), signed, shift count from d2(b2).
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1275
#define VESRLV_ZOPC (unsigned long)(0xe7L << 40 | 0x78L << 0)   // V1 := SRL(V2, V3), unsigned, element-wise
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1276
#define VESRL_ZOPC  (unsigned long)(0xe7L << 40 | 0x38L << 0)   // V1 := SRL(V3), unsigned, shift count from d2(b2).
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1277
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1278
#define VSL_ZOPC    (unsigned long)(0xe7L << 40 | 0x74L << 0)   // V1 := SLL(V2), unsigned, bit-count
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1279
#define VSLB_ZOPC   (unsigned long)(0xe7L << 40 | 0x75L << 0)   // V1 := SLL(V2), unsigned, byte-count
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1280
#define VSLDB_ZOPC  (unsigned long)(0xe7L << 40 | 0x77L << 0)   // V1 := SLL((V2,V3)), unsigned, byte-count
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1281
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1282
#define VSRA_ZOPC   (unsigned long)(0xe7L << 40 | 0x7eL << 0)   // V1 := SRA(V2), signed, bit-count
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1283
#define VSRAB_ZOPC  (unsigned long)(0xe7L << 40 | 0x7fL << 0)   // V1 := SRA(V2), signed, byte-count
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1284
#define VSRL_ZOPC   (unsigned long)(0xe7L << 40 | 0x7cL << 0)   // V1 := SRL(V2), unsigned, bit-count
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1285
#define VSRLB_ZOPC  (unsigned long)(0xe7L << 40 | 0x7dL << 0)   // V1 := SRL(V2), unsigned, byte-count
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1286
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1287
// Test under Mask
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1288
#define VTM_ZOPC    (unsigned long)(0xe7L << 40 | 0xd8L << 0)   // Like TM, set CC according to state of selected bits.
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1289
47585
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1290
//---<  Vector String Instructions  >---
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1291
#define VFAE_ZOPC   (unsigned long)(0xe7L << 40 | 0x82L << 0)   // Find any element
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1292
#define VFEE_ZOPC   (unsigned long)(0xe7L << 40 | 0x80L << 0)   // Find element equal
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1293
#define VFENE_ZOPC  (unsigned long)(0xe7L << 40 | 0x81L << 0)   // Find element not equal
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1294
#define VSTRC_ZOPC  (unsigned long)(0xe7L << 40 | 0x8aL << 0)   // String range compare
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1295
#define VISTR_ZOPC  (unsigned long)(0xe7L << 40 | 0x5cL << 0)   // Isolate String
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1296
47531
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1297
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1298
//--------------------------------
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1299
//--  Miscellaneous Operations  --
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1300
//--------------------------------
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1301
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1302
// Execute
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1303
#define EX_ZOPC     (unsigned  int)(68L << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1304
#define EXRL_ZOPC   (unsigned long)(0xc6L << 40 | 0x00L << 32)  // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1305
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1306
// Compare and Swap
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1307
#define CS_ZOPC     (unsigned  int)(0xba << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1308
#define CSY_ZOPC    (unsigned long)(0xebL << 40 | 0x14L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1309
#define CSG_ZOPC    (unsigned long)(0xebL << 40 | 0x30L)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1310
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1311
// Interlocked-Update
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1312
#define LAA_ZOPC    (unsigned long)(0xebL << 40 | 0xf8L)         // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1313
#define LAAG_ZOPC   (unsigned long)(0xebL << 40 | 0xe8L)         // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1314
#define LAAL_ZOPC   (unsigned long)(0xebL << 40 | 0xfaL)         // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1315
#define LAALG_ZOPC  (unsigned long)(0xebL << 40 | 0xeaL)         // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1316
#define LAN_ZOPC    (unsigned long)(0xebL << 40 | 0xf4L)         // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1317
#define LANG_ZOPC   (unsigned long)(0xebL << 40 | 0xe4L)         // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1318
#define LAX_ZOPC    (unsigned long)(0xebL << 40 | 0xf7L)         // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1319
#define LAXG_ZOPC   (unsigned long)(0xebL << 40 | 0xe7L)         // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1320
#define LAO_ZOPC    (unsigned long)(0xebL << 40 | 0xf6L)         // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1321
#define LAOG_ZOPC   (unsigned long)(0xebL << 40 | 0xe6L)         // z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1322
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1323
// System Functions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1324
#define STCKF_ZOPC  (unsigned  int)(0xb2 << 24 | 0x7c << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1325
#define STFLE_ZOPC  (unsigned  int)(0xb2 << 24 | 0xb0 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1326
#define ECTG_ZOPC   (unsigned long)(0xc8L <<40 | 0x01L << 32)    // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1327
#define ECAG_ZOPC   (unsigned long)(0xebL <<40 | 0x4cL)          // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1328
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1329
// Execution Prediction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1330
#define PFD_ZOPC    (unsigned long)(0xe3L <<40 | 0x36L)          // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1331
#define PFDRL_ZOPC  (unsigned long)(0xc6L <<40 | 0x02L << 32)    // z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1332
#define BPP_ZOPC    (unsigned long)(0xc7L <<40)                  // branch prediction preload  -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1333
#define BPRP_ZOPC   (unsigned long)(0xc5L <<40)                  // branch prediction preload  -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1334
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1335
// Transaction Control
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1336
#define TBEGIN_ZOPC  (unsigned long)(0xe560L << 32)              // tx begin                   -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1337
#define TBEGINC_ZOPC (unsigned long)(0xe561L << 32)              // tx begin (constrained)     -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1338
#define TEND_ZOPC    (unsigned  int)(0xb2f8  << 16)              // tx end                     -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1339
#define TABORT_ZOPC  (unsigned  int)(0xb2fc  << 16)              // tx abort                   -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1340
#define ETND_ZOPC    (unsigned  int)(0xb2ec  << 16)              // tx nesting depth           -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1341
#define PPA_ZOPC     (unsigned  int)(0xb2e8  << 16)              // tx processor assist        -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1342
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1343
// Crypto and Checksum
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1344
#define CKSM_ZOPC   (unsigned  int)(0xb2 << 24 | 0x41 << 16)     // checksum. This is NOT CRC32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1345
#define KM_ZOPC     (unsigned  int)(0xb9 << 24 | 0x2e << 16)     // cipher
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1346
#define KMC_ZOPC    (unsigned  int)(0xb9 << 24 | 0x2f << 16)     // cipher
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1347
#define KIMD_ZOPC   (unsigned  int)(0xb9 << 24 | 0x3e << 16)     // SHA (msg digest)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1348
#define KLMD_ZOPC   (unsigned  int)(0xb9 << 24 | 0x3f << 16)     // SHA (msg digest)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1349
#define KMAC_ZOPC   (unsigned  int)(0xb9 << 24 | 0x1e << 16)     // Message Authentication Code
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1350
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1351
// Various
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1352
#define TCEB_ZOPC   (unsigned long)(237L << 40 | 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1353
#define TCDB_ZOPC   (unsigned long)(237L << 40 | 17)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1354
#define TAM_ZOPC    (unsigned long)(267)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1355
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1356
#define FLOGR_ZOPC  (unsigned  int)(0xb9 << 24 | 0x83 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1357
#define POPCNT_ZOPC (unsigned  int)(0xb9e1 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1358
#define AHHHR_ZOPC  (unsigned  int)(0xb9c8 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1359
#define AHHLR_ZOPC  (unsigned  int)(0xb9d8 << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1360
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1361
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1362
// OpCode field masks
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1363
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1364
#define RI_MASK     (unsigned  int)(0xff  << 24 | 0x0f << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1365
#define RRE_MASK    (unsigned  int)(0xff  << 24 | 0xff << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1366
#define RSI_MASK    (unsigned  int)(0xff  << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1367
#define RIE_MASK    (unsigned long)(0xffL << 40 | 0xffL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1368
#define RIL_MASK    (unsigned long)(0xffL << 40 | 0x0fL << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1369
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1370
#define BASR_MASK   (unsigned  int)(0xff << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1371
#define BCR_MASK    (unsigned  int)(0xff << 8)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1372
#define BRC_MASK    (unsigned  int)(0xff << 24 | 0x0f << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1373
#define LGHI_MASK   (unsigned  int)(0xff << 24 | 0x0f << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1374
#define LLI_MASK    (unsigned  int)(0xff << 24 | 0x0f << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1375
#define II_MASK     (unsigned  int)(0xff << 24 | 0x0f << 16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1376
#define LLIF_MASK   (unsigned long)(0xffL << 40 | 0x0fL << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1377
#define IIF_MASK    (unsigned long)(0xffL << 40 | 0x0fL << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1378
#define BRASL_MASK  (unsigned long)(0xffL << 40 | 0x0fL << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1379
#define TM_MASK     (unsigned  int)(0xff << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1380
#define TMY_MASK    (unsigned long)(0xffL << 40 | 0xffL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1381
#define LB_MASK     (unsigned long)(0xffL << 40 | 0xffL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1382
#define LH_MASK     (unsigned int)(0xff << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1383
#define L_MASK      (unsigned int)(0xff << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1384
#define LY_MASK     (unsigned long)(0xffL << 40 | 0xffL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1385
#define LG_MASK     (unsigned long)(0xffL << 40 | 0xffL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1386
#define LLGH_MASK   (unsigned long)(0xffL << 40 | 0xffL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1387
#define LLGF_MASK   (unsigned long)(0xffL << 40 | 0xffL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1388
#define SLAG_MASK   (unsigned long)(0xffL << 40 | 0xffL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1389
#define LARL_MASK   (unsigned long)(0xff0fL << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1390
#define LGRL_MASK   (unsigned long)(0xff0fL << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1391
#define LE_MASK     (unsigned int)(0xff << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1392
#define LD_MASK     (unsigned int)(0xff << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1393
#define ST_MASK     (unsigned int)(0xff << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1394
#define STC_MASK    (unsigned int)(0xff << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1395
#define STG_MASK    (unsigned long)(0xffL << 40 | 0xffL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1396
#define STH_MASK    (unsigned int)(0xff << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1397
#define STE_MASK    (unsigned int)(0xff << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1398
#define STD_MASK    (unsigned int)(0xff << 24)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1399
#define CMPBRANCH_MASK (unsigned long)(0xffL << 40 | 0xffL)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1400
#define REL_LONG_MASK  (unsigned long)(0xff0fL << 32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1401
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1402
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1403
  // Condition code masks. Details:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1404
  // - Mask bit#3 must be zero for all compare and branch/trap instructions to ensure
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1405
  //   future compatibility.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1406
  // - For all arithmetic instructions which set the condition code, mask bit#3
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1407
  //   indicates overflow ("unordered" in float operations).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1408
  // - "unordered" float comparison results have to be treated as low.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1409
  // - When overflow/unordered is detected, none of the branch conditions is true,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1410
  //   except for bcondOverflow/bcondNotOrdered and bcondAlways.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1411
  // - For INT comparisons, the inverse condition can be calculated as (14-cond).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1412
  // - For FLOAT comparisons, the inverse condition can be calculated as (15-cond).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1413
  enum branch_condition {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1414
    bcondNever       =  0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1415
    bcondAlways      = 15,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1416
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1417
    // Specific names. Make use of lightweight sync.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1418
    // Full and lightweight sync operation.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1419
    bcondFullSync    = 15,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1420
    bcondLightSync   = 14,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1421
    bcondNop         =  0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1422
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1423
    // arithmetic compare instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1424
    // arithmetic load and test, insert instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1425
    // Mask bit#3 must be zero for future compatibility.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1426
    bcondEqual       =  8,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1427
    bcondNotEqual    =  6,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1428
    bcondLow         =  4,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1429
    bcondNotLow      = 10,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1430
    bcondHigh        =  2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1431
    bcondNotHigh     = 12,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1432
    // arithmetic calculation instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1433
    // Mask bit#3 indicates overflow if detected by instr.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1434
    // Mask bit#3 = 0 (overflow is not handled by compiler).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1435
    bcondOverflow    =  1,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1436
    bcondNotOverflow = 14,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1437
    bcondZero        =  bcondEqual,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1438
    bcondNotZero     =  bcondNotEqual,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1439
    bcondNegative    =  bcondLow,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1440
    bcondNotNegative =  bcondNotLow,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1441
    bcondPositive    =  bcondHigh,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1442
    bcondNotPositive =  bcondNotHigh,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1443
    bcondNotOrdered  =  1,  // float comparisons
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1444
    bcondOrdered     = 14,  // float comparisons
51966
2a2a78bd1fc3 8211145: [ppc] [s390]: Build fails due to -Werror=switch (introduced with JDK-8211029)
lucy
parents: 50423
diff changeset
  1445
    bcondLowOrNotOrdered  =  bcondLow  | bcondNotOrdered,  // float comparisons
2a2a78bd1fc3 8211145: [ppc] [s390]: Build fails due to -Werror=switch (introduced with JDK-8211029)
lucy
parents: 50423
diff changeset
  1446
    bcondHighOrNotOrdered =  bcondHigh | bcondNotOrdered,  // float comparisons
2a2a78bd1fc3 8211145: [ppc] [s390]: Build fails due to -Werror=switch (introduced with JDK-8211029)
lucy
parents: 50423
diff changeset
  1447
    bcondNotLowOrNotOrdered   =  bcondNotLow   | bcondNotOrdered,  // float comparisons
2a2a78bd1fc3 8211145: [ppc] [s390]: Build fails due to -Werror=switch (introduced with JDK-8211029)
lucy
parents: 50423
diff changeset
  1448
    bcondNotHighOrNotOrdered  =  bcondNotHigh  | bcondNotOrdered,  // float comparisons
2a2a78bd1fc3 8211145: [ppc] [s390]: Build fails due to -Werror=switch (introduced with JDK-8211029)
lucy
parents: 50423
diff changeset
  1449
    bcondNotEqualOrNotOrdered =  bcondNotEqual | bcondNotOrdered,  // float comparisons
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1450
    // unsigned arithmetic calculation instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1451
    // Mask bit#0 is not used by these instructions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1452
    // There is no indication of overflow for these instr.
47606
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47585
diff changeset
  1453
    bcondLogZero_NoCarry     =  8,
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47585
diff changeset
  1454
    bcondLogZero_Carry       =  2,
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47585
diff changeset
  1455
    // bcondLogZero_Borrow      =  8,  // This CC is never generated.
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47585
diff changeset
  1456
    bcondLogZero_NoBorrow    =  2,
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47585
diff changeset
  1457
    bcondLogZero             =  bcondLogZero_Carry | bcondLogZero_NoCarry,
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47585
diff changeset
  1458
    bcondLogNotZero_NoCarry  =  4,
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47585
diff changeset
  1459
    bcondLogNotZero_Carry    =  1,
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1460
    bcondLogNotZero_Borrow   =  4,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1461
    bcondLogNotZero_NoBorrow =  1,
47606
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47585
diff changeset
  1462
    bcondLogNotZero          =  bcondLogNotZero_Carry | bcondLogNotZero_NoCarry,
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47585
diff changeset
  1463
    bcondLogCarry            =  bcondLogZero_Carry | bcondLogNotZero_Carry,
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47585
diff changeset
  1464
    bcondLogBorrow           =  /* bcondLogZero_Borrow | */ bcondLogNotZero_Borrow,
48331
a8e39cc7b88f 8193443: [s390]: EncodeISOArray generates wrong vector code
lucy
parents: 48094
diff changeset
  1465
    // Vector compare instructions
a8e39cc7b88f 8193443: [s390]: EncodeISOArray generates wrong vector code
lucy
parents: 48094
diff changeset
  1466
    bcondVAlltrue    =  8,  // All  vector elements evaluate true
a8e39cc7b88f 8193443: [s390]: EncodeISOArray generates wrong vector code
lucy
parents: 48094
diff changeset
  1467
    bcondVMixed      =  4,  // Some vector elements evaluate true, some false
a8e39cc7b88f 8193443: [s390]: EncodeISOArray generates wrong vector code
lucy
parents: 48094
diff changeset
  1468
    bcondVAllfalse   =  1,  // All  vector elements evaluate false
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1469
    // string search instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1470
    bcondFound       =  4,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1471
    bcondNotFound    =  2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1472
    bcondInterrupted =  1,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1473
    // bit test instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1474
    bcondAllZero     =  8,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1475
    bcondMixed       =  6,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1476
    bcondAllOne      =  1,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1477
    bcondNotAllZero  =  7 // for tmll
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1478
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1479
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1480
  enum Condition {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1481
    // z/Architecture
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1482
    negative         = 0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1483
    less             = 0,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1484
    positive         = 1,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1485
    greater          = 1,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1486
    zero             = 2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1487
    equal            = 2,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1488
    summary_overflow = 3,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1489
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1490
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1491
  // Rounding mode for float-2-int conversions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1492
  enum RoundingMode {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1493
    current_mode      = 0,   // Mode taken from FPC register.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1494
    biased_to_nearest = 1,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1495
    to_nearest        = 4,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1496
    to_zero           = 5,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1497
    to_plus_infinity  = 6,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1498
    to_minus_infinity = 7
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1499
  };
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1500
47531
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1501
  // Vector Register Element Type.
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1502
  enum VRegElemType {
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1503
    VRET_BYTE   = 0,
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1504
    VRET_HW     = 1,
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1505
    VRET_FW     = 2,
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1506
    VRET_DW     = 3,
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1507
    VRET_QW     = 4
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1508
  };
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1509
47585
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1510
  // Vector Operation Result Control.
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1511
  //   This is a set of flags used in some vector instructions to control
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1512
  //   the result (side) effects of instruction execution.
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1513
  enum VOpRC {
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1514
    VOPRC_CCSET    = 0b0001, // set the CC.
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1515
    VOPRC_CCIGN    = 0b0000, // ignore, don't set CC.
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1516
    VOPRC_ZS       = 0b0010, // Zero Search. Additional, elementwise, comparison against zero.
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1517
    VOPRC_NOZS     = 0b0000, // No Zero Search.
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1518
    VOPRC_RTBYTEIX = 0b0100, // generate byte index to lowest element with true comparison.
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1519
    VOPRC_RTBITVEC = 0b0000, // generate bit vector, all 1s for true, all 0s for false element comparisons.
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1520
    VOPRC_INVERT   = 0b1000, // invert comparison results.
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1521
    VOPRC_NOINVERT = 0b0000  // use comparison results as is, do not invert.
47531
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1522
  };
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1523
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1524
  // Inverse condition code, i.e. determine "15 - cc" for a given condition code cc.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1525
  static branch_condition inverse_condition(branch_condition cc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1526
  static branch_condition inverse_float_condition(branch_condition cc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1527
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1528
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1529
  //-----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1530
  // instruction property getter methods
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1531
  //-----------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1532
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1533
  // Calculate length of instruction.
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 53244
diff changeset
  1534
  static unsigned int instr_len(unsigned char *instr);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1535
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1536
  // Longest instructions are 6 bytes on z/Architecture.
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 53244
diff changeset
  1537
  static unsigned int instr_maxlen() { return 6; }
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1538
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1539
  // Average instruction is 4 bytes on z/Architecture (just a guess).
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 53244
diff changeset
  1540
  static unsigned int instr_avglen() { return 4; }
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1541
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1542
  // Shortest instructions are 2 bytes on z/Architecture.
54960
e46fe26d7f77 8213084: Rework and enhance Print[Opto]Assembly output
lucy
parents: 53244
diff changeset
  1543
  static unsigned int instr_minlen() { return 2; }
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1544
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1545
  // Move instruction at pc right-justified into passed long int.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1546
  // Return instr len in bytes as function result.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1547
  static unsigned int get_instruction(unsigned char *pc, unsigned long *instr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1548
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1549
  // Move instruction in passed (long int) into storage at pc.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1550
  // This code is _NOT_ MT-safe!!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1551
  static void set_instruction(unsigned char *pc, unsigned long instr, unsigned int len) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1552
    memcpy(pc, ((unsigned char *)&instr)+sizeof(unsigned long)-len, len);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1553
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1554
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1555
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1556
  //------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1557
  // instruction field test methods
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1558
  //------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1559
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1560
  // Only used once in s390.ad to implement Matcher::is_short_branch_offset().
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1561
  static bool is_within_range_of_RelAddr16(address target, address origin) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1562
    return RelAddr::is_in_range_of_RelAddr16(target, origin);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1563
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1564
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1565
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1566
  //----------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1567
  // some diagnostic output
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1568
  //----------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1569
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1570
  static void print_dbg_msg(outputStream* out, unsigned long inst, const char* msg, int ilen) PRODUCT_RETURN;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1571
  static void dump_code_range(outputStream* out, address pc, const unsigned int range, const char* msg = " ") PRODUCT_RETURN;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1572
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1573
 protected:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1574
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1575
  //-------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1576
  // instruction field helper methods (internal)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1577
  //-------------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1578
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1579
  // Return a mask of 1s between hi_bit and lo_bit (inclusive).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1580
  static long fmask(unsigned int hi_bit, unsigned int lo_bit) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1581
    assert(hi_bit >= lo_bit && hi_bit < 48, "bad bits");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1582
    return ((1L<<(hi_bit-lo_bit+1)) - 1) << lo_bit;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1583
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1584
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1585
  // extract u_field
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1586
  // unsigned value
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1587
  static long inv_u_field(long x, int hi_bit, int lo_bit) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1588
    return (x & fmask(hi_bit, lo_bit)) >> lo_bit;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1589
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1590
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1591
  // extract s_field
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1592
  // Signed value, may need sign extension.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1593
  static long inv_s_field(long x, int hi_bit, int lo_bit) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1594
    x = inv_u_field(x, hi_bit, lo_bit);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1595
    // Highest extracted bit set -> sign extension.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1596
    return (x >= (1L<<(hi_bit-lo_bit)) ? x | ((-1L)<<(hi_bit-lo_bit)) : x);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1597
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1598
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1599
  // Extract primary opcode from instruction.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1600
  static int z_inv_op(int  x) { return inv_u_field(x, 31, 24); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1601
  static int z_inv_op(long x) { return inv_u_field(x, 47, 40); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1602
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1603
  static int inv_reg( long x, int s, int len) { return inv_u_field(x, (len-s)-1, (len-s)-4); }  // Regs are encoded in 4 bits.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1604
  static int inv_mask(long x, int s, int len) { return inv_u_field(x, (len-s)-1, (len-s)-8); }  // Mask is 8 bits long.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1605
  static int inv_simm16_48(long x) { return (inv_s_field(x, 31, 16)); }                         // 6-byte instructions only
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1606
  static int inv_simm16(long x)    { return (inv_s_field(x, 15,  0)); }                         // 4-byte instructions only
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1607
  static int inv_simm20(long x)    { return (inv_u_field(x, 27, 16) |                           // 6-byte instructions only
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1608
                                             inv_s_field(x, 15, 8)<<12); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1609
  static int inv_simm32(long x)    { return (inv_s_field(x, 31,  0)); }                         // 6-byte instructions only
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1610
  static int inv_uimm12(long x)    { return (inv_u_field(x, 11,  0)); }                         // 4-byte instructions only
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1611
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1612
  // Encode u_field from long value.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1613
  static long u_field(long x, int hi_bit, int lo_bit) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1614
    long r = x << lo_bit;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1615
    assert((r & ~fmask(hi_bit, lo_bit))   == 0, "value out of range");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1616
    assert(inv_u_field(r, hi_bit, lo_bit) == x, "just checking");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1617
    return r;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1618
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1619
47531
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1620
  static int64_t rsmask_48( Address a) { assert(a.is_RSform(),  "bad address format"); return rsmask_48( a.disp12(), a.base()); }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1621
  static int64_t rxmask_48( Address a) {      if (a.is_RXform())  { return rxmask_48( a.disp12(), a.index(), a.base()); }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1622
                                         else if (a.is_RSform())  { return rsmask_48( a.disp12(),            a.base()); }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1623
                                         else                     { guarantee(false, "bad address format");  return 0;  }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1624
                                       }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1625
  static int64_t rsymask_48(Address a) { assert(a.is_RSYform(), "bad address format"); return rsymask_48(a.disp20(), a.base()); }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1626
  static int64_t rxymask_48(Address a) {      if (a.is_RXYform()) { return rxymask_48( a.disp20(), a.index(), a.base()); }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1627
                                         else if (a.is_RSYform()) { return rsymask_48( a.disp20(),            a.base()); }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1628
                                         else                     { guarantee(false, "bad address format");  return 0;   }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1629
                                       }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1630
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1631
  static int64_t rsmask_48( int64_t d2, Register b2)              { return uimm12(d2, 20, 48)                   | regz(b2, 16, 48); }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1632
  static int64_t rxmask_48( int64_t d2, Register x2, Register b2) { return uimm12(d2, 20, 48) | reg(x2, 12, 48) | regz(b2, 16, 48); }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1633
  static int64_t rsymask_48(int64_t d2, Register b2)              { return simm20(d2)                           | regz(b2, 16, 48); }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1634
  static int64_t rxymask_48(int64_t d2, Register x2, Register b2) { return simm20(d2)         | reg(x2, 12, 48) | regz(b2, 16, 48); }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1635
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1636
  // Address calculated from d12(vx,b) - vx is vector index register.
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1637
  static int64_t rvmask_48( int64_t d2, VectorRegister x2, Register b2) { return uimm12(d2, 20, 48) | vreg(x2, 12) | regz(b2, 16, 48); }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1638
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1639
  static int64_t vreg_mask(VectorRegister v, int pos) {
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1640
    return vreg(v, pos) | v->RXB_mask(pos);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1641
  }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1642
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1643
  // Vector Element Size Control. 4-bit field which indicates the size of the vector elements.
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1644
  static int64_t vesc_mask(int64_t size, int min_size, int max_size, int pos) {
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1645
    // min_size - minimum element size. Not all instructions support element sizes beginning with "byte".
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1646
    // max_size - maximum element size. Not all instructions support element sizes up to "QW".
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1647
    assert((min_size <= size) && (size <= max_size), "element size control out of range");
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1648
    return uimm4(size, pos, 48);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1649
  }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1650
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1651
  // Vector Element IndeX. 4-bit field which indexes the target vector element.
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1652
  static int64_t veix_mask(int64_t ix, int el_size, int pos) {
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1653
    // el_size - size of the vector element. This is a VRegElemType enum value.
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1654
    // ix      - vector element index.
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1655
    int max_ix = -1;
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1656
    switch (el_size) {
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1657
      case VRET_BYTE: max_ix = 15; break;
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1658
      case VRET_HW:   max_ix =  7; break;
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1659
      case VRET_FW:   max_ix =  3; break;
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1660
      case VRET_DW:   max_ix =  1; break;
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1661
      case VRET_QW:   max_ix =  0; break;
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1662
      default:        guarantee(false, "bad vector element size %d", el_size); break;
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1663
    }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1664
    assert((0 <= ix) && (ix <= max_ix), "element size out of range (0 <= %ld <= %d)", ix, max_ix);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1665
    return uimm4(ix, pos, 48);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1666
  }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1667
47585
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1668
  // Vector Operation Result Control. 4-bit field.
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1669
  static int64_t voprc_any(int64_t flags, int pos, int64_t allowed_flags = 0b1111) {
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1670
    assert((flags & allowed_flags) == flags, "Invalid VOPRC_* flag combination: %d", (int)flags);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1671
    return uimm4(flags, pos, 48);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1672
  }
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1673
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1674
  // Vector Operation Result Control. Condition code setting.
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1675
  static int64_t voprc_ccmask(int64_t flags, int pos) {
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  1676
    return voprc_any(flags, pos, VOPRC_CCIGN | VOPRC_CCSET);
47531
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1677
  }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1678
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1679
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1680
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1681
  //--------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1682
  // instruction field construction methods
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1683
  //--------------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1684
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1685
  // Compute relative address (32 bit) for branch.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1686
  // Only used once in nativeInst_s390.cpp.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1687
  static intptr_t z_pcrel_off(address dest, address pc) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1688
    return RelAddr::pcrel_off32(dest, pc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1689
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1690
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1691
  // Extract 20-bit signed displacement.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1692
  // Only used in disassembler_s390.cpp for temp enhancements.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1693
  static int inv_simm20_xx(address iLoc) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1694
    unsigned long instr = 0;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1695
    unsigned long iLen  = get_instruction(iLoc, &instr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1696
    return inv_simm20(instr);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1697
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1698
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1699
  // unsigned immediate, in low bits, nbits long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1700
  static long uimm(long x, int nbits) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1701
    assert(Immediate::is_uimm(x, nbits), "unsigned constant out of range");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1702
    return x & fmask(nbits - 1, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1703
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1704
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1705
  // Cast '1' to long to avoid sign extension if nbits = 32.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1706
  // signed immediate, in low bits, nbits long
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1707
  static long simm(long x, int nbits) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1708
    assert(Immediate::is_simm(x, nbits), "value out of range");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1709
    return x & fmask(nbits - 1, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1710
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1711
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1712
  static long imm(int64_t x, int nbits) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1713
    // Assert that x can be represented with nbits bits ignoring the sign bits,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1714
    // i.e. the more higher bits should all be 0 or 1.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1715
    assert((x >> nbits) == 0 || (x >> nbits) == -1, "value out of range");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1716
    return x & fmask(nbits-1, 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1717
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1718
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1719
  // A 20-bit displacement is only in instructions of the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1720
  // RSY, RXY, or SIY format. In these instructions, the D
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1721
  // field consists of a DL (low) field in bit positions 20-31
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1722
  // and of a DH (high) field in bit positions 32-39. The
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1723
  // value of the displacement is formed by appending the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1724
  // contents of the DH field to the left of the contents of
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1725
  // the DL field.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1726
  static long simm20(int64_t ui20) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1727
    assert(Immediate::is_simm(ui20, 20), "value out of range");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1728
    return ( ((ui20        & 0xfffL) << (48-32)) |  // DL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1729
            (((ui20 >> 12) &  0xffL) << (48-40)));  // DH
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1730
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1731
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1732
  static long reg(Register r, int s, int len)  { return u_field(r->encoding(), (len-s)-1, (len-s)-4); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1733
  static long reg(int r, int s, int len)       { return u_field(r,             (len-s)-1, (len-s)-4); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1734
  static long regt(Register r, int s, int len) { return reg(r, s, len); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1735
  static long regz(Register r, int s, int len) { assert(r != Z_R0, "cannot use register R0 in memory access"); return reg(r, s, len); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1736
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1737
  static long uimm4( int64_t ui4,  int s, int len) { return uimm(ui4,   4) << (len-s-4);  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1738
  static long uimm6( int64_t ui6,  int s, int len) { return uimm(ui6,   6) << (len-s-6);  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1739
  static long uimm8( int64_t ui8,  int s, int len) { return uimm(ui8,   8) << (len-s-8);  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1740
  static long uimm12(int64_t ui12, int s, int len) { return uimm(ui12, 12) << (len-s-12); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1741
  static long uimm16(int64_t ui16, int s, int len) { return uimm(ui16, 16) << (len-s-16); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1742
  static long uimm32(int64_t ui32, int s, int len) { return uimm((unsigned)ui32, 32) << (len-s-32); } // prevent sign extension
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1743
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1744
  static long simm8( int64_t si8,  int s, int len) { return simm(si8,   8) << (len-s-8);  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1745
  static long simm12(int64_t si12, int s, int len) { return simm(si12, 12) << (len-s-12); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1746
  static long simm16(int64_t si16, int s, int len) { return simm(si16, 16) << (len-s-16); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1747
  static long simm24(int64_t si24, int s, int len) { return simm(si24, 24) << (len-s-24); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1748
  static long simm32(int64_t si32, int s, int len) { return simm(si32, 32) << (len-s-32); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1749
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1750
  static long imm8( int64_t i8,  int s, int len)   { return imm(i8,   8) << (len-s-8);  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1751
  static long imm12(int64_t i12, int s, int len)   { return imm(i12, 12) << (len-s-12); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1752
  static long imm16(int64_t i16, int s, int len)   { return imm(i16, 16) << (len-s-16); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1753
  static long imm24(int64_t i24, int s, int len)   { return imm(i24, 24) << (len-s-24); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1754
  static long imm32(int64_t i32, int s, int len)   { return imm(i32, 32) << (len-s-32); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1755
47531
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1756
  static long vreg(VectorRegister v, int pos)      { const int len = 48; return u_field(v->encoding()&0x0f, (len-pos)-1, (len-pos)-4) | v->RXB_mask(pos); }
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  1757
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1758
  static long fregt(FloatRegister r, int s, int len) { return freg(r,s,len); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1759
  static long freg( FloatRegister r, int s, int len) { return u_field(r->encoding(), (len-s)-1, (len-s)-4); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1760
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1761
  // Rounding mode for float-2-int conversions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1762
  static long rounding_mode(RoundingMode m, int s, int len) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1763
    assert(m != 2 && m != 3, "invalid mode");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1764
    return uimm(m, 4) << (len-s-4);
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
  //--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1768
  // instruction field getter methods
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1769
  //--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1770
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1771
  static int get_imm32(address a, int instruction_number) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1772
    int imm;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1773
    int *p =((int *)(a + 2 + 6 * instruction_number));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1774
    imm = *p;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1775
    return imm;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1776
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1777
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1778
  static short get_imm16(address a, int instruction_number) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1779
    short imm;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1780
    short *p =((short *)a) + 2 * instruction_number + 1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1781
    imm = *p;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1782
    return imm;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1783
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1784
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
  // instruction field setter methods
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1788
  //--------------------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1789
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1790
  static void set_imm32(address a, int64_t s) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1791
    assert(Immediate::is_simm32(s) || Immediate::is_uimm32(s), "to big");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1792
    int* p = (int *) (a + 2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1793
    *p = s;
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
  static void set_imm16(int* instr, int64_t s) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1797
    assert(Immediate::is_simm16(s) || Immediate::is_uimm16(s), "to big");
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1798
    short* p = ((short *)instr) + 1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1799
    *p = s;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1800
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1801
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1802
 public:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1803
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1804
  static unsigned int align(unsigned int x, unsigned int a) { return ((x + (a - 1)) & ~(a - 1)); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1805
  static bool    is_aligned(unsigned int x, unsigned int a) { return (0 == x % a); }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1806
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1807
  inline void emit_16(int x);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1808
  inline void emit_32(int x);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1809
  inline void emit_48(long x);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1810
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1811
  // Compare and control flow instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1812
  // =====================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1813
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1814
  // See also commodity routines compare64_and_branch(), compare32_and_branch().
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1815
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1816
  // compare instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1817
  // compare register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1818
  inline void z_cr(  Register r1, Register r2);                          // compare (r1, r2)        ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1819
  inline void z_cgr( Register r1, Register r2);                          // compare (r1, r2)        ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1820
  inline void z_cgfr(Register r1, Register r2);                          // compare (r1, r2)        ; int64 <--> int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1821
   // compare immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1822
  inline void z_chi( Register r1, int64_t i2);                           // compare (r1, i2_imm16)  ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1823
  inline void z_cfi( Register r1, int64_t i2);                           // compare (r1, i2_imm32)  ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1824
  inline void z_cghi(Register r1, int64_t i2);                           // compare (r1, i2_imm16)  ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1825
  inline void z_cgfi(Register r1, int64_t i2);                           // compare (r1, i2_imm32)  ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1826
   // compare memory
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1827
  inline void z_ch(  Register r1, const Address &a);                     // compare (r1, *(a))               ; int32 <--> int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1828
  inline void z_ch(  Register r1, int64_t d2, Register x2, Register b2); // compare (r1, *(d2_uimm12+x2+b2)) ; int32 <--> int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1829
  inline void z_c(   Register r1, const Address &a);                     // compare (r1, *(a))               ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1830
  inline void z_c(   Register r1, int64_t d2, Register x2, Register b2); // compare (r1, *(d2_uimm12+x2+b2)) ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1831
  inline void z_cy(  Register r1, int64_t d2, Register x2, Register b2); // compare (r1, *(d2_uimm20+x2+b2)) ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1832
  inline void z_cy(  Register r1, int64_t d2, Register b2);              // compare (r1, *(d2_uimm20+x2+b2)) ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1833
  inline void z_cy(  Register r1, const Address& a);                     // compare (r1, *(a))               ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1834
   //inline void z_cgf(Register r1,const Address &a);                    // compare (r1, *(a))               ; int64 <--> int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1835
   //inline void z_cgf(Register r1,int64_t d2, Register x2, Register b2);// compare (r1, *(d2_uimm12+x2+b2)) ; int64 <--> int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1836
  inline void z_cg(  Register r1, const Address &a);                     // compare (r1, *(a))               ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1837
  inline void z_cg(  Register r1, int64_t d2, Register x2, Register b2); // compare (r1, *(d2_imm20+x2+b2))  ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1838
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1839
   // compare logical instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1840
   // compare register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1841
  inline void z_clr(  Register r1, Register r2);                         // compare (r1, r2)                 ; uint32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1842
  inline void z_clgr( Register r1, Register r2);                         // compare (r1, r2)                 ; uint64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1843
   // compare immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1844
  inline void z_clfi( Register r1, int64_t i2);                          // compare (r1, i2_uimm32)          ; uint32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1845
  inline void z_clgfi(Register r1, int64_t i2);                          // compare (r1, i2_uimm32)          ; uint64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1846
  inline void z_cl(   Register r1, const Address &a);                    // compare (r1, *(a)                ; uint32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1847
  inline void z_cl(   Register r1, int64_t d2, Register x2, Register b2);// compare (r1, *(d2_uimm12+x2+b2)  ; uint32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1848
  inline void z_cly(  Register r1, int64_t d2, Register x2, Register b2);// compare (r1, *(d2_uimm20+x2+b2)) ; uint32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1849
  inline void z_cly(  Register r1, int64_t d2, Register b2);             // compare (r1, *(d2_uimm20+x2+b2)) ; uint32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1850
  inline void z_cly(  Register r1, const Address& a);                    // compare (r1, *(a))               ; uint32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1851
  inline void z_clg(  Register r1, const Address &a);                    // compare (r1, *(a)                ; uint64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1852
  inline void z_clg(  Register r1, int64_t d2, Register x2, Register b2);// compare (r1, *(d2_imm20+x2+b2)   ; uint64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1853
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1854
  // test under mask
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1855
  inline void z_tmll(Register r1, int64_t i2);           // test under mask, see docu
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1856
  inline void z_tmlh(Register r1, int64_t i2);           // test under mask, see docu
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1857
  inline void z_tmhl(Register r1, int64_t i2);           // test under mask, see docu
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1858
  inline void z_tmhh(Register r1, int64_t i2);           // test under mask, see docu
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1859
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1860
  // branch instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1861
  inline void z_bc(  branch_condition m1, int64_t d2, Register x2, Register b2);// branch  m1 ? pc = (d2_uimm12+x2+b2)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1862
  inline void z_bcr( branch_condition m1, Register r2);                         // branch (m1 && r2!=R0) ? pc = r2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1863
  inline void z_brc( branch_condition i1, int64_t i2);                          // branch  i1 ? pc = pc + i2_imm16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1864
  inline void z_brc( branch_condition i1, address a);                           // branch  i1 ? pc = a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1865
  inline void z_brc( branch_condition i1, Label& L);                            // branch  i1 ? pc = Label
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1866
  //inline void z_brcl(branch_condition i1, int64_t i2);                        // branch  i1 ? pc = pc + i2_imm32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1867
  inline void z_brcl(branch_condition i1, address a);                           // branch  i1 ? pc = a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1868
  inline void z_brcl(branch_condition i1, Label& L);                            // branch  i1 ? pc = Label
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1869
  inline void z_bctgr(Register r1, Register r2);         // branch on count r1 -= 1; (r1!=0) ? pc = r2  ; r1 is int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1870
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1871
  // branch unconditional / always
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1872
  inline void z_br(Register r2);                         // branch to r2, nop if r2 == Z_R0
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
  // See also commodity routines compare64_and_branch(), compare32_and_branch().
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1876
  // signed comparison and branch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1877
  inline void z_crb( Register r1, Register r2, branch_condition m3, int64_t d4, Register b4); // (r1 m3 r2) ? goto b4+d4      ; int32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1878
  inline void z_cgrb(Register r1, Register r2, branch_condition m3, int64_t d4, Register b4); // (r1 m3 r2) ? goto b4+d4      ; int64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1879
  inline void z_crj( Register r1, Register r2, branch_condition m3, Label& L);                // (r1 m3 r2) ? goto L          ; int32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1880
  inline void z_crj( Register r1, Register r2, branch_condition m3, address a4);              // (r1 m3 r2) ? goto (pc+a4<<1) ; int32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1881
  inline void z_cgrj(Register r1, Register r2, branch_condition m3, Label& L);                // (r1 m3 r2) ? goto L          ; int64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1882
  inline void z_cgrj(Register r1, Register r2, branch_condition m3, address a4);              // (r1 m3 r2) ? goto (pc+a4<<1) ; int64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1883
  inline void z_cib( Register r1, int64_t i2, branch_condition m3, int64_t d4, Register b4);  // (r1 m3 i2_imm8) ? goto b4+d4      ; int32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1884
  inline void z_cgib(Register r1, int64_t i2, branch_condition m3, int64_t d4, Register b4);  // (r1 m3 i2_imm8) ? goto b4+d4      ; int64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1885
  inline void z_cij( Register r1, int64_t i2, branch_condition m3, Label& L);                 // (r1 m3 i2_imm8) ? goto L          ; int32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1886
  inline void z_cij( Register r1, int64_t i2, branch_condition m3, address a4);               // (r1 m3 i2_imm8) ? goto (pc+a4<<1) ; int32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1887
  inline void z_cgij(Register r1, int64_t i2, branch_condition m3, Label& L);                 // (r1 m3 i2_imm8) ? goto L          ; int64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1888
  inline void z_cgij(Register r1, int64_t i2, branch_condition m3, address a4);               // (r1 m3 i2_imm8) ? goto (pc+a4<<1) ; int64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1889
  // unsigned comparison and branch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1890
  inline void z_clrb( Register r1, Register r2, branch_condition m3, int64_t d4, Register b4);// (r1 m3 r2) ? goto b4+d4      ; uint32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1891
  inline void z_clgrb(Register r1, Register r2, branch_condition m3, int64_t d4, Register b4);// (r1 m3 r2) ? goto b4+d4      ; uint64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1892
  inline void z_clrj( Register r1, Register r2, branch_condition m3, Label& L);               // (r1 m3 r2) ? goto L          ; uint32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1893
  inline void z_clrj( Register r1, Register r2, branch_condition m3, address a4);             // (r1 m3 r2) ? goto (pc+a4<<1) ; uint32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1894
  inline void z_clgrj(Register r1, Register r2, branch_condition m3, Label& L);               // (r1 m3 r2) ? goto L          ; uint64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1895
  inline void z_clgrj(Register r1, Register r2, branch_condition m3, address a4);             // (r1 m3 r2) ? goto (pc+a4<<1) ; uint64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1896
  inline void z_clib( Register r1, int64_t i2, branch_condition m3, int64_t d4, Register b4); // (r1 m3 i2_uimm8) ? goto b4+d4      ; uint32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1897
  inline void z_clgib(Register r1, int64_t i2, branch_condition m3, int64_t d4, Register b4); // (r1 m3 i2_uimm8) ? goto b4+d4      ; uint64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1898
  inline void z_clij( Register r1, int64_t i2, branch_condition m3, Label& L);                // (r1 m3 i2_uimm8) ? goto L          ; uint32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1899
  inline void z_clij( Register r1, int64_t i2, branch_condition m3, address a4);              // (r1 m3 i2_uimm8) ? goto (pc+a4<<1) ; uint32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1900
  inline void z_clgij(Register r1, int64_t i2, branch_condition m3, Label& L);                // (r1 m3 i2_uimm8) ? goto L          ; uint64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1901
  inline void z_clgij(Register r1, int64_t i2, branch_condition m3, address a4);              // (r1 m3 i2_uimm8) ? goto (pc+a4<<1) ; uint64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1902
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1903
  // Compare and trap instructions.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1904
  // signed comparison
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1905
  inline void z_crt(Register r1,  Register r2, int64_t m3);  // (r1 m3 r2)        ? trap ; int32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1906
  inline void z_cgrt(Register r1, Register r2, int64_t m3);  // (r1 m3 r2)        ? trap ; int64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1907
  inline void z_cit(Register r1,  int64_t i2, int64_t m3);   // (r1 m3 i2_imm16)  ? trap ; int32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1908
  inline void z_cgit(Register r1, int64_t i2, int64_t m3);   // (r1 m3 i2_imm16)  ? trap ; int64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1909
  // unsigned comparison
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1910
  inline void z_clrt(Register r1,  Register r2, int64_t m3); // (r1 m3 r2)        ? trap ; uint32 -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1911
  inline void z_clgrt(Register r1, Register r2, int64_t m3); // (r1 m3 r2)        ? trap ; uint64 -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1912
  inline void z_clfit(Register r1,  int64_t i2, int64_t m3); // (r1 m3 i2_uimm16) ? trap ; uint32 -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1913
  inline void z_clgit(Register r1, int64_t i2, int64_t m3);  // (r1 m3 i2_uimm16) ? trap ; uint64 -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1914
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1915
  inline void z_illtrap();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1916
  inline void z_illtrap(int id);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1917
  inline void z_illtrap_eyecatcher(unsigned short xpattern, unsigned short pattern);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1918
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1919
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1920
  // load address, add for addresses
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1921
  // ===============================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1922
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1923
  // The versions without suffix z assert that the base reg is != Z_R0.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1924
  // Z_R0 is interpreted as constant '0'. The variants with Address operand
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1925
  // check this automatically, so no two versions are needed.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1926
  inline void z_layz(Register r1, int64_t d2, Register x2, Register b2); // Special version. Allows Z_R0 as base reg.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1927
  inline void z_lay(Register r1, const Address &a);                      // r1 = a
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1928
  inline void z_lay(Register r1, int64_t d2, Register x2, Register b2);  // r1 = d2_imm20+x2+b2
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1929
  inline void z_laz(Register r1, int64_t d2, Register x2, Register b2);  // Special version. Allows Z_R0 as base reg.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1930
  inline void z_la(Register r1, const Address &a);                       // r1 = a                ; unsigned immediate!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1931
  inline void z_la(Register r1, int64_t d2, Register x2, Register b2);   // r1 = d2_uimm12+x2+b2  ; unsigned immediate!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1932
  inline void z_larl(Register r1, int64_t i2);                           // r1 = pc + i2_imm32<<1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1933
  inline void z_larl(Register r1, address a2);                           // r1 = pc + i2_imm32<<1;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1934
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1935
  // Load instructions for integers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1936
  // ==============================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1937
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1938
  // Address as base + index + offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1939
  inline void z_lb( Register r1, const Address &a);                     // load r1 = *(a)              ; int32 <- int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1940
  inline void z_lb( Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int32 <- int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1941
  inline void z_lh( Register r1, const Address &a);                     // load r1 = *(a)              ; int32 <- int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1942
  inline void z_lh( Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_uimm12+x2+b2); int32 <- int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1943
  inline void z_lhy(Register r1, const Address &a);                     // load r1 = *(a)              ; int32 <- int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1944
  inline void z_lhy(Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int32 <- int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1945
  inline void z_l(  Register r1, const Address& a);                     // load r1 = *(a)              ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1946
  inline void z_l(  Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_uimm12+x2+b2); int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1947
  inline void z_ly( Register r1, const Address& a);                     // load r1 = *(a)              ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1948
  inline void z_ly( Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1949
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1950
  inline void z_lgb(Register r1, const Address &a);                     // load r1 = *(a)              ; int64 <- int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1951
  inline void z_lgb(Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int64 <- int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1952
  inline void z_lgh(Register r1, const Address &a);                     // load r1 = *(a)              ; int64 <- int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1953
  inline void z_lgh(Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm12+x2+b2) ; int64 <- int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1954
  inline void z_lgf(Register r1, const Address &a);                     // load r1 = *(a)              ; int64 <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1955
  inline void z_lgf(Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int64 <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1956
  inline void z_lg( Register r1, const Address& a);                     // load r1 = *(a)              ; int64 <- int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1957
  inline void z_lg( Register r1, int64_t d2, Register x2, Register b2); // load r1 = *(d2_imm20+x2+b2) ; int64 <- int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1958
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1959
  // load and test
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1960
  inline void z_lt(  Register r1, const Address &a);                    // load and test r1 = *(a)              ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1961
  inline void z_lt(  Register r1, int64_t d2, Register x2, Register b2);// load and test r1 = *(d2_imm20+x2+b2) ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1962
  inline void z_ltg( Register r1, const Address &a);                    // load and test r1 = *(a)              ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1963
  inline void z_ltg( Register r1, int64_t d2, Register x2, Register b2);// load and test r1 = *(d2_imm20+x2+b2) ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1964
  inline void z_ltgf(Register r1, const Address &a);                    // load and test r1 = *(a)              ; int64 <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1965
  inline void z_ltgf(Register r1, int64_t d2, Register x2, Register b2);// load and test r1 = *(d2_imm20+x2+b2) ; int64 <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1966
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1967
  // load unsigned integer - zero extended
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1968
  inline void z_llc( Register r1, const Address& a);                    // load r1 = *(a)              ; uint32 <- uint8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1969
  inline void z_llc( Register r1, int64_t d2, Register x2, Register b2);// load r1 = *(d2_imm20+x2+b2) ; uint32 <- uint8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1970
  inline void z_llh( Register r1, const Address& a);                    // load r1 = *(a)              ; uint32 <- uint16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1971
  inline void z_llh( Register r1, int64_t d2, Register x2, Register b2);// load r1 = *(d2_imm20+x2+b2) ; uint32 <- uint16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1972
  inline void z_llgc(Register r1, const Address& a);                    // load r1 = *(a)              ; uint64 <- uint8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1973
  inline void z_llgc(Register r1, int64_t d2, Register x2, Register b2);// load r1 = *(d2_imm20+x2+b2) ; uint64 <- uint8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1974
  inline void z_llgc( Register r1, int64_t d2, Register b2);            // load r1 = *(d2_imm20+b2)    ; uint64 <- uint8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1975
  inline void z_llgh(Register r1, const Address& a);                    // load r1 = *(a)              ; uint64 <- uint16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1976
  inline void z_llgh(Register r1, int64_t d2, Register x2, Register b2);// load r1 = *(d2_imm20+x2+b2) ; uint64 <- uint16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1977
  inline void z_llgf(Register r1, const Address& a);                    // load r1 = *(a)              ; uint64 <- uint32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1978
  inline void z_llgf(Register r1, int64_t d2, Register x2, Register b2);// load r1 = *(d2_imm20+x2+b2) ; uint64 <- uint32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1979
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1980
  // pc relative addressing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1981
  inline void z_lhrl( Register r1, int64_t i2);   // load r1 = *(pc + i2_imm32<<1) ; int32 <- int16    -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1982
  inline void z_lrl(  Register r1, int64_t i2);   // load r1 = *(pc + i2_imm32<<1) ; int32             -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1983
  inline void z_lghrl(Register r1, int64_t i2);   // load r1 = *(pc + i2_imm32<<1) ; int64 <- int16    -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1984
  inline void z_lgfrl(Register r1, int64_t i2);   // load r1 = *(pc + i2_imm32<<1) ; int64 <- int32    -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1985
  inline void z_lgrl( Register r1, int64_t i2);   // load r1 = *(pc + i2_imm32<<1) ; int64             -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1986
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1987
  inline void z_llhrl( Register r1, int64_t i2);  // load r1 = *(pc + i2_imm32<<1) ; uint32 <- uint16  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1988
  inline void z_llghrl(Register r1, int64_t i2);  // load r1 = *(pc + i2_imm32<<1) ; uint64 <- uint16  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1989
  inline void z_llgfrl(Register r1, int64_t i2);  // load r1 = *(pc + i2_imm32<<1) ; uint64 <- uint32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1990
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1991
  // Store instructions for integers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1992
  // ===============================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1993
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1994
  // Address as base + index + offset
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1995
  inline void z_stc( Register r1, const Address &d);                     // store *(a)               = r1  ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1996
  inline void z_stc( Register r1, int64_t d2, Register x2, Register b2); // store *(d2_uimm12+x2+b2) = r1  ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1997
  inline void z_stcy(Register r1, const Address &d);                     // store *(a)               = r1  ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1998
  inline void z_stcy(Register r1, int64_t d2, Register x2, Register b2); // store *(d2_imm20+x2+b2)  = r1  ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  1999
  inline void z_sth( Register r1, const Address &d);                     // store *(a)               = r1  ; int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2000
  inline void z_sth( Register r1, int64_t d2, Register x2, Register b2); // store *(d2_uimm12+x2+b2) = r1  ; int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2001
  inline void z_sthy(Register r1, const Address &d);                     // store *(a)               = r1  ; int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2002
  inline void z_sthy(Register r1, int64_t d2, Register x2, Register b2); // store *(d2_imm20+x2+b2)  = r1  ; int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2003
  inline void z_st(  Register r1, const Address &d);                     // store *(a)               = r1  ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2004
  inline void z_st(  Register r1, int64_t d2, Register x2, Register b2); // store *(d2_uimm12+x2+b2) = r1  ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2005
  inline void z_sty( Register r1, const Address &d);                     // store *(a)               = r1  ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2006
  inline void z_sty( Register r1, int64_t d2, Register x2, Register b2); // store *(d2_imm20+x2+b2)  = r1  ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2007
  inline void z_stg( Register r1, const Address &d);                     // store *(a)               = r1  ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2008
  inline void z_stg( Register r1, int64_t d2, Register x2, Register b2); // store *(d2_uimm12+x2+b2) = r1  ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2009
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2010
  inline void z_stcm( Register r1, int64_t m3, int64_t d2, Register b2); // store character under mask
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2011
  inline void z_stcmy(Register r1, int64_t m3, int64_t d2, Register b2); // store character under mask
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2012
  inline void z_stcmh(Register r1, int64_t m3, int64_t d2, Register b2); // store character under mask
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2013
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2014
  // pc relative addressing
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2015
  inline void z_sthrl(Register r1, int64_t i2);   // store *(pc + i2_imm32<<1) = r1 ; int16  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2016
  inline void z_strl( Register r1, int64_t i2);   // store *(pc + i2_imm32<<1) = r1 ; int32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2017
  inline void z_stgrl(Register r1, int64_t i2);   // store *(pc + i2_imm32<<1) = r1 ; int64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2018
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2019
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2020
  // Load and store immediates
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2021
  // =========================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2022
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2023
  // load immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2024
  inline void z_lhi( Register r1, int64_t i2);                  // r1 = i2_imm16    ; int32 <- int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2025
  inline void z_lghi(Register r1, int64_t i2);                  // r1 = i2_imm16    ; int64 <- int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2026
  inline void z_lgfi(Register r1, int64_t i2);                  // r1 = i2_imm32    ; int64 <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2027
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2028
  inline void z_llihf(Register r1, int64_t i2);                 // r1 = i2_imm32    ; uint64 <- (uint32<<32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2029
  inline void z_llilf(Register r1, int64_t i2);                 // r1 = i2_imm32    ; uint64 <- uint32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2030
  inline void z_llihh(Register r1, int64_t i2);                 // r1 = i2_imm16    ; uint64 <- (uint16<<48)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2031
  inline void z_llihl(Register r1, int64_t i2);                 // r1 = i2_imm16    ; uint64 <- (uint16<<32)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2032
  inline void z_llilh(Register r1, int64_t i2);                 // r1 = i2_imm16    ; uint64 <- (uint16<<16)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2033
  inline void z_llill(Register r1, int64_t i2);                 // r1 = i2_imm16    ; uint64 <- uint16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2034
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2035
  // insert immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2036
  inline void z_ic(  Register r1, int64_t d2, Register x2, Register b2); // insert character
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2037
  inline void z_icy( Register r1, int64_t d2, Register x2, Register b2); // insert character
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2038
  inline void z_icm( Register r1, int64_t m3, int64_t d2, Register b2);  // insert character under mask
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2039
  inline void z_icmy(Register r1, int64_t m3, int64_t d2, Register b2);  // insert character under mask
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2040
  inline void z_icmh(Register r1, int64_t m3, int64_t d2, Register b2);  // insert character under mask
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2041
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2042
  inline void z_iihh(Register r1, int64_t i2);                  // insert immediate  r1[ 0-15] = i2_imm16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2043
  inline void z_iihl(Register r1, int64_t i2);                  // insert immediate  r1[16-31] = i2_imm16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2044
  inline void z_iilh(Register r1, int64_t i2);                  // insert immediate  r1[32-47] = i2_imm16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2045
  inline void z_iill(Register r1, int64_t i2);                  // insert immediate  r1[48-63] = i2_imm16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2046
  inline void z_iihf(Register r1, int64_t i2);                  // insert immediate  r1[32-63] = i2_imm32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2047
  inline void z_iilf(Register r1, int64_t i2);                  // insert immediate  r1[ 0-31] = i2_imm32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2048
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2049
  // store immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2050
  inline void z_mvhhi(const Address &d, int64_t i2);            // store *(d)           = i2_imm16 ; int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2051
  inline void z_mvhhi(int64_t d1, Register b1, int64_t i2);     // store *(d1_imm12+b1) = i2_imm16 ; int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2052
  inline void z_mvhi( const Address &d, int64_t i2);            // store *(d)           = i2_imm16 ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2053
  inline void z_mvhi( int64_t d1, Register b1, int64_t i2);     // store *(d1_imm12+b1) = i2_imm16 ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2054
  inline void z_mvghi(const Address &d, int64_t i2);            // store *(d)           = i2_imm16 ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2055
  inline void z_mvghi(int64_t d1, Register b1, int64_t i2);     // store *(d1_imm12+b1) = i2_imm16 ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2056
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2057
  // Move and Convert instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2058
  // =============================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2059
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2060
  // move, sign extend
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2061
  inline void z_lbr(Register r1, Register r2);             // move r1 = r2 ; int32  <- int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2062
  inline void z_lhr( Register r1, Register r2);            // move r1 = r2 ; int32  <- int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2063
  inline void z_lr(Register r1, Register r2);              // move r1 = r2 ; int32, no sign extension
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2064
  inline void z_lgbr(Register r1, Register r2);            // move r1 = r2 ; int64  <- int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2065
  inline void z_lghr(Register r1, Register r2);            // move r1 = r2 ; int64  <- int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2066
  inline void z_lgfr(Register r1, Register r2);            // move r1 = r2 ; int64  <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2067
  inline void z_lgr(Register r1, Register r2);             // move r1 = r2 ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2068
  // move, zero extend
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2069
  inline void z_llhr( Register r1, Register r2);           // move r1 = r2 ; uint32 <- uint16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2070
  inline void z_llgcr(Register r1, Register r2);           // move r1 = r2 ; uint64 <- uint8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2071
  inline void z_llghr(Register r1, Register r2);           // move r1 = r2 ; uint64 <- uint16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2072
  inline void z_llgfr(Register r1, Register r2);           // move r1 = r2 ; uint64 <- uint32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2073
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2074
  // move and test register
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2075
  inline void z_ltr(Register r1, Register r2);             // load/move and test r1 = r2; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2076
  inline void z_ltgr(Register r1, Register r2);            // load/move and test r1 = r2; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2077
  inline void z_ltgfr(Register r1, Register r2);           // load/move and test r1 = r2; int64 <-- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2078
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2079
  // move and byte-reverse
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2080
  inline void z_lrvr( Register r1, Register r2);           // move and reverse byte order r1 = r2; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2081
  inline void z_lrvgr(Register r1, Register r2);           // move and reverse byte order r1 = r2; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2082
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2083
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2084
  // Arithmetic instructions (Integer only)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2085
  // ======================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2086
  // For float arithmetic instructions scroll further down
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2087
  // Add logical differs in the condition codes set!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2088
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2089
  // add registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2090
  inline void z_ar(   Register r1, Register r2);                      // add         r1 = r1 + r2  ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2091
  inline void z_agr(  Register r1, Register r2);                      // add         r1 = r1 + r2  ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2092
  inline void z_agfr( Register r1, Register r2);                      // add         r1 = r1 + r2  ; int64 <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2093
  inline void z_ark(  Register r1, Register r2, Register r3);         // add         r1 = r2 + r3  ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2094
  inline void z_agrk( Register r1, Register r2, Register r3);         // add         r1 = r2 + r3  ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2095
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2096
  inline void z_alr(  Register r1, Register r2);                      // add logical r1 = r1 + r2  ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2097
  inline void z_algr( Register r1, Register r2);                      // add logical r1 = r1 + r2  ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2098
  inline void z_algfr(Register r1, Register r2);                      // add logical r1 = r1 + r2  ; int64 <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2099
  inline void z_alrk( Register r1, Register r2, Register r3);         // add logical r1 = r2 + r3  ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2100
  inline void z_algrk(Register r1, Register r2, Register r3);         // add logical r1 = r2 + r3  ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2101
  inline void z_alcgr(Register r1, Register r2);                      // add logical with carry r1 = r1 + r2 + c  ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2102
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2103
  // add immediate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2104
  inline void z_ahi(  Register r1, int64_t i2);                       // add         r1 = r1 + i2_imm16 ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2105
  inline void z_afi(  Register r1, int64_t i2);                       // add         r1 = r1 + i2_imm32 ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2106
  inline void z_alfi( Register r1, int64_t i2);                       // add         r1 = r1 + i2_imm32 ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2107
  inline void z_aghi( Register r1, int64_t i2);                       // add logical r1 = r1 + i2_imm16 ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2108
  inline void z_agfi( Register r1, int64_t i2);                       // add         r1 = r1 + i2_imm32 ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2109
  inline void z_algfi(Register r1, int64_t i2);                       // add logical r1 = r1 + i2_imm32 ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2110
  inline void z_ahik( Register r1, Register r3, int64_t i2);          // add         r1 = r3 + i2_imm16 ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2111
  inline void z_aghik(Register r1, Register r3, int64_t i2);          // add         r1 = r3 + i2_imm16 ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2112
  inline void z_aih(  Register r1, int64_t i2);                       // add         r1 = r1 + i2_imm32 ; int32 (HiWord)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2113
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2114
  // add memory
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2115
  inline void z_a( Register r1, int64_t d2, Register x2, Register b2);  // add r1 = r1 + *(d2_uimm12+s2+b2) ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2116
  inline void z_ay(  Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+s2+b2)  ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2117
  inline void z_ag(  Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+s2+b2)  ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2118
  inline void z_agf( Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+x2+b2)  ; int64 <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2119
  inline void z_al(  Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_uimm12+x2+b2) ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2120
  inline void z_aly( Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+x2+b2)  ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2121
  inline void z_alg( Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+x2+b2)  ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2122
  inline void z_algf(Register r1, int64_t d2, Register x2, Register b2);// add r1 = r1 + *(d2_imm20+x2+b2)  ; int64 <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2123
  inline void z_a(   Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2124
  inline void z_ay(  Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2125
  inline void z_al(  Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2126
  inline void z_aly( Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2127
  inline void z_ag(  Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2128
  inline void z_agf( Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int64 <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2129
  inline void z_alg( Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2130
  inline void z_algf(Register r1, const Address& a);                  // add r1 = r1 + *(a)               ; int64 <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2131
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2132
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2133
  inline void z_alhsik( Register r1, Register r3, int64_t i2);    // add logical r1 = r3 + i2_imm16   ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2134
  inline void z_alghsik(Register r1, Register r3, int64_t i2);    // add logical r1 = r3 + i2_imm16   ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2135
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2136
  inline void z_asi(  int64_t d1, Register b1, int64_t i2);       // add           *(d1_imm20+b1) += i2_imm8 ; int32   -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2137
  inline void z_agsi( int64_t d1, Register b1, int64_t i2);       // add           *(d1_imm20+b1) += i2_imm8 ; int64   -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2138
  inline void z_alsi( int64_t d1, Register b1, int64_t i2);       // add logical   *(d1_imm20+b1) += i2_imm8 ; uint32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2139
  inline void z_algsi(int64_t d1, Register b1, int64_t i2);       // add logical   *(d1_imm20+b1) += i2_imm8 ; uint64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2140
  inline void z_asi(  const Address& d, int64_t i2);              // add           *(d) += i2_imm8           ; int32   -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2141
  inline void z_agsi( const Address& d, int64_t i2);              // add           *(d) += i2_imm8           ; int64   -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2142
  inline void z_alsi( const Address& d, int64_t i2);              // add logical   *(d) += i2_imm8           ; uint32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2143
  inline void z_algsi(const Address& d, int64_t i2);              // add logical   *(d) += i2_imm8           ; uint64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2144
47606
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47585
diff changeset
  2145
  // sign adjustment
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2146
  inline void z_lcr(  Register r1, Register r2 = noreg);              // neg r1 = -r2   ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2147
  inline void z_lcgr( Register r1, Register r2 = noreg);              // neg r1 = -r2   ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2148
  inline void z_lcgfr(Register r1, Register r2);                      // neg r1 = -r2   ; int64 <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2149
  inline void z_lnr(  Register r1, Register r2 = noreg);              // neg r1 = -|r2| ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2150
  inline void z_lngr( Register r1, Register r2 = noreg);              // neg r1 = -|r2| ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2151
  inline void z_lngfr(Register r1, Register r2);                      // neg r1 = -|r2| ; int64 <- int32
47606
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47585
diff changeset
  2152
  inline void z_lpr(  Register r1, Register r2 = noreg);              //     r1 =  |r2| ; int32
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47585
diff changeset
  2153
  inline void z_lpgr( Register r1, Register r2 = noreg);              //     r1 =  |r2| ; int64
660175b829e8 8187964: [s390][ppc]: Intrinsify Math.multiplyHigh(long, long)
lucy
parents: 47585
diff changeset
  2154
  inline void z_lpgfr(Register r1, Register r2);                      //     r1 =  |r2| ; int64 <- int32
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2155
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2156
  // subtract intstructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2157
  // sub registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2158
  inline void z_sr(   Register r1, Register r2);                      // sub         r1 = r1 - r2                ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2159
  inline void z_sgr(  Register r1, Register r2);                      // sub         r1 = r1 - r2                ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2160
  inline void z_sgfr( Register r1, Register r2);                      // sub         r1 = r1 - r2                ; int64 <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2161
  inline void z_srk(  Register r1, Register r2, Register r3);         // sub         r1 = r2 - r3                ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2162
  inline void z_sgrk( Register r1, Register r2, Register r3);         // sub         r1 = r2 - r3                ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2163
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2164
  inline void z_slr(  Register r1, Register r2);                      // sub logical r1 = r1 - r2                ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2165
  inline void z_slgr( Register r1, Register r2);                      // sub logical r1 = r1 - r2                ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2166
  inline void z_slgfr(Register r1, Register r2);                      // sub logical r1 = r1 - r2                ; int64 <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2167
  inline void z_slrk( Register r1, Register r2, Register r3);         // sub logical r1 = r2 - r3                ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2168
  inline void z_slgrk(Register r1, Register r2, Register r3);         // sub logical r1 = r2 - r3                ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2169
  inline void z_slfi( Register r1, int64_t i2);                       // sub logical r1 = r1 - i2_uimm32         ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2170
  inline void z_slgfi(Register r1, int64_t i2);                       // add logical r1 = r1 - i2_uimm32         ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2171
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2172
  // sub memory
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2173
  inline void z_s(   Register r1, int64_t d2, Register x2, Register b2);  // sub         r1 = r1 - *(d2_imm12+x2+b2) ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2174
  inline void z_sy(  Register r1, int64_t d2, Register x2, Register b2);  // sub         r1 = r1 + *(d2_imm20+s2+b2) ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2175
  inline void z_sg(  Register r1, int64_t d2, Register x2, Register b2);  // sub         r1 = r1 - *(d2_imm12+x2+b2) ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2176
  inline void z_sgf( Register r1, int64_t d2, Register x2, Register b2);  // sub         r1 = r1 - *(d2_imm12+x2+b2) ; int64 - int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2177
  inline void z_slg( Register r1, int64_t d2, Register x2, Register b2);  // sub logical r1 = r1 - *(d2_imm20+x2+b2) ; uint64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2178
  inline void z_slgf(Register r1, int64_t d2, Register x2, Register b2);  // sub logical r1 = r1 - *(d2_imm20+x2+b2) ; uint64 - uint32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2179
  inline void z_s(   Register r1, const Address& a);                      // sub         r1 = r1 - *(a)              ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2180
  inline void z_sy(  Register r1, const Address& a);                      // sub         r1 = r1 - *(a)              ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2181
  inline void z_sg(  Register r1, const Address& a);                      // sub         r1 = r1 - *(a)              ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2182
  inline void z_sgf( Register r1, const Address& a);                      // sub         r1 = r1 - *(a)              ; int64 - int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2183
  inline void z_slg( Register r1, const Address& a);                      // sub         r1 = r1 - *(a)              ; uint64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2184
  inline void z_slgf(Register r1, const Address& a);                      // sub         r1 = r1 - *(a)              ; uint64 - uint32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2185
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2186
  inline void z_sh(  Register r1, int64_t d2, Register x2, Register b2);  // sub         r1 = r1 - *(d2_imm12+x2+b2) ; int32 - int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2187
  inline void z_shy( Register r1, int64_t d2, Register x2, Register b2);  // sub         r1 = r1 - *(d2_imm20+x2+b2) ; int32 - int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2188
  inline void z_sh(  Register r1, const Address &a);                      // sub         r1 = r1 - *(d2_imm12+x2+b2) ; int32 - int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2189
  inline void z_shy( Register r1, const Address &a);                      // sub         r1 = r1 - *(d2_imm20+x2+b2) ; int32 - int16
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2190
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2191
  // Multiplication instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2192
  // mul registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2193
  inline void z_msr(  Register r1, Register r2);                          // mul r1 = r1 * r2          ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2194
  inline void z_msgr( Register r1, Register r2);                          // mul r1 = r1 * r2          ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2195
  inline void z_msgfr(Register r1, Register r2);                          // mul r1 = r1 * r2          ; int64 <- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2196
  inline void z_mlr(  Register r1, Register r2);                          // mul r1 = r1 * r2          ; int32 unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2197
  inline void z_mlgr( Register r1, Register r2);                          // mul r1 = r1 * r2          ; int64 unsigned
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2198
  // mul register - memory
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2199
  inline void z_mhy( Register r1, int64_t d2, Register x2, Register b2);  // mul r1 = r1 * *(d2+x2+b2)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2200
  inline void z_msy( Register r1, int64_t d2, Register x2, Register b2);  // mul r1 = r1 * *(d2+x2+b2)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2201
  inline void z_msg( Register r1, int64_t d2, Register x2, Register b2);  // mul r1 = r1 * *(d2+x2+b2)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2202
  inline void z_msgf(Register r1, int64_t d2, Register x2, Register b2);  // mul r1 = r1 * *(d2+x2+b2)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2203
  inline void z_ml(  Register r1, int64_t d2, Register x2, Register b2);  // mul r1 = r1 * *(d2+x2+b2)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2204
  inline void z_mlg( Register r1, int64_t d2, Register x2, Register b2);  // mul r1 = r1 * *(d2+x2+b2)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2205
  inline void z_mhy( Register r1, const Address& a);                      // mul r1 = r1 * *(a)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2206
  inline void z_msy( Register r1, const Address& a);                      // mul r1 = r1 * *(a)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2207
  inline void z_msg( Register r1, const Address& a);                      // mul r1 = r1 * *(a)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2208
  inline void z_msgf(Register r1, const Address& a);                      // mul r1 = r1 * *(a)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2209
  inline void z_ml(  Register r1, const Address& a);                      // mul r1 = r1 * *(a)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2210
  inline void z_mlg( Register r1, const Address& a);                      // mul r1 = r1 * *(a)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2211
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2212
  inline void z_msfi( Register r1, int64_t i2);   // mult r1 = r1 * i2_imm32;   int32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2213
  inline void z_msgfi(Register r1, int64_t i2);   // mult r1 = r1 * i2_imm32;   int64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2214
  inline void z_mhi(  Register r1, int64_t i2);   // mult r1 = r1 * i2_imm16;   int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2215
  inline void z_mghi( Register r1, int64_t i2);   // mult r1 = r1 * i2_imm16;   int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2216
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2217
  // Division instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2218
  inline void z_dsgr( Register r1, Register r2);      // div  r1 = r1 / r2               ; int64/int32 needs reg pair!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2219
  inline void z_dsgfr(Register r1, Register r2);      // div  r1 = r1 / r2               ; int64/int32 needs reg pair!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2220
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2221
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2222
  // Logic instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2223
  // ===================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2224
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2225
  // and
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2226
  inline void z_n(   Register r1, int64_t d2, Register x2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2227
  inline void z_ny(  Register r1, int64_t d2, Register x2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2228
  inline void z_ng(  Register r1, int64_t d2, Register x2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2229
  inline void z_n(   Register r1, const Address& a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2230
  inline void z_ny(  Register r1, const Address& a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2231
  inline void z_ng(  Register r1, const Address& a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2232
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2233
  inline void z_nr(  Register r1, Register r2);               // and r1 = r1 & r2         ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2234
  inline void z_ngr( Register r1, Register r2);               // and r1 = r1 & r2         ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2235
  inline void z_nrk( Register r1, Register r2, Register r3);  // and r1 = r2 & r3         ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2236
  inline void z_ngrk(Register r1, Register r2, Register r3);  // and r1 = r2 & r3         ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2237
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2238
  inline void z_nihh(Register r1, int64_t i2);                // and r1 = r1 & i2_imm16   ; and only for bits  0-15
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2239
  inline void z_nihl(Register r1, int64_t i2);                // and r1 = r1 & i2_imm16   ; and only for bits 16-31
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2240
  inline void z_nilh(Register r1, int64_t i2);                // and r1 = r1 & i2_imm16   ; and only for bits 32-47
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2241
  inline void z_nill(Register r1, int64_t i2);                // and r1 = r1 & i2_imm16   ; and only for bits 48-63
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2242
  inline void z_nihf(Register r1, int64_t i2);                // and r1 = r1 & i2_imm32   ; and only for bits  0-31
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2243
  inline void z_nilf(Register r1, int64_t i2);                // and r1 = r1 & i2_imm32   ; and only for bits 32-63  see also MacroAssembler::nilf.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2244
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2245
  // or
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2246
  inline void z_o(   Register r1, int64_t d2, Register x2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2247
  inline void z_oy(  Register r1, int64_t d2, Register x2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2248
  inline void z_og(  Register r1, int64_t d2, Register x2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2249
  inline void z_o(   Register r1, const Address& a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2250
  inline void z_oy(  Register r1, const Address& a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2251
  inline void z_og(  Register r1, const Address& a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2252
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2253
  inline void z_or(  Register r1, Register r2);               // or r1 = r1 | r2; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2254
  inline void z_ogr( Register r1, Register r2);               // or r1 = r1 | r2; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2255
  inline void z_ork( Register r1, Register r2, Register r3);  // or r1 = r2 | r3         ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2256
  inline void z_ogrk(Register r1, Register r2, Register r3);  // or r1 = r2 | r3         ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2257
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2258
  inline void z_oihh(Register r1, int64_t i2);                // or r1 = r1 | i2_imm16   ; or only for bits  0-15
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2259
  inline void z_oihl(Register r1, int64_t i2);                // or r1 = r1 | i2_imm16   ; or only for bits 16-31
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2260
  inline void z_oilh(Register r1, int64_t i2);                // or r1 = r1 | i2_imm16   ; or only for bits 32-47
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2261
  inline void z_oill(Register r1, int64_t i2);                // or r1 = r1 | i2_imm16   ; or only for bits 48-63
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2262
  inline void z_oihf(Register r1, int64_t i2);                // or r1 = r1 | i2_imm32   ; or only for bits  0-31
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2263
  inline void z_oilf(Register r1, int64_t i2);                // or r1 = r1 | i2_imm32   ; or only for bits 32-63
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2264
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2265
  // xor
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2266
  inline void z_x(   Register r1, int64_t d2, Register x2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2267
  inline void z_xy(  Register r1, int64_t d2, Register x2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2268
  inline void z_xg(  Register r1, int64_t d2, Register x2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2269
  inline void z_x(   Register r1, const Address& a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2270
  inline void z_xy(  Register r1, const Address& a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2271
  inline void z_xg(  Register r1, const Address& a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2272
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2273
  inline void z_xr(  Register r1, Register r2);               // xor r1 = r1 ^ r2         ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2274
  inline void z_xgr( Register r1, Register r2);               // xor r1 = r1 ^ r2         ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2275
  inline void z_xrk( Register r1, Register r2, Register r3);  // xor r1 = r2 ^ r3         ; int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2276
  inline void z_xgrk(Register r1, Register r2, Register r3);  // xor r1 = r2 ^ r3         ; int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2277
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2278
  inline void z_xihf(Register r1, int64_t i2);                // xor r1 = r1 ^ i2_imm32   ; or only for bits  0-31
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2279
  inline void z_xilf(Register r1, int64_t i2);                // xor r1 = r1 ^ i2_imm32   ; or only for bits 32-63
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2280
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2281
  // shift
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2282
  inline void z_sla( Register r1,              int64_t d2, Register b2=Z_R0); // shift left  r1 = r1 << ((d2+b2)&0x3f) ; int32, only 31 bits shifted, sign preserved!
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
  2283
  inline void z_slak(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift left  r1 = r3 << ((d2+b2)&0x3f) ; int32, only 31 bits shifted, sign preserved!
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2284
  inline void z_slag(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift left  r1 = r3 << ((d2+b2)&0x3f) ; int64, only 63 bits shifted, sign preserved!
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2285
  inline void z_sra( Register r1,              int64_t d2, Register b2=Z_R0); // shift right r1 = r1 >> ((d2+b2)&0x3f) ; int32, sign extended
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
  2286
  inline void z_srak(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift right r1 = r3 >> ((d2+b2)&0x3f) ; int32, sign extended
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2287
  inline void z_srag(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift right r1 = r3 >> ((d2+b2)&0x3f) ; int64, sign extended
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2288
  inline void z_sll( Register r1,              int64_t d2, Register b2=Z_R0); // shift left  r1 = r1 << ((d2+b2)&0x3f) ; int32, zeros added
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
  2289
  inline void z_sllk(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift left  r1 = r3 << ((d2+b2)&0x3f) ; int32, zeros added
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2290
  inline void z_sllg(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift left  r1 = r3 << ((d2+b2)&0x3f) ; int64, zeros added
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2291
  inline void z_srl( Register r1,              int64_t d2, Register b2=Z_R0); // shift right r1 = r1 >> ((d2+b2)&0x3f) ; int32, zero extended
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
  2292
  inline void z_srlk(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift right r1 = r3 >> ((d2+b2)&0x3f) ; int32, zero extended
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2293
  inline void z_srlg(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // shift right r1 = r3 >> ((d2+b2)&0x3f) ; int64, zero extended
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2294
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2295
  // rotate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2296
  inline void z_rll( Register r1, Register r3, int64_t d2, Register b2=Z_R0); // rot r1 = r3 << (d2+b2 & 0x3f) ; int32  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2297
  inline void z_rllg(Register r1, Register r3, int64_t d2, Register b2=Z_R0); // rot r1 = r3 << (d2+b2 & 0x3f) ; int64  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2298
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2299
  // rotate the AND/XOR/OR/insert
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2300
  inline void z_rnsbg( Register r1, Register r2, int64_t spos3, int64_t epos4, int64_t nrot5, bool test_only = false); // rotate then AND selected bits  -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2301
  inline void z_rxsbg( Register r1, Register r2, int64_t spos3, int64_t epos4, int64_t nrot5, bool test_only = false); // rotate then XOR selected bits  -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2302
  inline void z_rosbg( Register r1, Register r2, int64_t spos3, int64_t epos4, int64_t nrot5, bool test_only = false); // rotate then OR  selected bits  -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2303
  inline void z_risbg( Register r1, Register r2, int64_t spos3, int64_t epos4, int64_t nrot5, bool zero_rest = false); // rotate then INS selected bits  -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2304
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2305
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2306
  // memory-immediate instructions (8-bit immediate)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2307
  // ===============================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2308
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2309
  inline void z_cli( int64_t d1, Register b1, int64_t i2); // compare *(d1_imm12+b1) ^= i2_imm8           ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2310
  inline void z_mvi( int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1)  = i2_imm8           ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2311
  inline void z_tm(  int64_t d1, Register b1, int64_t i2); // test    *(d1_imm12+b1) against mask i2_imm8 ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2312
  inline void z_ni(  int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1) &= i2_imm8           ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2313
  inline void z_oi(  int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1) |= i2_imm8           ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2314
  inline void z_xi(  int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1) ^= i2_imm8           ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2315
  inline void z_cliy(int64_t d1, Register b1, int64_t i2); // compare *(d1_imm12+b1) ^= i2_imm8           ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2316
  inline void z_mviy(int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1)  = i2_imm8           ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2317
  inline void z_tmy( int64_t d1, Register b1, int64_t i2); // test    *(d1_imm12+b1) against mask i2_imm8 ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2318
  inline void z_niy( int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1) &= i2_imm8           ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2319
  inline void z_oiy( int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1) |= i2_imm8           ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2320
  inline void z_xiy( int64_t d1, Register b1, int64_t i2); // store   *(d1_imm12+b1) ^= i2_imm8           ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2321
  inline void z_cli( const Address& a, int64_t imm8);      // compare *(a)           ^= imm8              ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2322
  inline void z_mvi( const Address& a, int64_t imm8);      // store   *(a)            = imm8              ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2323
  inline void z_tm(  const Address& a, int64_t imm8);      // test    *(a)           against mask imm8    ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2324
  inline void z_ni(  const Address& a, int64_t imm8);      // store   *(a)           &= imm8              ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2325
  inline void z_oi(  const Address& a, int64_t imm8);      // store   *(a)           |= imm8              ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2326
  inline void z_xi(  const Address& a, int64_t imm8);      // store   *(a)           ^= imm8              ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2327
  inline void z_cliy(const Address& a, int64_t imm8);      // compare *(a)           ^= imm8              ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2328
  inline void z_mviy(const Address& a, int64_t imm8);      // store   *(a)            = imm8              ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2329
  inline void z_tmy( const Address& a, int64_t imm8);      // test    *(a)           against mask imm8    ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2330
  inline void z_niy( const Address& a, int64_t imm8);      // store   *(a)           &= imm8              ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2331
  inline void z_oiy( const Address& a, int64_t imm8);      // store   *(a)           |= imm8              ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2332
  inline void z_xiy( const Address& a, int64_t imm8);      // store   *(a)           ^= imm8              ; int8
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2333
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2334
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2335
  //------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2336
  // Interlocked-Update
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2337
  //------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2338
  inline void z_laa(  Register r1, Register r3, int64_t d2, Register b2);   // load and add    int32, signed   -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2339
  inline void z_laag( Register r1, Register r3, int64_t d2, Register b2);   // load and add    int64, signed   -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2340
  inline void z_laal( Register r1, Register r3, int64_t d2, Register b2);   // load and add    int32, unsigned -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2341
  inline void z_laalg(Register r1, Register r3, int64_t d2, Register b2);   // load and add    int64, unsigned -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2342
  inline void z_lan(  Register r1, Register r3, int64_t d2, Register b2);   // load and and    int32           -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2343
  inline void z_lang( Register r1, Register r3, int64_t d2, Register b2);   // load and and    int64           -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2344
  inline void z_lax(  Register r1, Register r3, int64_t d2, Register b2);   // load and xor    int32           -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2345
  inline void z_laxg( Register r1, Register r3, int64_t d2, Register b2);   // load and xor    int64           -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2346
  inline void z_lao(  Register r1, Register r3, int64_t d2, Register b2);   // load and or     int32           -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2347
  inline void z_laog( Register r1, Register r3, int64_t d2, Register b2);   // load and or     int64           -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2348
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2349
  inline void z_laa(  Register r1, Register r3, const Address& a);          // load and add    int32, signed   -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2350
  inline void z_laag( Register r1, Register r3, const Address& a);          // load and add    int64, signed   -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2351
  inline void z_laal( Register r1, Register r3, const Address& a);          // load and add    int32, unsigned -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2352
  inline void z_laalg(Register r1, Register r3, const Address& a);          // load and add    int64, unsigned -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2353
  inline void z_lan(  Register r1, Register r3, const Address& a);          // load and and    int32           -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2354
  inline void z_lang( Register r1, Register r3, const Address& a);          // load and and    int64           -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2355
  inline void z_lax(  Register r1, Register r3, const Address& a);          // load and xor    int32           -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2356
  inline void z_laxg( Register r1, Register r3, const Address& a);          // load and xor    int64           -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2357
  inline void z_lao(  Register r1, Register r3, const Address& a);          // load and or     int32           -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2358
  inline void z_laog( Register r1, Register r3, const Address& a);          // load and or     int64           -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2359
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2360
  //--------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2361
  // Execution Prediction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2362
  //--------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2363
  inline void z_pfd(  int64_t m1, int64_t d2, Register x2, Register b2);  // prefetch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2364
  inline void z_pfd(  int64_t m1, Address a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2365
  inline void z_pfdrl(int64_t m1, int64_t i2);                            // prefetch
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2366
  inline void z_bpp(  int64_t m1, int64_t i2, int64_t d3, Register b3);   // branch prediction    -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2367
  inline void z_bprp( int64_t m1, int64_t i2, int64_t i3);                // branch prediction    -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2368
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2369
  //-------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2370
  // Transaction Control
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2371
  //-------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2372
  inline void z_tbegin(int64_t d1, Register b1, int64_t i2);          // begin transaction               -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2373
  inline void z_tbeginc(int64_t d1, Register b1, int64_t i2);         // begin transaction (constrained) -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2374
  inline void z_tend();                                               // end transaction                 -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2375
  inline void z_tabort(int64_t d2, Register b2);                      // abort transaction               -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2376
  inline void z_etnd(Register r1);                                    // extract tx nesting depth        -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2377
  inline void z_ppa(Register r1, Register r2, int64_t m3);            // perform processor assist        -- EC12
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2378
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2379
  //---------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2380
  // Conditional Execution
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2381
  //---------------------------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2382
  inline void z_locr( Register r1, Register r2, branch_condition cc);             // if (cc) load r1 = r2               ; int32 -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2383
  inline void z_locgr(Register r1, Register r2, branch_condition cc);             // if (cc) load r1 = r2               ; int64 -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2384
  inline void z_loc(  Register r1, int64_t d2, Register b2, branch_condition cc); // if (cc) load r1 = *(d2_simm20+b2)  ; int32 -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2385
  inline void z_locg( Register r1, int64_t d2, Register b2, branch_condition cc); // if (cc) load r1 = *(d2_simm20+b2)  ; int64 -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2386
  inline void z_loc(  Register r1, const Address& a, branch_condition cc);        // if (cc) load r1 = *(a)             ; int32 -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2387
  inline void z_locg( Register r1, const Address& a, branch_condition cc);        // if (cc) load r1 = *(a)             ; int64 -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2388
  inline void z_stoc( Register r1, int64_t d2, Register b2, branch_condition cc); // if (cc) store *(d2_simm20+b2) = r1 ; int32 -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2389
  inline void z_stocg(Register r1, int64_t d2, Register b2, branch_condition cc); // if (cc) store *(d2_simm20+b2) = r1 ; int64 -- z196
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2390
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2391
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2392
  // Complex CISC instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2393
  // ==========================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2394
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2395
  inline void z_cksm(Register r1, Register r2);                       // checksum. This is NOT CRC32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2396
  inline void z_km(  Register r1, Register r2);                       // cipher message
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2397
  inline void z_kmc( Register r1, Register r2);                       // cipher message with chaining
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2398
  inline void z_kimd(Register r1, Register r2);                       // msg digest (SHA)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2399
  inline void z_klmd(Register r1, Register r2);                       // msg digest (SHA)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2400
  inline void z_kmac(Register r1, Register r2);                       // msg authentication code
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2401
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2402
  inline void z_ex(Register r1, int64_t d2, Register x2, Register b2);// execute
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2403
  inline void z_exrl(Register r1, int64_t i2);                        // execute relative long         -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2404
  inline void z_exrl(Register r1, address a2);                        // execute relative long         -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2405
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2406
  inline void z_ectg(int64_t d1, Register b1, int64_t d2, Register b2, Register r3);  // extract cpu time
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2407
  inline void z_ecag(Register r1, Register r3, int64_t d2, Register b2);              // extract CPU attribute
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2408
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2409
  inline void z_srst(Register r1, Register r2);                       // search string
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2410
  inline void z_srstu(Register r1, Register r2);                      // search string unicode
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2411
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2412
  inline void z_mvc(const Address& d, const Address& s, int64_t l);               // move l bytes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2413
  inline void z_mvc(int64_t d1, int64_t l, Register b1, int64_t d2, Register b2); // move l+1 bytes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2414
  inline void z_mvcle(Register r1, Register r3, int64_t d2, Register b2=Z_R0);    // move region of memory
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2415
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2416
  inline void z_stfle(int64_t d2, Register b2);                            // store facility list extended
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2417
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2418
  inline void z_nc(int64_t d1, int64_t l, Register b1, int64_t d2, Register b2);// and *(d1+b1) = *(d1+l+b1) & *(d2+b2) ; d1, d2: uimm12, ands l+1 bytes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2419
  inline void z_oc(int64_t d1, int64_t l, Register b1, int64_t d2, Register b2);//  or *(d1+b1) = *(d1+l+b1) | *(d2+b2) ; d1, d2: uimm12,  ors l+1 bytes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2420
  inline void z_xc(int64_t d1, int64_t l, Register b1, int64_t d2, Register b2);// xor *(d1+b1) = *(d1+l+b1) ^ *(d2+b2) ; d1, d2: uimm12, xors l+1 bytes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2421
  inline void z_nc(Address dst, int64_t len, Address src2);                     // and *dst = *dst & *src2, ands len bytes in memory
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2422
  inline void z_oc(Address dst, int64_t len, Address src2);                     //  or *dst = *dst | *src2,  ors len bytes in memory
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2423
  inline void z_xc(Address dst, int64_t len, Address src2);                     // xor *dst = *dst ^ *src2, xors len bytes in memory
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2424
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2425
  // compare instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2426
  inline void z_clc(int64_t d1, int64_t l, Register b1, int64_t d2, Register b2);  // compare (*(d1_uimm12+b1), *(d1_uimm12+b1)) ; compare l bytes
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2427
  inline void z_clcle(Register r1, Register r3, int64_t d2, Register b2);  // compare logical long extended, see docu
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2428
  inline void z_clclu(Register r1, Register r3, int64_t d2, Register b2);  // compare logical long unicode, see docu
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2429
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2430
  // Translate characters
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2431
  inline void z_troo(Register r1, Register r2, int64_t m3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2432
  inline void z_trot(Register r1, Register r2, int64_t m3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2433
  inline void z_trto(Register r1, Register r2, int64_t m3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2434
  inline void z_trtt(Register r1, Register r2, int64_t m3);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2435
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2436
47531
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2437
  //---------------------------
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2438
  //--  Vector Instructions  --
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2439
  //---------------------------
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2440
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2441
  //---<  Vector Support Instructions  >---
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2442
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2443
  // Load (transfer from memory)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2444
  inline void z_vlm(   VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2445
  inline void z_vl(    VectorRegister v1, int64_t d2, Register x2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2446
  inline void z_vleb(  VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2447
  inline void z_vleh(  VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2448
  inline void z_vlef(  VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2449
  inline void z_vleg(  VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2450
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2451
  // Gather/Scatter
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2452
  inline void z_vgef(  VectorRegister v1, int64_t d2, VectorRegister vx2, Register b2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2453
  inline void z_vgeg(  VectorRegister v1, int64_t d2, VectorRegister vx2, Register b2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2454
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2455
  inline void z_vscef( VectorRegister v1, int64_t d2, VectorRegister vx2, Register b2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2456
  inline void z_vsceg( VectorRegister v1, int64_t d2, VectorRegister vx2, Register b2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2457
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2458
  // load and replicate
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2459
  inline void z_vlrep( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2460
  inline void z_vlrepb(VectorRegister v1, int64_t d2, Register x2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2461
  inline void z_vlreph(VectorRegister v1, int64_t d2, Register x2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2462
  inline void z_vlrepf(VectorRegister v1, int64_t d2, Register x2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2463
  inline void z_vlrepg(VectorRegister v1, int64_t d2, Register x2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2464
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2465
  inline void z_vllez( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2466
  inline void z_vllezb(VectorRegister v1, int64_t d2, Register x2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2467
  inline void z_vllezh(VectorRegister v1, int64_t d2, Register x2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2468
  inline void z_vllezf(VectorRegister v1, int64_t d2, Register x2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2469
  inline void z_vllezg(VectorRegister v1, int64_t d2, Register x2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2470
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2471
  inline void z_vlbb(  VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2472
  inline void z_vll(   VectorRegister v1, Register r3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2473
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2474
  // Load (register to register)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2475
  inline void z_vlr(   VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2476
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2477
  inline void z_vlgv(  Register r1, VectorRegister v3, int64_t d2, Register b2, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2478
  inline void z_vlgvb( Register r1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2479
  inline void z_vlgvh( Register r1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2480
  inline void z_vlgvf( Register r1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2481
  inline void z_vlgvg( Register r1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2482
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2483
  inline void z_vlvg(  VectorRegister v1, Register r3, int64_t d2, Register b2, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2484
  inline void z_vlvgb( VectorRegister v1, Register r3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2485
  inline void z_vlvgh( VectorRegister v1, Register r3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2486
  inline void z_vlvgf( VectorRegister v1, Register r3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2487
  inline void z_vlvgg( VectorRegister v1, Register r3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2488
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2489
  inline void z_vlvgp( VectorRegister v1, Register r2, Register r3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2490
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2491
  // vector register pack
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2492
  inline void z_vpk(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2493
  inline void z_vpkh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2494
  inline void z_vpkf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2495
  inline void z_vpkg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2496
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2497
  inline void z_vpks(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4, int64_t cc5);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2498
  inline void z_vpksh( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2499
  inline void z_vpksf( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2500
  inline void z_vpksg( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2501
  inline void z_vpkshs(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2502
  inline void z_vpksfs(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2503
  inline void z_vpksgs(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2504
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2505
  inline void z_vpkls(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4, int64_t cc5);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2506
  inline void z_vpklsh( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2507
  inline void z_vpklsf( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2508
  inline void z_vpklsg( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2509
  inline void z_vpklshs(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2510
  inline void z_vpklsfs(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2511
  inline void z_vpklsgs(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2512
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2513
  // vector register unpack (sign-extended)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2514
  inline void z_vuph(   VectorRegister v1, VectorRegister v2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2515
  inline void z_vuphb(  VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2516
  inline void z_vuphh(  VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2517
  inline void z_vuphf(  VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2518
  inline void z_vupl(   VectorRegister v1, VectorRegister v2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2519
  inline void z_vuplb(  VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2520
  inline void z_vuplh(  VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2521
  inline void z_vuplf(  VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2522
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2523
  // vector register unpack (zero-extended)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2524
  inline void z_vuplh(  VectorRegister v1, VectorRegister v2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2525
  inline void z_vuplhb( VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2526
  inline void z_vuplhh( VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2527
  inline void z_vuplhf( VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2528
  inline void z_vupll(  VectorRegister v1, VectorRegister v2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2529
  inline void z_vupllb( VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2530
  inline void z_vupllh( VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2531
  inline void z_vupllf( VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2532
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2533
  // vector register merge high/low
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2534
  inline void z_vmrh( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2535
  inline void z_vmrhb(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2536
  inline void z_vmrhh(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2537
  inline void z_vmrhf(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2538
  inline void z_vmrhg(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2539
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2540
  inline void z_vmrl( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2541
  inline void z_vmrlb(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2542
  inline void z_vmrlh(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2543
  inline void z_vmrlf(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2544
  inline void z_vmrlg(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2545
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2546
  // vector register permute
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2547
  inline void z_vperm( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2548
  inline void z_vpdi(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t        m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2549
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2550
  // vector register replicate
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2551
  inline void z_vrep(  VectorRegister v1, VectorRegister v3, int64_t imm2, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2552
  inline void z_vrepb( VectorRegister v1, VectorRegister v3, int64_t imm2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2553
  inline void z_vreph( VectorRegister v1, VectorRegister v3, int64_t imm2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2554
  inline void z_vrepf( VectorRegister v1, VectorRegister v3, int64_t imm2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2555
  inline void z_vrepg( VectorRegister v1, VectorRegister v3, int64_t imm2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2556
  inline void z_vrepi( VectorRegister v1, int64_t imm2,      int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2557
  inline void z_vrepib(VectorRegister v1, int64_t imm2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2558
  inline void z_vrepih(VectorRegister v1, int64_t imm2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2559
  inline void z_vrepif(VectorRegister v1, int64_t imm2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2560
  inline void z_vrepig(VectorRegister v1, int64_t imm2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2561
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2562
  inline void z_vsel(  VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2563
  inline void z_vseg(  VectorRegister v1, VectorRegister v2, int64_t imm3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2564
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2565
  // Load (immediate)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2566
  inline void z_vleib( VectorRegister v1, int64_t imm2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2567
  inline void z_vleih( VectorRegister v1, int64_t imm2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2568
  inline void z_vleif( VectorRegister v1, int64_t imm2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2569
  inline void z_vleig( VectorRegister v1, int64_t imm2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2570
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2571
  // Store
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2572
  inline void z_vstm(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2573
  inline void z_vst(   VectorRegister v1, int64_t d2, Register x2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2574
  inline void z_vsteb( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2575
  inline void z_vsteh( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2576
  inline void z_vstef( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2577
  inline void z_vsteg( VectorRegister v1, int64_t d2, Register x2, Register b2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2578
  inline void z_vstl(  VectorRegister v1, Register r3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2579
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2580
  // Misc
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2581
  inline void z_vgm(   VectorRegister v1, int64_t imm2, int64_t imm3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2582
  inline void z_vgmb(  VectorRegister v1, int64_t imm2, int64_t imm3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2583
  inline void z_vgmh(  VectorRegister v1, int64_t imm2, int64_t imm3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2584
  inline void z_vgmf(  VectorRegister v1, int64_t imm2, int64_t imm3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2585
  inline void z_vgmg(  VectorRegister v1, int64_t imm2, int64_t imm3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2586
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2587
  inline void z_vgbm(  VectorRegister v1, int64_t imm2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2588
  inline void z_vzero( VectorRegister v1); // preferred method to set vreg to all zeroes
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2589
  inline void z_vone(  VectorRegister v1); // preferred method to set vreg to all ones
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2590
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2591
  //---<  Vector Arithmetic Instructions  >---
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2592
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2593
  // Load
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2594
  inline void z_vlc(    VectorRegister v1, VectorRegister v2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2595
  inline void z_vlcb(   VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2596
  inline void z_vlch(   VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2597
  inline void z_vlcf(   VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2598
  inline void z_vlcg(   VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2599
  inline void z_vlp(    VectorRegister v1, VectorRegister v2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2600
  inline void z_vlpb(   VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2601
  inline void z_vlph(   VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2602
  inline void z_vlpf(   VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2603
  inline void z_vlpg(   VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2604
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2605
  // ADD
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2606
  inline void z_va(     VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2607
  inline void z_vab(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2608
  inline void z_vah(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2609
  inline void z_vaf(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2610
  inline void z_vag(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2611
  inline void z_vaq(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2612
  inline void z_vacc(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2613
  inline void z_vaccb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2614
  inline void z_vacch(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2615
  inline void z_vaccf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2616
  inline void z_vaccg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2617
  inline void z_vaccq(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2618
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2619
  // SUB
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2620
  inline void z_vs(     VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2621
  inline void z_vsb(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2622
  inline void z_vsh(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2623
  inline void z_vsf(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2624
  inline void z_vsg(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2625
  inline void z_vsq(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2626
  inline void z_vscbi(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2627
  inline void z_vscbib( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2628
  inline void z_vscbih( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2629
  inline void z_vscbif( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2630
  inline void z_vscbig( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2631
  inline void z_vscbiq( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2632
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2633
  // MULTIPLY
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2634
  inline void z_vml(    VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2635
  inline void z_vmh(    VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2636
  inline void z_vmlh(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2637
  inline void z_vme(    VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2638
  inline void z_vmle(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2639
  inline void z_vmo(    VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2640
  inline void z_vmlo(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2641
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2642
  // MULTIPLY & ADD
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2643
  inline void z_vmal(   VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2644
  inline void z_vmah(   VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2645
  inline void z_vmalh(  VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2646
  inline void z_vmae(   VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2647
  inline void z_vmale(  VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2648
  inline void z_vmao(   VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2649
  inline void z_vmalo(  VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2650
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2651
  // VECTOR SUM
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2652
  inline void z_vsum(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2653
  inline void z_vsumb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2654
  inline void z_vsumh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2655
  inline void z_vsumg(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2656
  inline void z_vsumgh( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2657
  inline void z_vsumgf( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2658
  inline void z_vsumq(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2659
  inline void z_vsumqf( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2660
  inline void z_vsumqg( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2661
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2662
  // Average
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2663
  inline void z_vavg(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2664
  inline void z_vavgb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2665
  inline void z_vavgh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2666
  inline void z_vavgf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2667
  inline void z_vavgg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2668
  inline void z_vavgl(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2669
  inline void z_vavglb( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2670
  inline void z_vavglh( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2671
  inline void z_vavglf( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2672
  inline void z_vavglg( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2673
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2674
  // VECTOR Galois Field Multiply Sum
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2675
  inline void z_vgfm(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2676
  inline void z_vgfmb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2677
  inline void z_vgfmh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2678
  inline void z_vgfmf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2679
  inline void z_vgfmg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2680
  // VECTOR Galois Field Multiply Sum and Accumulate
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2681
  inline void z_vgfma(  VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t m5);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2682
  inline void z_vgfmab( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2683
  inline void z_vgfmah( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2684
  inline void z_vgfmaf( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2685
  inline void z_vgfmag( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2686
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2687
  //---<  Vector Logical Instructions  >---
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2688
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2689
  // AND
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2690
  inline void z_vn(     VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2691
  inline void z_vnc(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2692
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2693
  // XOR
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2694
  inline void z_vx(     VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2695
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2696
  // NOR
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2697
  inline void z_vno(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2698
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2699
  // OR
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2700
  inline void z_vo(     VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2701
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2702
  // Comparison (element-wise)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2703
  inline void z_vceq(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4, int64_t cc5);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2704
  inline void z_vceqb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2705
  inline void z_vceqh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2706
  inline void z_vceqf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2707
  inline void z_vceqg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2708
  inline void z_vceqbs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2709
  inline void z_vceqhs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2710
  inline void z_vceqfs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2711
  inline void z_vceqgs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2712
  inline void z_vch(    VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4, int64_t cc5);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2713
  inline void z_vchb(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2714
  inline void z_vchh(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2715
  inline void z_vchf(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2716
  inline void z_vchg(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2717
  inline void z_vchbs(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2718
  inline void z_vchhs(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2719
  inline void z_vchfs(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2720
  inline void z_vchgs(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2721
  inline void z_vchl(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4, int64_t cc5);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2722
  inline void z_vchlb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2723
  inline void z_vchlh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2724
  inline void z_vchlf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2725
  inline void z_vchlg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2726
  inline void z_vchlbs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2727
  inline void z_vchlhs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2728
  inline void z_vchlfs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2729
  inline void z_vchlgs( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2730
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2731
  // Max/Min (element-wise)
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2732
  inline void z_vmx(    VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2733
  inline void z_vmxb(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2734
  inline void z_vmxh(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2735
  inline void z_vmxf(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2736
  inline void z_vmxg(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2737
  inline void z_vmxl(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2738
  inline void z_vmxlb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2739
  inline void z_vmxlh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2740
  inline void z_vmxlf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2741
  inline void z_vmxlg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2742
  inline void z_vmn(    VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2743
  inline void z_vmnb(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2744
  inline void z_vmnh(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2745
  inline void z_vmnf(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2746
  inline void z_vmng(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2747
  inline void z_vmnl(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2748
  inline void z_vmnlb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2749
  inline void z_vmnlh(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2750
  inline void z_vmnlf(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2751
  inline void z_vmnlg(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2752
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2753
  // Leading/Trailing Zeros, population count
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2754
  inline void z_vclz(   VectorRegister v1, VectorRegister v2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2755
  inline void z_vclzb(  VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2756
  inline void z_vclzh(  VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2757
  inline void z_vclzf(  VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2758
  inline void z_vclzg(  VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2759
  inline void z_vctz(   VectorRegister v1, VectorRegister v2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2760
  inline void z_vctzb(  VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2761
  inline void z_vctzh(  VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2762
  inline void z_vctzf(  VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2763
  inline void z_vctzg(  VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2764
  inline void z_vpopct( VectorRegister v1, VectorRegister v2, int64_t m3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2765
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2766
  // Rotate/Shift
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2767
  inline void z_verllv( VectorRegister v1, VectorRegister v2, VectorRegister v3,               int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2768
  inline void z_verllvb(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2769
  inline void z_verllvh(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2770
  inline void z_verllvf(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2771
  inline void z_verllvg(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2772
  inline void z_verll(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2,         int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2773
  inline void z_verllb( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2774
  inline void z_verllh( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2775
  inline void z_verllf( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2776
  inline void z_verllg( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2777
  inline void z_verim(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4, int64_t m5);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2778
  inline void z_verimb( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2779
  inline void z_verimh( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2780
  inline void z_verimf( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2781
  inline void z_verimg( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2782
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2783
  inline void z_veslv(  VectorRegister v1, VectorRegister v2, VectorRegister v3,               int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2784
  inline void z_veslvb( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2785
  inline void z_veslvh( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2786
  inline void z_veslvf( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2787
  inline void z_veslvg( VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2788
  inline void z_vesl(   VectorRegister v1, VectorRegister v3, int64_t d2, Register b2,         int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2789
  inline void z_veslb(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2790
  inline void z_veslh(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2791
  inline void z_veslf(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2792
  inline void z_veslg(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2793
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2794
  inline void z_vesrav( VectorRegister v1, VectorRegister v2, VectorRegister v3,               int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2795
  inline void z_vesravb(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2796
  inline void z_vesravh(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2797
  inline void z_vesravf(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2798
  inline void z_vesravg(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2799
  inline void z_vesra(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2,         int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2800
  inline void z_vesrab( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2801
  inline void z_vesrah( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2802
  inline void z_vesraf( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2803
  inline void z_vesrag( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2804
  inline void z_vesrlv( VectorRegister v1, VectorRegister v2, VectorRegister v3,               int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2805
  inline void z_vesrlvb(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2806
  inline void z_vesrlvh(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2807
  inline void z_vesrlvf(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2808
  inline void z_vesrlvg(VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2809
  inline void z_vesrl(  VectorRegister v1, VectorRegister v3, int64_t d2, Register b2,         int64_t m4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2810
  inline void z_vesrlb( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2811
  inline void z_vesrlh( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2812
  inline void z_vesrlf( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2813
  inline void z_vesrlg( VectorRegister v1, VectorRegister v3, int64_t d2, Register b2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2814
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2815
  inline void z_vsl(    VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2816
  inline void z_vslb(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2817
  inline void z_vsldb(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2818
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2819
  inline void z_vsra(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2820
  inline void z_vsrab(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2821
  inline void z_vsrl(   VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2822
  inline void z_vsrlb(  VectorRegister v1, VectorRegister v2, VectorRegister v3);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2823
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2824
  // Test under Mask
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2825
  inline void z_vtm(    VectorRegister v1, VectorRegister v2);
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2826
47585
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2827
  //---<  Vector String Instructions  >---
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2828
  inline void z_vfae(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4, int64_t cc5);   // Find any element
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2829
  inline void z_vfaeb(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2830
  inline void z_vfaeh(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2831
  inline void z_vfaef(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2832
  inline void z_vfee(   VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4, int64_t cc5);   // Find element equal
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2833
  inline void z_vfeeb(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2834
  inline void z_vfeeh(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2835
  inline void z_vfeef(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2836
  inline void z_vfene(  VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t imm4, int64_t cc5);   // Find element not equal
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2837
  inline void z_vfeneb( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2838
  inline void z_vfeneh( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2839
  inline void z_vfenef( VectorRegister v1, VectorRegister v2, VectorRegister v3, int64_t cc5);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2840
  inline void z_vstrc(  VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t imm5, int64_t cc6);   // String range compare
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2841
  inline void z_vstrcb( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t cc6);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2842
  inline void z_vstrch( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t cc6);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2843
  inline void z_vstrcf( VectorRegister v1, VectorRegister v2, VectorRegister v3, VectorRegister v4, int64_t cc6);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2844
  inline void z_vistr(  VectorRegister v1, VectorRegister v2, int64_t imm3, int64_t cc5);                      // Isolate String
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2845
  inline void z_vistrb( VectorRegister v1, VectorRegister v2, int64_t cc5);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2846
  inline void z_vistrh( VectorRegister v1, VectorRegister v2, int64_t cc5);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2847
  inline void z_vistrf( VectorRegister v1, VectorRegister v2, int64_t cc5);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2848
  inline void z_vistrbs(VectorRegister v1, VectorRegister v2);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2849
  inline void z_vistrhs(VectorRegister v1, VectorRegister v2);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2850
  inline void z_vistrfs(VectorRegister v1, VectorRegister v2);
c264868bff5b 8187969: [s390] z/Architecture Vector Facility Support. Part II
lucy
parents: 47531
diff changeset
  2851
47531
6481d7b6c31e 8187573: [s390] z/Architecture Vector Facility Support
lucy
parents: 47216
diff changeset
  2852
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2853
  // Floatingpoint instructions
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
  // compare instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2857
  inline void z_cebr(FloatRegister r1, FloatRegister r2);                     // compare (r1, r2)                ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2858
  inline void z_ceb(FloatRegister r1, int64_t d2, Register x2, Register b2);  // compare (r1, *(d2_imm12+x2+b2)) ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2859
  inline void z_ceb(FloatRegister r1, const Address &a);                      // compare (r1, *(d2_imm12+x2+b2)) ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2860
  inline void z_cdbr(FloatRegister r1, FloatRegister r2);                     // compare (r1, r2)                ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2861
  inline void z_cdb(FloatRegister r1, int64_t d2, Register x2, Register b2);  // compare (r1, *(d2_imm12+x2+b2)) ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2862
  inline void z_cdb(FloatRegister r1, const Address &a);                      // compare (r1, *(d2_imm12+x2+b2)) ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2863
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2864
  // load instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2865
  inline void z_le( FloatRegister r1, int64_t d2, Register x2, Register b2);   // load r1 = *(d2_uimm12+x2+b2) ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2866
  inline void z_ley(FloatRegister r1, int64_t d2, Register x2, Register b2);   // load r1 = *(d2_imm20+x2+b2)  ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2867
  inline void z_ld( FloatRegister r1, int64_t d2, Register x2, Register b2);   // load r1 = *(d2_uimm12+x2+b2) ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2868
  inline void z_ldy(FloatRegister r1, int64_t d2, Register x2, Register b2);   // load r1 = *(d2_imm20+x2+b2)  ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2869
  inline void z_le( FloatRegister r1, const Address &a);                       // load r1 = *(a)               ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2870
  inline void z_ley(FloatRegister r1, const Address &a);                       // load r1 = *(a)               ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2871
  inline void z_ld( FloatRegister r1, const Address &a);                       // load r1 = *(a)               ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2872
  inline void z_ldy(FloatRegister r1, const Address &a);                       // load r1 = *(a)               ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2873
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2874
  // store instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2875
  inline void z_ste( FloatRegister r1, int64_t d2, Register x2, Register b2);  // store *(d2_uimm12+x2+b2) = r1  ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2876
  inline void z_stey(FloatRegister r1, int64_t d2, Register x2, Register b2);  // store *(d2_imm20+x2+b2)  = r1  ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2877
  inline void z_std( FloatRegister r1, int64_t d2, Register x2, Register b2);  // store *(d2_uimm12+x2+b2) = r1  ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2878
  inline void z_stdy(FloatRegister r1, int64_t d2, Register x2, Register b2);  // store *(d2_imm20+x2+b2)  = r1  ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2879
  inline void z_ste( FloatRegister r1, const Address &a);                      // store *(a)               = r1  ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2880
  inline void z_stey(FloatRegister r1, const Address &a);                      // store *(a)               = r1  ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2881
  inline void z_std( FloatRegister r1, const Address &a);                      // store *(a)               = r1  ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2882
  inline void z_stdy(FloatRegister r1, const Address &a);                      // store *(a)               = r1  ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2883
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2884
  // load and store immediates
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2885
  inline void z_lzer(FloatRegister r1);                                 // r1 = 0     ; single
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2886
  inline void z_lzdr(FloatRegister r1);                                 // r1 = 0     ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2887
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2888
  // Move and Convert instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2889
  inline void z_ler(FloatRegister r1, FloatRegister r2);                // move         r1 = r2 ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2890
  inline void z_ldr(FloatRegister r1, FloatRegister r2);                // move         r1 = r2 ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2891
  inline void z_ledbr(FloatRegister r1, FloatRegister r2);              // conv / round r1 = r2 ; float <- double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2892
  inline void z_ldebr(FloatRegister r1, FloatRegister r2);              // conv         r1 = r2 ; double <- float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2893
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2894
  // move between integer and float registers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2895
  inline void z_cefbr( FloatRegister r1, Register r2);                  // r1 = r2; float  <-- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2896
  inline void z_cdfbr( FloatRegister r1, Register r2);                  // r1 = r2; double <-- int32
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2897
  inline void z_cegbr( FloatRegister r1, Register r2);                  // r1 = r2; float  <-- int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2898
  inline void z_cdgbr( FloatRegister r1, Register r2);                  // r1 = r2; double <-- int64
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2899
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2900
  // rounding mode for float-2-int conversions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2901
  inline void z_cfebr(Register r1, FloatRegister r2, RoundingMode m);   // conv r1 = r2  ; int32 <-- float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2902
  inline void z_cfdbr(Register r1, FloatRegister r2, RoundingMode m);   // conv r1 = r2  ; int32 <-- double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2903
  inline void z_cgebr(Register r1, FloatRegister r2, RoundingMode m);   // conv r1 = r2  ; int64 <-- float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2904
  inline void z_cgdbr(Register r1, FloatRegister r2, RoundingMode m);   // conv r1 = r2  ; int64 <-- double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2905
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2906
  inline void z_ldgr(FloatRegister r1, Register r2);   // fr1 = r2  ; what kind of conversion?  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2907
  inline void z_lgdr(Register r1, FloatRegister r2);   // r1  = fr2 ; what kind of conversion?  -- z10
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2908
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2909
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2910
  // ADD
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2911
  inline void z_aebr(FloatRegister f1, FloatRegister f2);                      // f1 = f1 + f2               ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2912
  inline void z_adbr(FloatRegister f1, FloatRegister f2);                      // f1 = f1 + f2               ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2913
  inline void z_aeb( FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 + *(d2+x2+b2)      ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2914
  inline void z_adb( FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 + *(d2+x2+b2)      ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2915
  inline void z_aeb( FloatRegister f1, const Address& a);                      // f1 = f1 + *(a)             ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2916
  inline void z_adb( FloatRegister f1, const Address& a);                      // f1 = f1 + *(a)             ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2917
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2918
  // SUB
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2919
  inline void z_sebr(FloatRegister f1, FloatRegister f2);                      // f1 = f1 - f2               ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2920
  inline void z_sdbr(FloatRegister f1, FloatRegister f2);                      // f1 = f1 - f2               ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2921
  inline void z_seb( FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 - *(d2+x2+b2)      ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2922
  inline void z_sdb( FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 - *(d2+x2+b2)      ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2923
  inline void z_seb( FloatRegister f1, const Address& a);                      // f1 = f1 - *(a)             ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2924
  inline void z_sdb( FloatRegister f1, const Address& a);                      // f1 = f1 - *(a)             ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2925
  // negate
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2926
  inline void z_lcebr(FloatRegister r1, FloatRegister r2);                     // neg r1 = -r2   ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2927
  inline void z_lcdbr(FloatRegister r1, FloatRegister r2);                     // neg r1 = -r2   ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2928
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2929
  // Absolute value, monadic if fr2 == noreg.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2930
  inline void z_lpdbr( FloatRegister fr1, FloatRegister fr2 = fnoreg);         // fr1 = |fr2|
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2931
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2932
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2933
  // MUL
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2934
  inline void z_meebr(FloatRegister f1, FloatRegister f2);                      // f1 = f1 * f2               ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2935
  inline void z_mdbr( FloatRegister f1, FloatRegister f2);                      // f1 = f1 * f2               ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2936
  inline void z_meeb( FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 * *(d2+x2+b2)      ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2937
  inline void z_mdb(  FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 * *(d2+x2+b2)      ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2938
  inline void z_meeb( FloatRegister f1, const Address& a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2939
  inline void z_mdb(  FloatRegister f1, const Address& a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2940
42897
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
  2941
  // MUL-ADD
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
  2942
  inline void z_maebr(FloatRegister f1, FloatRegister f3, FloatRegister f2);    // f1 = f3 * f2 + f1          ; float
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
  2943
  inline void z_madbr(FloatRegister f1, FloatRegister f3, FloatRegister f2);    // f1 = f3 * f2 + f1          ; double
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
  2944
  inline void z_msebr(FloatRegister f1, FloatRegister f3, FloatRegister f2);    // f1 = f3 * f2 - f1          ; float
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
  2945
  inline void z_msdbr(FloatRegister f1, FloatRegister f3, FloatRegister f2);    // f1 = f3 * f2 - f1          ; double
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
  2946
  inline void z_maeb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) + f1 ; float
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
  2947
  inline void z_madb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) + f1 ; double
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
  2948
  inline void z_mseb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) - f1 ; float
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
  2949
  inline void z_msdb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) - f1 ; double
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
  2950
  inline void z_maeb(FloatRegister f1, FloatRegister f3, const Address& a);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
  2951
  inline void z_madb(FloatRegister f1, FloatRegister f3, const Address& a);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
  2952
  inline void z_mseb(FloatRegister f1, FloatRegister f3, const Address& a);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
  2953
  inline void z_msdb(FloatRegister f1, FloatRegister f3, const Address& a);
57e7b1c75d17 8171398: s390x: Make interpreter's math entries consistent with C1 and C2 and support FMA
mdoerr
parents: 42065
diff changeset
  2954
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2955
  // DIV
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2956
  inline void z_debr( FloatRegister f1, FloatRegister f2);                      // f1 = f1 / f2               ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2957
  inline void z_ddbr( FloatRegister f1, FloatRegister f2);                      // f1 = f1 / f2               ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2958
  inline void z_deb(  FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 / *(d2+x2+b2)      ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2959
  inline void z_ddb(  FloatRegister f1, int64_t d2, Register x2, Register b2);  // f1 = f1 / *(d2+x2+b2)      ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2960
  inline void z_deb(  FloatRegister f1, const Address& a);                      // f1 = f1 / *(a)             ; float
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2961
  inline void z_ddb(  FloatRegister f1, const Address& a);                      // f1 = f1 / *(a)             ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2962
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2963
  // square root
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2964
  inline void z_sqdbr(FloatRegister fr1, FloatRegister fr2);                    // fr1 = sqrt(fr2)            ; double
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2965
  inline void z_sqdb( FloatRegister fr1, int64_t d2, Register x2, Register b2); // fr1 = srqt( *(d2+x2+b2)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2966
  inline void z_sqdb( FloatRegister fr1, int64_t d2, Register b2);              // fr1 = srqt( *(d2+b2)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2967
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2968
  // Nop instruction
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2969
  // ===============
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2970
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2971
  // branch never (nop)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2972
  inline void z_nop();
50423
82599d53dd6d 8204345: [s390]: no precompiled headers build broken
mdoerr
parents: 49364
diff changeset
  2973
  inline void nop(); // Used by shared code.
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2974
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2975
  // ===============================================================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2976
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2977
  // Simplified emitters:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2978
  // ====================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2979
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2980
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2981
  // Some memory instructions without index register (just convenience).
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2982
  inline void z_layz(Register r1, int64_t d2, Register b2 = Z_R0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2983
  inline void z_lay(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2984
  inline void z_laz(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2985
  inline void z_la(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2986
  inline void z_l(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2987
  inline void z_ly(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2988
  inline void z_lg(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2989
  inline void z_st(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2990
  inline void z_sty(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2991
  inline void z_stg(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2992
  inline void z_lgf(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2993
  inline void z_lgh(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2994
  inline void z_llgh(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2995
  inline void z_llgf(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2996
  inline void z_lgb(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2997
  inline void z_cl( Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2998
  inline void z_c(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  2999
  inline void z_cg(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3000
  inline void z_sh(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3001
  inline void z_shy(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3002
  inline void z_ste(FloatRegister r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3003
  inline void z_std(FloatRegister r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3004
  inline void z_stdy(FloatRegister r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3005
  inline void z_stey(FloatRegister r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3006
  inline void z_ld(FloatRegister r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3007
  inline void z_ldy(FloatRegister r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3008
  inline void z_le(FloatRegister r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3009
  inline void z_ley(FloatRegister r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3010
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3011
  inline void z_agf(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3012
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3013
  inline void z_exrl(Register r1, Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3014
  inline void z_larl(Register r1, Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3015
  inline void z_bru( Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3016
  inline void z_brul(Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3017
  inline void z_brul(address a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3018
  inline void z_brh( Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3019
  inline void z_brl( Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3020
  inline void z_bre( Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3021
  inline void z_brnh(Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3022
  inline void z_brnl(Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3023
  inline void z_brne(Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3024
  inline void z_brz( Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3025
  inline void z_brnz(Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3026
  inline void z_brnaz(Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3027
  inline void z_braz(Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3028
  inline void z_brnp(Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3029
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3030
  inline void z_btrue( Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3031
  inline void z_bfalse(Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3032
48331
a8e39cc7b88f 8193443: [s390]: EncodeISOArray generates wrong vector code
lucy
parents: 48094
diff changeset
  3033
  inline void z_bvat(Label& L);   // all true
a8e39cc7b88f 8193443: [s390]: EncodeISOArray generates wrong vector code
lucy
parents: 48094
diff changeset
  3034
  inline void z_bvnt(Label& L);   // not all true (mixed or all false)
a8e39cc7b88f 8193443: [s390]: EncodeISOArray generates wrong vector code
lucy
parents: 48094
diff changeset
  3035
  inline void z_bvmix(Label& L);  // mixed true and false
a8e39cc7b88f 8193443: [s390]: EncodeISOArray generates wrong vector code
lucy
parents: 48094
diff changeset
  3036
  inline void z_bvaf(Label& L);   // not all false (mixed or all true)
a8e39cc7b88f 8193443: [s390]: EncodeISOArray generates wrong vector code
lucy
parents: 48094
diff changeset
  3037
  inline void z_bvnf(Label& L);   // all false
a8e39cc7b88f 8193443: [s390]: EncodeISOArray generates wrong vector code
lucy
parents: 48094
diff changeset
  3038
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3039
  inline void z_brno( Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3040
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3041
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3042
  inline void z_basr(Register r1, Register r2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3043
  inline void z_brasl(Register r1, address a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3044
  inline void z_brct(Register r1, address a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3045
  inline void z_brct(Register r1, Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3046
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3047
  inline void z_brxh(Register r1, Register r3, address a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3048
  inline void z_brxh(Register r1, Register r3, Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3049
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3050
  inline void z_brxle(Register r1, Register r3, address a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3051
  inline void z_brxle(Register r1, Register r3, Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3052
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3053
  inline void z_brxhg(Register r1, Register r3, address a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3054
  inline void z_brxhg(Register r1, Register r3, Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3055
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3056
  inline void z_brxlg(Register r1, Register r3, address a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3057
  inline void z_brxlg(Register r1, Register r3, Label& L);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3058
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3059
  // Ppopulation count intrinsics.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3060
  inline void z_flogr(Register r1, Register r2);    // find leftmost one
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3061
  inline void z_popcnt(Register r1, Register r2);   // population count
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3062
  inline void z_ahhhr(Register r1, Register r2, Register r3);   // ADD halfword high high
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3063
  inline void z_ahhlr(Register r1, Register r2, Register r3);   // ADD halfword high low
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3064
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3065
  inline void z_tam();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3066
  inline void z_stckf(int64_t d2, Register b2);
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
  3067
  inline void z_stm( Register r1, Register r3, int64_t d2, Register b2);
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
  3068
  inline void z_stmy(Register r1, Register r3, int64_t d2, Register b2);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3069
  inline void z_stmg(Register r1, Register r3, int64_t d2, Register b2);
48094
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
  3070
  inline void z_lm( Register r1, Register r3, int64_t d2, Register b2);
bca569f79fa1 8189793: [s390]: Improve String compress/inflate by exploiting vector instructions
lucy
parents: 47675
diff changeset
  3071
  inline void z_lmy(Register r1, Register r3, int64_t d2, Register b2);
42065
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3072
  inline void z_lmg(Register r1, Register r3, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3073
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3074
  inline void z_cs( Register r1, Register r3, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3075
  inline void z_csy(Register r1, Register r3, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3076
  inline void z_csg(Register r1, Register r3, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3077
  inline void z_cs( Register r1, Register r3, const Address& a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3078
  inline void z_csy(Register r1, Register r3, const Address& a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3079
  inline void z_csg(Register r1, Register r3, const Address& a);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3080
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3081
  inline void z_cvd(Register r1, int64_t d2, Register x2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3082
  inline void z_cvdg(Register r1, int64_t d2, Register x2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3083
  inline void z_cvd(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3084
  inline void z_cvdg(Register r1, int64_t d2, Register b2);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3085
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3086
  // Instruction queries:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3087
  // instruction properties and recognize emitted instructions
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3088
  // ===========================================================
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3089
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3090
  static int nop_size() { return 2; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3091
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3092
  static int z_brul_size() { return 6; }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3093
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3094
  static bool is_z_basr(short x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3095
    return (BASR_ZOPC == (x & BASR_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3096
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3097
  static bool is_z_algr(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3098
    return (ALGR_ZOPC == (x & RRE_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3099
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3100
  static bool is_z_lb(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3101
    return (LB_ZOPC == (x & LB_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3102
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3103
  static bool is_z_lh(int x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3104
    return (LH_ZOPC == (x & LH_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3105
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3106
  static bool is_z_l(int x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3107
    return (L_ZOPC == (x & L_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3108
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3109
  static bool is_z_lgr(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3110
    return (LGR_ZOPC == (x & RRE_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3111
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3112
  static bool is_z_ly(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3113
    return (LY_ZOPC == (x & LY_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3114
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3115
  static bool is_z_lg(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3116
    return (LG_ZOPC == (x & LG_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3117
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3118
  static bool is_z_llgh(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3119
    return (LLGH_ZOPC == (x & LLGH_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3120
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3121
  static bool is_z_llgf(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3122
    return (LLGF_ZOPC == (x & LLGF_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3123
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3124
  static bool is_z_le(int x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3125
    return (LE_ZOPC == (x & LE_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3126
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3127
  static bool is_z_ld(int x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3128
    return (LD_ZOPC == (x & LD_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3129
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3130
  static bool is_z_st(int x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3131
    return (ST_ZOPC == (x & ST_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3132
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3133
  static bool is_z_stc(int x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3134
    return (STC_ZOPC == (x & STC_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3135
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3136
  static bool is_z_stg(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3137
    return (STG_ZOPC == (x & STG_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3138
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3139
  static bool is_z_sth(int x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3140
    return (STH_ZOPC == (x & STH_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3141
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3142
  static bool is_z_ste(int x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3143
    return (STE_ZOPC == (x & STE_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3144
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3145
  static bool is_z_std(int x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3146
    return (STD_ZOPC == (x & STD_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3147
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3148
  static bool is_z_slag(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3149
    return (SLAG_ZOPC == (x & SLAG_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3150
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3151
  static bool is_z_tmy(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3152
    return (TMY_ZOPC == (x & TMY_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3153
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3154
  static bool is_z_tm(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3155
    return ((unsigned int)TM_ZOPC == (x & (unsigned int)TM_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3156
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3157
  static bool is_z_bcr(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3158
    return (BCR_ZOPC == (x & BCR_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3159
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3160
  static bool is_z_nop(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3161
    return is_z_bcr(x) && ((x & 0x00ff) == 0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3162
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3163
  static bool is_z_nop(address x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3164
    return is_z_nop(* (short *) x);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3165
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3166
  static bool is_z_br(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3167
    return is_z_bcr(x) && ((x & 0x00f0) == 0x00f0);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3168
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3169
  static bool is_z_brc(long x, int cond) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3170
    return ((unsigned int)BRC_ZOPC == (x & BRC_MASK)) && ((cond<<20) == (x & 0x00f00000U));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3171
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3172
  // Make use of lightweight sync.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3173
  static bool is_z_sync_full(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3174
    return is_z_bcr(x) && (((x & 0x00f0)>>4)==bcondFullSync) && ((x & 0x000f)==0x0000);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3175
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3176
  static bool is_z_sync_light(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3177
    return is_z_bcr(x) && (((x & 0x00f0)>>4)==bcondLightSync) && ((x & 0x000f)==0x0000);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3178
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3179
  static bool is_z_sync(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3180
    return is_z_sync_full(x) || is_z_sync_light(x);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3181
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3182
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3183
  static bool is_z_brasl(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3184
    return (BRASL_ZOPC == (x & BRASL_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3185
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3186
  static bool is_z_brasl(address a) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3187
  long x = (*((long *)a))>>16;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3188
   return is_z_brasl(x);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3189
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3190
  static bool is_z_larl(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3191
    return (LARL_ZOPC == (x & LARL_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3192
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3193
  static bool is_z_lgrl(long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3194
    return (LGRL_ZOPC == (x & LGRL_MASK));
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3195
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3196
  static bool is_z_lgrl(address a) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3197
  long x = (*((long *)a))>>16;
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3198
   return is_z_lgrl(x);
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
  static bool is_z_lghi(unsigned long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3202
    return (unsigned int)LGHI_ZOPC == (x & (unsigned int)LGHI_MASK);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3203
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3204
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3205
  static bool is_z_llill(unsigned long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3206
    return (unsigned int)LLILL_ZOPC == (x & (unsigned int)LLI_MASK);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3207
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3208
  static bool is_z_llilh(unsigned long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3209
    return (unsigned int)LLILH_ZOPC == (x & (unsigned int)LLI_MASK);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3210
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3211
  static bool is_z_llihl(unsigned long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3212
    return (unsigned int)LLIHL_ZOPC == (x & (unsigned int)LLI_MASK);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3213
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3214
  static bool is_z_llihh(unsigned long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3215
    return (unsigned int)LLIHH_ZOPC == (x & (unsigned int)LLI_MASK);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3216
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3217
  static bool is_z_llilf(unsigned long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3218
    return LLILF_ZOPC == (x & LLIF_MASK);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3219
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3220
  static bool is_z_llihf(unsigned long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3221
    return LLIHF_ZOPC == (x & LLIF_MASK);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3222
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3223
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3224
  static bool is_z_iill(unsigned long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3225
    return (unsigned int)IILL_ZOPC == (x & (unsigned int)II_MASK);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3226
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3227
  static bool is_z_iilh(unsigned long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3228
    return (unsigned int)IILH_ZOPC == (x & (unsigned int)II_MASK);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3229
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3230
  static bool is_z_iihl(unsigned long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3231
    return (unsigned int)IIHL_ZOPC == (x & (unsigned int)II_MASK);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3232
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3233
  static bool is_z_iihh(unsigned long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3234
    return (unsigned int)IIHH_ZOPC == (x & (unsigned int)II_MASK);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3235
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3236
  static bool is_z_iilf(unsigned long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3237
    return IILF_ZOPC == (x & IIF_MASK);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3238
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3239
  static bool is_z_iihf(unsigned long x) {
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3240
    return IIHF_ZOPC == (x & IIF_MASK);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3241
  }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3242
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3243
  static inline bool is_equal(unsigned long inst, unsigned long idef);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3244
  static inline bool is_equal(unsigned long inst, unsigned long idef, unsigned long imask);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3245
  static inline bool is_equal(address iloc, unsigned long idef);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3246
  static inline bool is_equal(address iloc, unsigned long idef, unsigned long imask);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3247
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3248
  static inline bool is_sigtrap_range_check(address pc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3249
  static inline bool is_sigtrap_zero_check(address pc);
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3250
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3251
  //-----------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3252
  // memory barriers
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3253
  //-----------------
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3254
  // machine barrier instructions:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3255
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3256
  // - z_sync            Two-way memory barrier, aka fence.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3257
  //                     Only load-after-store-order is not guaranteed in the
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3258
  //                     z/Architecture memory model, i.e. only 'fence' is needed.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3259
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3260
  // semantic barrier instructions:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3261
  // (as defined in orderAccess.hpp)
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3262
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3263
  // - z_release         orders Store|Store,   empty implementation
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3264
  //                            Load|Store
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3265
  // - z_acquire         orders Load|Store,    empty implementation
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3266
  //                            Load|Load
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3267
  // - z_fence           orders Store|Store,   implemented as z_sync.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3268
  //                            Load|Store,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3269
  //                            Load|Load,
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3270
  //                            Store|Load
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3271
  //
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3272
  // For this implementation to be correct, we need H/W fixes on (very) old H/W:
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3273
  //          For z990, it is Driver-55:  MCL232 in the J13484 (i390/ML) Stream.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3274
  //          For z9,   it is Driver-67:  MCL065 in the G40963 (i390/ML) Stream.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3275
  // These drivers are a prereq. Otherwise, memory synchronization will not work.
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3276
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3277
  inline void z_sync();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3278
  inline void z_release();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3279
  inline void z_acquire();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3280
  inline void z_fence();
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3281
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3282
  // Creation
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3283
  Assembler(CodeBuffer* code) : AbstractAssembler(code) { }
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3284
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3285
};
6032b31e3719 8167673: [s390] The s390 port.
goetz
parents:
diff changeset
  3286
53244
9807daeb47c4 8216167: Update include guards to reflect correct directories
coleenp
parents: 51966
diff changeset
  3287
#endif // CPU_S390_ASSEMBLER_S390_HPP