< prev index next >

src/hotspot/share/opto/regmask.hpp

Print this page
rev 60615 : 8231441: Initial SVE backend support
Reviewed-by: adinn, pli
Contributed-by: joshua.zhu@arm.com, yang.zhang@arm.com, ningsheng.jian@arm.com
   1 /*
   2  * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #ifndef SHARE_OPTO_REGMASK_HPP
  26 #define SHARE_OPTO_REGMASK_HPP
  27 
  28 #include "code/vmreg.hpp"
  29 #include "opto/optoreg.hpp"
  30 #include "utilities/count_leading_zeros.hpp"
  31 #include "utilities/count_trailing_zeros.hpp"
  32 


  33 //-------------Non-zero bit search methods used by RegMask---------------------
  34 // Find lowest 1, undefined if empty/0
  35 static int find_lowest_bit(uint32_t mask) {
  36   return count_trailing_zeros(mask);
  37 }
  38 // Find highest 1, undefined if empty/0
  39 static int find_highest_bit(uint32_t mask) {
  40   return count_leading_zeros(mask) ^ 31;
  41 }
  42 
  43 //------------------------------RegMask----------------------------------------
  44 // The ADL file describes how to print the machine-specific registers, as well
  45 // as any notion of register classes.  We provide a register mask, which is
  46 // just a collection of Register numbers.
  47 
  48 // The ADLC defines 2 macros, RM_SIZE and FORALL_BODY.
  49 // RM_SIZE is the size of a register mask in words.
  50 // FORALL_BODY replicates a BODY macro once per word in the register mask.
  51 // The usage is somewhat clumsy and limited to the regmask.[h,c]pp files.
  52 // However, it means the ADLC can redefine the unroll macro and all loops


  74     _LogWordBits = LogBitsPerInt,
  75     _RM_SIZE     = RM_SIZE   // local constant, imported, then hidden by #undef
  76   };
  77 
  78  public:
  79   enum { CHUNK_SIZE = RM_SIZE*_WordBits };
  80 
  81   // SlotsPerLong is 2, since slots are 32 bits and longs are 64 bits.
  82   // Also, consider the maximum alignment size for a normally allocated
  83   // value.  Since we allocate register pairs but not register quads (at
  84   // present), this alignment is SlotsPerLong (== 2).  A normally
  85   // aligned allocated register is either a single register, or a pair
  86   // of adjacent registers, the lower-numbered being even.
  87   // See also is_aligned_Pairs() below, and the padding added before
  88   // Matcher::_new_SP to keep allocated pairs aligned properly.
  89   // If we ever go to quad-word allocations, SlotsPerQuad will become
  90   // the controlling alignment constraint.  Note that this alignment
  91   // requirement is internal to the allocator, and independent of any
  92   // particular platform.
  93   enum { SlotsPerLong = 2,

  94          SlotsPerVecS = 1,
  95          SlotsPerVecD = 2,
  96          SlotsPerVecX = 4,
  97          SlotsPerVecY = 8,
  98          SlotsPerVecZ = 16 };

  99 
 100   // A constructor only used by the ADLC output.  All mask fields are filled
 101   // in directly.  Calls to this look something like RM(1,2,3,4);
 102   RegMask(
 103 #   define BODY(I) int a##I,
 104     FORALL_BODY
 105 #   undef BODY
 106     int dummy = 0) {
 107 #   define BODY(I) _A[I] = a##I;
 108     FORALL_BODY
 109 #   undef BODY
 110     _lwm = 0;
 111     _hwm = RM_SIZE - 1;
 112     while (_hwm > 0 && _A[_hwm] == 0) _hwm--;
 113     while ((_lwm < _hwm) && _A[_lwm] == 0) _lwm++;
 114     assert(valid_watermarks(), "post-condition");
 115   }
 116 
 117   // Handy copying constructor
 118   RegMask(RegMask *rm) {


 202     }
 203     for (int i = _hwm + 1; i < RM_SIZE; i++) {
 204       assert(_A[i] == 0, "_hwm too low: %d regs at: %d", _hwm, i);
 205     }
 206     return true;
 207   }
 208 #endif // !ASSERT
 209 
 210   // Test that the mask contains only aligned adjacent bit pairs
 211   bool is_aligned_pairs() const;
 212 
 213   // mask is a pair of misaligned registers
 214   bool is_misaligned_pair() const;
 215   // Test for single register
 216   bool is_bound1() const;
 217   // Test for a single adjacent pair
 218   bool is_bound_pair() const;
 219   // Test for a single adjacent set of ideal register's size.
 220   bool is_bound(uint ireg) const;
 221 




 222   // Find the lowest-numbered register set in the mask.  Return the
 223   // HIGHEST register number in the set, or BAD if no sets.
 224   // Assert that the mask contains only bit sets.
 225   OptoReg::Name find_first_set(const int size) const;
 226 
 227   // Clear out partial bits; leave only aligned adjacent bit sets of size.
 228   void clear_to_sets(const int size);
 229   // Smear out partial bits to aligned adjacent bit sets.
 230   void smear_to_sets(const int size);
 231   // Test that the mask contains only aligned adjacent bit sets
 232   bool is_aligned_sets(const int size) const;
 233 
 234   // Test for a single adjacent set
 235   int is_bound_set(const int size) const;
 236 
 237   static bool is_vector(uint ireg);
 238   static int num_registers(uint ireg);

 239 
 240   // Fast overlap test.  Non-zero if any registers in common.
 241   int overlap(const RegMask &rm) const {
 242     assert(valid_watermarks() && rm.valid_watermarks(), "sanity");
 243     int hwm = MIN2(_hwm, rm._hwm);
 244     int lwm = MAX2(_lwm, rm._lwm);
 245     int result = 0;
 246     for (int i = lwm; i <= hwm; i++) {
 247       result |= _A[i] & rm._A[i];
 248     }
 249     return result;
 250   }
 251 
 252   // Special test for register pressure based splitting
 253   // UP means register only, Register plus stack, or stack only is DOWN
 254   bool is_UP() const;
 255 
 256   // Clear a register mask
 257   void Clear() {
 258     _lwm = RM_SIZE - 1;


   1 /*
   2  * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #ifndef SHARE_OPTO_REGMASK_HPP
  26 #define SHARE_OPTO_REGMASK_HPP
  27 
  28 #include "code/vmreg.hpp"
  29 #include "opto/optoreg.hpp"
  30 #include "utilities/count_leading_zeros.hpp"
  31 #include "utilities/count_trailing_zeros.hpp"
  32 
  33 class LRG;
  34 
  35 //-------------Non-zero bit search methods used by RegMask---------------------
  36 // Find lowest 1, undefined if empty/0
  37 static int find_lowest_bit(uint32_t mask) {
  38   return count_trailing_zeros(mask);
  39 }
  40 // Find highest 1, undefined if empty/0
  41 static int find_highest_bit(uint32_t mask) {
  42   return count_leading_zeros(mask) ^ 31;
  43 }
  44 
  45 //------------------------------RegMask----------------------------------------
  46 // The ADL file describes how to print the machine-specific registers, as well
  47 // as any notion of register classes.  We provide a register mask, which is
  48 // just a collection of Register numbers.
  49 
  50 // The ADLC defines 2 macros, RM_SIZE and FORALL_BODY.
  51 // RM_SIZE is the size of a register mask in words.
  52 // FORALL_BODY replicates a BODY macro once per word in the register mask.
  53 // The usage is somewhat clumsy and limited to the regmask.[h,c]pp files.
  54 // However, it means the ADLC can redefine the unroll macro and all loops


  76     _LogWordBits = LogBitsPerInt,
  77     _RM_SIZE     = RM_SIZE   // local constant, imported, then hidden by #undef
  78   };
  79 
  80  public:
  81   enum { CHUNK_SIZE = RM_SIZE*_WordBits };
  82 
  83   // SlotsPerLong is 2, since slots are 32 bits and longs are 64 bits.
  84   // Also, consider the maximum alignment size for a normally allocated
  85   // value.  Since we allocate register pairs but not register quads (at
  86   // present), this alignment is SlotsPerLong (== 2).  A normally
  87   // aligned allocated register is either a single register, or a pair
  88   // of adjacent registers, the lower-numbered being even.
  89   // See also is_aligned_Pairs() below, and the padding added before
  90   // Matcher::_new_SP to keep allocated pairs aligned properly.
  91   // If we ever go to quad-word allocations, SlotsPerQuad will become
  92   // the controlling alignment constraint.  Note that this alignment
  93   // requirement is internal to the allocator, and independent of any
  94   // particular platform.
  95   enum { SlotsPerLong = 2,
  96          SlotsPerVecA = 8,
  97          SlotsPerVecS = 1,
  98          SlotsPerVecD = 2,
  99          SlotsPerVecX = 4,
 100          SlotsPerVecY = 8,
 101          SlotsPerVecZ = 16,
 102          };
 103 
 104   // A constructor only used by the ADLC output.  All mask fields are filled
 105   // in directly.  Calls to this look something like RM(1,2,3,4);
 106   RegMask(
 107 #   define BODY(I) int a##I,
 108     FORALL_BODY
 109 #   undef BODY
 110     int dummy = 0) {
 111 #   define BODY(I) _A[I] = a##I;
 112     FORALL_BODY
 113 #   undef BODY
 114     _lwm = 0;
 115     _hwm = RM_SIZE - 1;
 116     while (_hwm > 0 && _A[_hwm] == 0) _hwm--;
 117     while ((_lwm < _hwm) && _A[_lwm] == 0) _lwm++;
 118     assert(valid_watermarks(), "post-condition");
 119   }
 120 
 121   // Handy copying constructor
 122   RegMask(RegMask *rm) {


 206     }
 207     for (int i = _hwm + 1; i < RM_SIZE; i++) {
 208       assert(_A[i] == 0, "_hwm too low: %d regs at: %d", _hwm, i);
 209     }
 210     return true;
 211   }
 212 #endif // !ASSERT
 213 
 214   // Test that the mask contains only aligned adjacent bit pairs
 215   bool is_aligned_pairs() const;
 216 
 217   // mask is a pair of misaligned registers
 218   bool is_misaligned_pair() const;
 219   // Test for single register
 220   bool is_bound1() const;
 221   // Test for a single adjacent pair
 222   bool is_bound_pair() const;
 223   // Test for a single adjacent set of ideal register's size.
 224   bool is_bound(uint ireg) const;
 225 
 226   // Check that whether given reg number with size is valid
 227   // for current regmask, where reg is the highest number.
 228   bool is_valid_reg(OptoReg::Name reg, const int size) const;
 229 
 230   // Find the lowest-numbered register set in the mask.  Return the
 231   // HIGHEST register number in the set, or BAD if no sets.
 232   // Assert that the mask contains only bit sets.
 233   OptoReg::Name find_first_set(LRG &lrg, const int size) const;
 234 
 235   // Clear out partial bits; leave only aligned adjacent bit sets of size.
 236   void clear_to_sets(const int size);
 237   // Smear out partial bits to aligned adjacent bit sets.
 238   void smear_to_sets(const int size);
 239   // Test that the mask contains only aligned adjacent bit sets
 240   bool is_aligned_sets(const int size) const;
 241 
 242   // Test for a single adjacent set
 243   int is_bound_set(const int size) const;
 244 
 245   static bool is_vector(uint ireg);
 246   static int num_registers(uint ireg);
 247   static int num_registers(uint ireg, LRG &lrg);
 248 
 249   // Fast overlap test.  Non-zero if any registers in common.
 250   int overlap(const RegMask &rm) const {
 251     assert(valid_watermarks() && rm.valid_watermarks(), "sanity");
 252     int hwm = MIN2(_hwm, rm._hwm);
 253     int lwm = MAX2(_lwm, rm._lwm);
 254     int result = 0;
 255     for (int i = lwm; i <= hwm; i++) {
 256       result |= _A[i] & rm._A[i];
 257     }
 258     return result;
 259   }
 260 
 261   // Special test for register pressure based splitting
 262   // UP means register only, Register plus stack, or stack only is DOWN
 263   bool is_UP() const;
 264 
 265   // Clear a register mask
 266   void Clear() {
 267     _lwm = RM_SIZE - 1;


< prev index next >