src/share/vm/opto/regmask.cpp

Wed, 10 Aug 2016 14:59:21 +0200

author
simonis
date
Wed, 10 Aug 2016 14:59:21 +0200
changeset 8608
0d78aecb0948
parent 7598
ddce0b7cee93
child 7994
04ff2f6cd0eb
permissions
-rw-r--r--

8152172: PPC64: Support AES intrinsics
Summary: Add support for AES intrinsics on PPC64.
Reviewed-by: kvn, mdoerr, simonis, zmajo
Contributed-by: Hiroshi H Horii <horii@jp.ibm.com>

     1 /*
     2  * Copyright (c) 1997, 2015, 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  */
    25 #include "precompiled.hpp"
    26 #include "opto/compile.hpp"
    27 #include "opto/regmask.hpp"
    28 #if defined AD_MD_HPP
    29 # include AD_MD_HPP
    30 #elif defined TARGET_ARCH_MODEL_x86_32
    31 # include "adfiles/ad_x86_32.hpp"
    32 #elif defined TARGET_ARCH_MODEL_x86_64
    33 # include "adfiles/ad_x86_64.hpp"
    34 #elif defined TARGET_ARCH_MODEL_sparc
    35 # include "adfiles/ad_sparc.hpp"
    36 #elif defined TARGET_ARCH_MODEL_zero
    37 # include "adfiles/ad_zero.hpp"
    38 #elif defined TARGET_ARCH_MODEL_ppc_64
    39 # include "adfiles/ad_ppc_64.hpp"
    40 #endif
    42 #define RM_SIZE _RM_SIZE /* a constant private to the class RegMask */
    44 //-------------Non-zero bit search methods used by RegMask---------------------
    45 // Find lowest 1, or return 32 if empty
    46 int find_lowest_bit( uint32 mask ) {
    47   int n = 0;
    48   if( (mask & 0xffff) == 0 ) {
    49     mask >>= 16;
    50     n += 16;
    51   }
    52   if( (mask & 0xff) == 0 ) {
    53     mask >>= 8;
    54     n += 8;
    55   }
    56   if( (mask & 0xf) == 0 ) {
    57     mask >>= 4;
    58     n += 4;
    59   }
    60   if( (mask & 0x3) == 0 ) {
    61     mask >>= 2;
    62     n += 2;
    63   }
    64   if( (mask & 0x1) == 0 ) {
    65     mask >>= 1;
    66      n += 1;
    67   }
    68   if( mask == 0 ) {
    69     n = 32;
    70   }
    71   return n;
    72 }
    74 // Find highest 1, or return 32 if empty
    75 int find_hihghest_bit( uint32 mask ) {
    76   int n = 0;
    77   if( mask > 0xffff ) {
    78     mask >>= 16;
    79     n += 16;
    80   }
    81   if( mask > 0xff ) {
    82     mask >>= 8;
    83     n += 8;
    84   }
    85   if( mask > 0xf ) {
    86     mask >>= 4;
    87     n += 4;
    88   }
    89   if( mask > 0x3 ) {
    90     mask >>= 2;
    91     n += 2;
    92   }
    93   if( mask > 0x1 ) {
    94     mask >>= 1;
    95     n += 1;
    96   }
    97   if( mask == 0 ) {
    98     n = 32;
    99   }
   100   return n;
   101 }
   103 //------------------------------dump-------------------------------------------
   105 #ifndef PRODUCT
   106 void OptoReg::dump(int r, outputStream *st) {
   107   switch (r) {
   108   case Special: st->print("r---"); break;
   109   case Bad:     st->print("rBAD"); break;
   110   default:
   111     if (r < _last_Mach_Reg) st->print("%s", Matcher::regName[r]);
   112     else st->print("rS%d",r);
   113     break;
   114   }
   115 }
   116 #endif
   119 //=============================================================================
   120 const RegMask RegMask::Empty(
   121 # define BODY(I) 0,
   122   FORALL_BODY
   123 # undef BODY
   124   0
   125 );
   127 //=============================================================================
   128 bool RegMask::is_vector(uint ireg) {
   129   return (ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY);
   130 }
   132 int RegMask::num_registers(uint ireg) {
   133     switch(ireg) {
   134       case Op_VecY:
   135         return 8;
   136       case Op_VecX:
   137         return 4;
   138       case Op_VecD:
   139       case Op_RegD:
   140       case Op_RegL:
   141 #ifdef _LP64
   142       case Op_RegP:
   143 #endif
   144         return 2;
   145     }
   146     // Op_VecS and the rest ideal registers.
   147     return 1;
   148 }
   150 //------------------------------find_first_pair--------------------------------
   151 // Find the lowest-numbered register pair in the mask.  Return the
   152 // HIGHEST register number in the pair, or BAD if no pairs.
   153 OptoReg::Name RegMask::find_first_pair() const {
   154   verify_pairs();
   155   for( int i = 0; i < RM_SIZE; i++ ) {
   156     if( _A[i] ) {               // Found some bits
   157       int bit = _A[i] & -_A[i]; // Extract low bit
   158       // Convert to bit number, return hi bit in pair
   159       return OptoReg::Name((i<<_LogWordBits)+find_lowest_bit(bit)+1);
   160     }
   161   }
   162   return OptoReg::Bad;
   163 }
   165 //------------------------------ClearToPairs-----------------------------------
   166 // Clear out partial bits; leave only bit pairs
   167 void RegMask::clear_to_pairs() {
   168   for( int i = 0; i < RM_SIZE; i++ ) {
   169     int bits = _A[i];
   170     bits &= ((bits & 0x55555555)<<1); // 1 hi-bit set for each pair
   171     bits |= (bits>>1);          // Smear 1 hi-bit into a pair
   172     _A[i] = bits;
   173   }
   174   verify_pairs();
   175 }
   177 //------------------------------SmearToPairs-----------------------------------
   178 // Smear out partial bits; leave only bit pairs
   179 void RegMask::smear_to_pairs() {
   180   for( int i = 0; i < RM_SIZE; i++ ) {
   181     int bits = _A[i];
   182     bits |= ((bits & 0x55555555)<<1); // Smear lo bit hi per pair
   183     bits |= ((bits & 0xAAAAAAAA)>>1); // Smear hi bit lo per pair
   184     _A[i] = bits;
   185   }
   186   verify_pairs();
   187 }
   189 //------------------------------is_aligned_pairs-------------------------------
   190 bool RegMask::is_aligned_pairs() const {
   191   // Assert that the register mask contains only bit pairs.
   192   for( int i = 0; i < RM_SIZE; i++ ) {
   193     int bits = _A[i];
   194     while( bits ) {             // Check bits for pairing
   195       int bit = bits & -bits;   // Extract low bit
   196       // Low bit is not odd means its mis-aligned.
   197       if( (bit & 0x55555555) == 0 ) return false;
   198       bits -= bit;              // Remove bit from mask
   199       // Check for aligned adjacent bit
   200       if( (bits & (bit<<1)) == 0 ) return false;
   201       bits -= (bit<<1);         // Remove other halve of pair
   202     }
   203   }
   204   return true;
   205 }
   207 //------------------------------is_bound1--------------------------------------
   208 // Return TRUE if the mask contains a single bit
   209 int RegMask::is_bound1() const {
   210   if( is_AllStack() ) return false;
   211   int bit = -1;                 // Set to hold the one bit allowed
   212   for( int i = 0; i < RM_SIZE; i++ ) {
   213     if( _A[i] ) {               // Found some bits
   214       if( bit != -1 ) return false; // Already had bits, so fail
   215       bit = _A[i] & -_A[i];     // Extract 1 bit from mask
   216       if( bit != _A[i] ) return false; // Found many bits, so fail
   217     }
   218   }
   219   // True for both the empty mask and for a single bit
   220   return true;
   221 }
   223 //------------------------------is_bound2--------------------------------------
   224 // Return TRUE if the mask contains an adjacent pair of bits and no other bits.
   225 int RegMask::is_bound_pair() const {
   226   if( is_AllStack() ) return false;
   228   int bit = -1;                 // Set to hold the one bit allowed
   229   for( int i = 0; i < RM_SIZE; i++ ) {
   230     if( _A[i] ) {               // Found some bits
   231       if( bit != -1 ) return false; // Already had bits, so fail
   232       bit = _A[i] & -(_A[i]);   // Extract 1 bit from mask
   233       if( (bit << 1) != 0 ) {   // Bit pair stays in same word?
   234         if( (bit | (bit<<1)) != _A[i] )
   235           return false;         // Require adjacent bit pair and no more bits
   236       } else {                  // Else its a split-pair case
   237         if( bit != _A[i] ) return false; // Found many bits, so fail
   238         i++;                    // Skip iteration forward
   239         if( i >= RM_SIZE || _A[i] != 1 )
   240           return false; // Require 1 lo bit in next word
   241       }
   242     }
   243   }
   244   // True for both the empty mask and for a bit pair
   245   return true;
   246 }
   248 static int low_bits[3] = { 0x55555555, 0x11111111, 0x01010101 };
   249 //------------------------------find_first_set---------------------------------
   250 // Find the lowest-numbered register set in the mask.  Return the
   251 // HIGHEST register number in the set, or BAD if no sets.
   252 // Works also for size 1.
   253 OptoReg::Name RegMask::find_first_set(const int size) const {
   254   verify_sets(size);
   255   for (int i = 0; i < RM_SIZE; i++) {
   256     if (_A[i]) {                // Found some bits
   257       int bit = _A[i] & -_A[i]; // Extract low bit
   258       // Convert to bit number, return hi bit in pair
   259       return OptoReg::Name((i<<_LogWordBits)+find_lowest_bit(bit)+(size-1));
   260     }
   261   }
   262   return OptoReg::Bad;
   263 }
   265 //------------------------------clear_to_sets----------------------------------
   266 // Clear out partial bits; leave only aligned adjacent bit pairs
   267 void RegMask::clear_to_sets(const int size) {
   268   if (size == 1) return;
   269   assert(2 <= size && size <= 8, "update low bits table");
   270   assert(is_power_of_2(size), "sanity");
   271   int low_bits_mask = low_bits[size>>2];
   272   for (int i = 0; i < RM_SIZE; i++) {
   273     int bits = _A[i];
   274     int sets = (bits & low_bits_mask);
   275     for (int j = 1; j < size; j++) {
   276       sets = (bits & (sets<<1)); // filter bits which produce whole sets
   277     }
   278     sets |= (sets>>1);           // Smear 1 hi-bit into a set
   279     if (size > 2) {
   280       sets |= (sets>>2);         // Smear 2 hi-bits into a set
   281       if (size > 4) {
   282         sets |= (sets>>4);       // Smear 4 hi-bits into a set
   283       }
   284     }
   285     _A[i] = sets;
   286   }
   287   verify_sets(size);
   288 }
   290 //------------------------------smear_to_sets----------------------------------
   291 // Smear out partial bits to aligned adjacent bit sets
   292 void RegMask::smear_to_sets(const int size) {
   293   if (size == 1) return;
   294   assert(2 <= size && size <= 8, "update low bits table");
   295   assert(is_power_of_2(size), "sanity");
   296   int low_bits_mask = low_bits[size>>2];
   297   for (int i = 0; i < RM_SIZE; i++) {
   298     int bits = _A[i];
   299     int sets = 0;
   300     for (int j = 0; j < size; j++) {
   301       sets |= (bits & low_bits_mask);  // collect partial bits
   302       bits  = bits>>1;
   303     }
   304     sets |= (sets<<1);           // Smear 1 lo-bit  into a set
   305     if (size > 2) {
   306       sets |= (sets<<2);         // Smear 2 lo-bits into a set
   307       if (size > 4) {
   308         sets |= (sets<<4);       // Smear 4 lo-bits into a set
   309       }
   310     }
   311     _A[i] = sets;
   312   }
   313   verify_sets(size);
   314 }
   316 //------------------------------is_aligned_set--------------------------------
   317 bool RegMask::is_aligned_sets(const int size) const {
   318   if (size == 1) return true;
   319   assert(2 <= size && size <= 8, "update low bits table");
   320   assert(is_power_of_2(size), "sanity");
   321   int low_bits_mask = low_bits[size>>2];
   322   // Assert that the register mask contains only bit sets.
   323   for (int i = 0; i < RM_SIZE; i++) {
   324     int bits = _A[i];
   325     while (bits) {              // Check bits for pairing
   326       int bit = bits & -bits;   // Extract low bit
   327       // Low bit is not odd means its mis-aligned.
   328       if ((bit & low_bits_mask) == 0) return false;
   329       // Do extra work since (bit << size) may overflow.
   330       int hi_bit = bit << (size-1); // high bit
   331       int set = hi_bit + ((hi_bit-1) & ~(bit-1));
   332       // Check for aligned adjacent bits in this set
   333       if ((bits & set) != set) return false;
   334       bits -= set;  // Remove this set
   335     }
   336   }
   337   return true;
   338 }
   340 //------------------------------is_bound_set-----------------------------------
   341 // Return TRUE if the mask contains one adjacent set of bits and no other bits.
   342 // Works also for size 1.
   343 int RegMask::is_bound_set(const int size) const {
   344   if( is_AllStack() ) return false;
   345   assert(1 <= size && size <= 8, "update low bits table");
   346   int bit = -1;                 // Set to hold the one bit allowed
   347   for (int i = 0; i < RM_SIZE; i++) {
   348     if (_A[i] ) {               // Found some bits
   349       if (bit != -1)
   350        return false;            // Already had bits, so fail
   351       bit = _A[i] & -_A[i];     // Extract low bit from mask
   352       int hi_bit = bit << (size-1); // high bit
   353       if (hi_bit != 0) {        // Bit set stays in same word?
   354         int set = hi_bit + ((hi_bit-1) & ~(bit-1));
   355         if (set != _A[i])
   356           return false;         // Require adjacent bit set and no more bits
   357       } else {                  // Else its a split-set case
   358         if (((-1) & ~(bit-1)) != _A[i])
   359           return false;         // Found many bits, so fail
   360         i++;                    // Skip iteration forward and check high part
   361         // The lower 24 bits should be 0 since it is split case and size <= 8.
   362         int set = bit>>24;
   363         set = set & -set; // Remove sign extension.
   364         set = (((set << size) - 1) >> 8);
   365         if (i >= RM_SIZE || _A[i] != set)
   366           return false; // Require expected low bits in next word
   367       }
   368     }
   369   }
   370   // True for both the empty mask and for a bit set
   371   return true;
   372 }
   374 //------------------------------is_UP------------------------------------------
   375 // UP means register only, Register plus stack, or stack only is DOWN
   376 bool RegMask::is_UP() const {
   377   // Quick common case check for DOWN (any stack slot is legal)
   378   if( is_AllStack() )
   379     return false;
   380   // Slower check for any stack bits set (also DOWN)
   381   if( overlap(Matcher::STACK_ONLY_mask) )
   382     return false;
   383   // Not DOWN, so must be UP
   384   return true;
   385 }
   387 //------------------------------Size-------------------------------------------
   388 // Compute size of register mask in bits
   389 uint RegMask::Size() const {
   390   extern uint8 bitsInByte[256];
   391   uint sum = 0;
   392   for( int i = 0; i < RM_SIZE; i++ )
   393     sum +=
   394       bitsInByte[(_A[i]>>24) & 0xff] +
   395       bitsInByte[(_A[i]>>16) & 0xff] +
   396       bitsInByte[(_A[i]>> 8) & 0xff] +
   397       bitsInByte[ _A[i]      & 0xff];
   398   return sum;
   399 }
   401 #ifndef PRODUCT
   402 //------------------------------print------------------------------------------
   403 void RegMask::dump(outputStream *st) const {
   404   st->print("[");
   405   RegMask rm = *this;           // Structure copy into local temp
   407   OptoReg::Name start = rm.find_first_elem(); // Get a register
   408   if (OptoReg::is_valid(start)) { // Check for empty mask
   409     rm.Remove(start);           // Yank from mask
   410     OptoReg::dump(start, st);   // Print register
   411     OptoReg::Name last = start;
   413     // Now I have printed an initial register.
   414     // Print adjacent registers as "rX-rZ" instead of "rX,rY,rZ".
   415     // Begin looping over the remaining registers.
   416     while (1) {                 //
   417       OptoReg::Name reg = rm.find_first_elem(); // Get a register
   418       if (!OptoReg::is_valid(reg))
   419         break;                  // Empty mask, end loop
   420       rm.Remove(reg);           // Yank from mask
   422       if (last+1 == reg) {      // See if they are adjacent
   423         // Adjacent registers just collect into long runs, no printing.
   424         last = reg;
   425       } else {                  // Ending some kind of run
   426         if (start == last) {    // 1-register run; no special printing
   427         } else if (start+1 == last) {
   428           st->print(",");       // 2-register run; print as "rX,rY"
   429           OptoReg::dump(last, st);
   430         } else {                // Multi-register run; print as "rX-rZ"
   431           st->print("-");
   432           OptoReg::dump(last, st);
   433         }
   434         st->print(",");         // Seperate start of new run
   435         start = last = reg;     // Start a new register run
   436         OptoReg::dump(start, st); // Print register
   437       } // End of if ending a register run or not
   438     } // End of while regmask not empty
   440     if (start == last) {        // 1-register run; no special printing
   441     } else if (start+1 == last) {
   442       st->print(",");           // 2-register run; print as "rX,rY"
   443       OptoReg::dump(last, st);
   444     } else {                    // Multi-register run; print as "rX-rZ"
   445       st->print("-");
   446       OptoReg::dump(last, st);
   447     }
   448     if (rm.is_AllStack()) st->print("...");
   449   }
   450   st->print("]");
   451 }
   452 #endif

mercurial