< prev index next >

src/share/vm/opto/regmask.cpp

Print this page




  97   case Bad:     st->print("rBAD"); break;
  98   default:
  99     if (r < _last_Mach_Reg) st->print("%s", Matcher::regName[r]);
 100     else st->print("rS%d",r);
 101     break;
 102   }
 103 }
 104 #endif
 105 
 106 
 107 //=============================================================================
 108 const RegMask RegMask::Empty(
 109 # define BODY(I) 0,
 110   FORALL_BODY
 111 # undef BODY
 112   0
 113 );
 114 
 115 //=============================================================================
 116 bool RegMask::is_vector(uint ireg) {
 117   return (ireg == Op_VecS || ireg == Op_VecD || ireg == Op_VecX || ireg == Op_VecY);

 118 }
 119 
 120 int RegMask::num_registers(uint ireg) {
 121     switch(ireg) {


 122       case Op_VecY:
 123         return 8;
 124       case Op_VecX:
 125         return 4;
 126       case Op_VecD:
 127       case Op_RegD:
 128       case Op_RegL:
 129 #ifdef _LP64
 130       case Op_RegP:
 131 #endif
 132         return 2;
 133     }
 134     // Op_VecS and the rest ideal registers.
 135     return 1;
 136 }
 137 
 138 //------------------------------find_first_pair--------------------------------
 139 // Find the lowest-numbered register pair in the mask.  Return the
 140 // HIGHEST register number in the pair, or BAD if no pairs.
 141 OptoReg::Name RegMask::find_first_pair() const {


 216   int bit = -1;                 // Set to hold the one bit allowed
 217   for( int i = 0; i < RM_SIZE; i++ ) {
 218     if( _A[i] ) {               // Found some bits
 219       if( bit != -1 ) return false; // Already had bits, so fail
 220       bit = _A[i] & -(_A[i]);   // Extract 1 bit from mask
 221       if( (bit << 1) != 0 ) {   // Bit pair stays in same word?
 222         if( (bit | (bit<<1)) != _A[i] )
 223           return false;         // Require adjacent bit pair and no more bits
 224       } else {                  // Else its a split-pair case
 225         if( bit != _A[i] ) return false; // Found many bits, so fail
 226         i++;                    // Skip iteration forward
 227         if( i >= RM_SIZE || _A[i] != 1 )
 228           return false; // Require 1 lo bit in next word
 229       }
 230     }
 231   }
 232   // True for both the empty mask and for a bit pair
 233   return true;
 234 }
 235 
 236 static int low_bits[3] = { 0x55555555, 0x11111111, 0x01010101 };

 237 //------------------------------find_first_set---------------------------------
 238 // Find the lowest-numbered register set in the mask.  Return the
 239 // HIGHEST register number in the set, or BAD if no sets.
 240 // Works also for size 1.
 241 OptoReg::Name RegMask::find_first_set(const int size) const {
 242   verify_sets(size);
 243   for (int i = 0; i < RM_SIZE; i++) {
 244     if (_A[i]) {                // Found some bits
 245       int bit = _A[i] & -_A[i]; // Extract low bit
 246       // Convert to bit number, return hi bit in pair
 247       return OptoReg::Name((i<<_LogWordBits)+find_lowest_bit(bit)+(size-1));
 248     }
 249   }
 250   return OptoReg::Bad;
 251 }
 252 
 253 //------------------------------clear_to_sets----------------------------------
 254 // Clear out partial bits; leave only aligned adjacent bit pairs
 255 void RegMask::clear_to_sets(const int size) {
 256   if (size == 1) return;
 257   assert(2 <= size && size <= 8, "update low bits table");
 258   assert(is_power_of_2(size), "sanity");
 259   int low_bits_mask = low_bits[size>>2];
 260   for (int i = 0; i < RM_SIZE; i++) {
 261     int bits = _A[i];
 262     int sets = (bits & low_bits_mask);
 263     for (int j = 1; j < size; j++) {
 264       sets = (bits & (sets<<1)); // filter bits which produce whole sets
 265     }
 266     sets |= (sets>>1);           // Smear 1 hi-bit into a set
 267     if (size > 2) {
 268       sets |= (sets>>2);         // Smear 2 hi-bits into a set
 269       if (size > 4) {
 270         sets |= (sets>>4);       // Smear 4 hi-bits into a set



 271       }
 272     }
 273     _A[i] = sets;
 274   }
 275   verify_sets(size);
 276 }
 277 
 278 //------------------------------smear_to_sets----------------------------------
 279 // Smear out partial bits to aligned adjacent bit sets
 280 void RegMask::smear_to_sets(const int size) {
 281   if (size == 1) return;
 282   assert(2 <= size && size <= 8, "update low bits table");
 283   assert(is_power_of_2(size), "sanity");
 284   int low_bits_mask = low_bits[size>>2];
 285   for (int i = 0; i < RM_SIZE; i++) {
 286     int bits = _A[i];
 287     int sets = 0;
 288     for (int j = 0; j < size; j++) {
 289       sets |= (bits & low_bits_mask);  // collect partial bits
 290       bits  = bits>>1;
 291     }
 292     sets |= (sets<<1);           // Smear 1 lo-bit  into a set
 293     if (size > 2) {
 294       sets |= (sets<<2);         // Smear 2 lo-bits into a set
 295       if (size > 4) {
 296         sets |= (sets<<4);       // Smear 4 lo-bits into a set



 297       }
 298     }
 299     _A[i] = sets;
 300   }
 301   verify_sets(size);
 302 }
 303 
 304 //------------------------------is_aligned_set--------------------------------
 305 bool RegMask::is_aligned_sets(const int size) const {
 306   if (size == 1) return true;
 307   assert(2 <= size && size <= 8, "update low bits table");
 308   assert(is_power_of_2(size), "sanity");
 309   int low_bits_mask = low_bits[size>>2];
 310   // Assert that the register mask contains only bit sets.
 311   for (int i = 0; i < RM_SIZE; i++) {
 312     int bits = _A[i];
 313     while (bits) {              // Check bits for pairing
 314       int bit = bits & -bits;   // Extract low bit
 315       // Low bit is not odd means its mis-aligned.
 316       if ((bit & low_bits_mask) == 0) return false;
 317       // Do extra work since (bit << size) may overflow.
 318       int hi_bit = bit << (size-1); // high bit
 319       int set = hi_bit + ((hi_bit-1) & ~(bit-1));
 320       // Check for aligned adjacent bits in this set
 321       if ((bits & set) != set) return false;
 322       bits -= set;  // Remove this set
 323     }
 324   }
 325   return true;
 326 }
 327 
 328 //------------------------------is_bound_set-----------------------------------
 329 // Return TRUE if the mask contains one adjacent set of bits and no other bits.
 330 // Works also for size 1.
 331 int RegMask::is_bound_set(const int size) const {
 332   if( is_AllStack() ) return false;
 333   assert(1 <= size && size <= 8, "update low bits table");
 334   int bit = -1;                 // Set to hold the one bit allowed
 335   for (int i = 0; i < RM_SIZE; i++) {
 336     if (_A[i] ) {               // Found some bits
 337       if (bit != -1)
 338        return false;            // Already had bits, so fail
 339       bit = _A[i] & -_A[i];     // Extract low bit from mask
 340       int hi_bit = bit << (size-1); // high bit
 341       if (hi_bit != 0) {        // Bit set stays in same word?
 342         int set = hi_bit + ((hi_bit-1) & ~(bit-1));
 343         if (set != _A[i])
 344           return false;         // Require adjacent bit set and no more bits
 345       } else {                  // Else its a split-set case
 346         if (((-1) & ~(bit-1)) != _A[i])
 347           return false;         // Found many bits, so fail
 348         i++;                    // Skip iteration forward and check high part
 349         // The lower 24 bits should be 0 since it is split case and size <= 8.
 350         int set = bit>>24;


 351         set = set & -set; // Remove sign extension.
 352         set = (((set << size) - 1) >> 8);
 353         if (i >= RM_SIZE || _A[i] != set)
 354           return false; // Require expected low bits in next word
 355       }
 356     }
 357   }
 358   // True for both the empty mask and for a bit set
 359   return true;
 360 }
 361 
 362 //------------------------------is_UP------------------------------------------
 363 // UP means register only, Register plus stack, or stack only is DOWN
 364 bool RegMask::is_UP() const {
 365   // Quick common case check for DOWN (any stack slot is legal)
 366   if( is_AllStack() )
 367     return false;
 368   // Slower check for any stack bits set (also DOWN)
 369   if( overlap(Matcher::STACK_ONLY_mask) )
 370     return false;
 371   // Not DOWN, so must be UP
 372   return true;
 373 }
 374 
 375 //------------------------------Size-------------------------------------------
 376 // Compute size of register mask in bits
 377 uint RegMask::Size() const {
 378   extern uint8_t bitsInByte[256];
 379   uint sum = 0;
 380   for( int i = 0; i < RM_SIZE; i++ )
 381     sum +=
 382       bitsInByte[(_A[i]>>24) & 0xff] +
 383       bitsInByte[(_A[i]>>16) & 0xff] +
 384       bitsInByte[(_A[i]>> 8) & 0xff] +
 385       bitsInByte[ _A[i]      & 0xff];
 386   return sum;
 387 }
 388 
 389 #ifndef PRODUCT
 390 //------------------------------print------------------------------------------
 391 void RegMask::dump(outputStream *st) const {
 392   st->print("[");
 393   RegMask rm = *this;           // Structure copy into local temp
 394 
 395   OptoReg::Name start = rm.find_first_elem(); // Get a register
 396   if (OptoReg::is_valid(start)) { // Check for empty mask
 397     rm.Remove(start);           // Yank from mask
 398     OptoReg::dump(start, st);   // Print register




  97   case Bad:     st->print("rBAD"); break;
  98   default:
  99     if (r < _last_Mach_Reg) st->print("%s", Matcher::regName[r]);
 100     else st->print("rS%d",r);
 101     break;
 102   }
 103 }
 104 #endif
 105 
 106 
 107 //=============================================================================
 108 const RegMask RegMask::Empty(
 109 # define BODY(I) 0,
 110   FORALL_BODY
 111 # undef BODY
 112   0
 113 );
 114 
 115 //=============================================================================
 116 bool RegMask::is_vector(uint ireg) {
 117   return (ireg == Op_VecS || ireg == Op_VecD ||
 118           ireg == Op_VecX || ireg == Op_VecY || ireg == Op_VecZ );
 119 }
 120 
 121 int RegMask::num_registers(uint ireg) {
 122     switch(ireg) {
 123       case Op_VecZ:
 124         return 16;
 125       case Op_VecY:
 126         return 8;
 127       case Op_VecX:
 128         return 4;
 129       case Op_VecD:
 130       case Op_RegD:
 131       case Op_RegL:
 132 #ifdef _LP64
 133       case Op_RegP:
 134 #endif
 135         return 2;
 136     }
 137     // Op_VecS and the rest ideal registers.
 138     return 1;
 139 }
 140 
 141 //------------------------------find_first_pair--------------------------------
 142 // Find the lowest-numbered register pair in the mask.  Return the
 143 // HIGHEST register number in the pair, or BAD if no pairs.
 144 OptoReg::Name RegMask::find_first_pair() const {


 219   int bit = -1;                 // Set to hold the one bit allowed
 220   for( int i = 0; i < RM_SIZE; i++ ) {
 221     if( _A[i] ) {               // Found some bits
 222       if( bit != -1 ) return false; // Already had bits, so fail
 223       bit = _A[i] & -(_A[i]);   // Extract 1 bit from mask
 224       if( (bit << 1) != 0 ) {   // Bit pair stays in same word?
 225         if( (bit | (bit<<1)) != _A[i] )
 226           return false;         // Require adjacent bit pair and no more bits
 227       } else {                  // Else its a split-pair case
 228         if( bit != _A[i] ) return false; // Found many bits, so fail
 229         i++;                    // Skip iteration forward
 230         if( i >= RM_SIZE || _A[i] != 1 )
 231           return false; // Require 1 lo bit in next word
 232       }
 233     }
 234   }
 235   // True for both the empty mask and for a bit pair
 236   return true;
 237 }
 238 
 239 // only indicies of power 2 are accessed, so index 3 is only filled in for storage.
 240 static int low_bits[5] = { 0x55555555, 0x11111111, 0x01010101, 0x00000000, 0x00010001 };
 241 //------------------------------find_first_set---------------------------------
 242 // Find the lowest-numbered register set in the mask.  Return the
 243 // HIGHEST register number in the set, or BAD if no sets.
 244 // Works also for size 1.
 245 OptoReg::Name RegMask::find_first_set(const int size) const {
 246   verify_sets(size);
 247   for (int i = 0; i < RM_SIZE; i++) {
 248     if (_A[i]) {                // Found some bits
 249       int bit = _A[i] & -_A[i]; // Extract low bit
 250       // Convert to bit number, return hi bit in pair
 251       return OptoReg::Name((i<<_LogWordBits)+find_lowest_bit(bit)+(size-1));
 252     }
 253   }
 254   return OptoReg::Bad;
 255 }
 256 
 257 //------------------------------clear_to_sets----------------------------------
 258 // Clear out partial bits; leave only aligned adjacent bit pairs
 259 void RegMask::clear_to_sets(const int size) {
 260   if (size == 1) return;
 261   assert(2 <= size && size <= 16, "update low bits table");
 262   assert(is_power_of_2(size), "sanity");
 263   int low_bits_mask = low_bits[size>>2];
 264   for (int i = 0; i < RM_SIZE; i++) {
 265     int bits = _A[i];
 266     int sets = (bits & low_bits_mask);
 267     for (int j = 1; j < size; j++) {
 268       sets = (bits & (sets<<1)); // filter bits which produce whole sets
 269     }
 270     sets |= (sets>>1);           // Smear 1 hi-bit into a set
 271     if (size > 2) {
 272       sets |= (sets>>2);         // Smear 2 hi-bits into a set
 273       if (size > 4) {
 274         sets |= (sets>>4);       // Smear 4 hi-bits into a set
 275         if (size > 8) {
 276           sets |= (sets>>8);     // Smear 8 hi-bits into a set
 277         }
 278       }
 279     }
 280     _A[i] = sets;
 281   }
 282   verify_sets(size);
 283 }
 284 
 285 //------------------------------smear_to_sets----------------------------------
 286 // Smear out partial bits to aligned adjacent bit sets
 287 void RegMask::smear_to_sets(const int size) {
 288   if (size == 1) return;
 289   assert(2 <= size && size <= 16, "update low bits table");
 290   assert(is_power_of_2(size), "sanity");
 291   int low_bits_mask = low_bits[size>>2];
 292   for (int i = 0; i < RM_SIZE; i++) {
 293     int bits = _A[i];
 294     int sets = 0;
 295     for (int j = 0; j < size; j++) {
 296       sets |= (bits & low_bits_mask);  // collect partial bits
 297       bits  = bits>>1;
 298     }
 299     sets |= (sets<<1);           // Smear 1 lo-bit  into a set
 300     if (size > 2) {
 301       sets |= (sets<<2);         // Smear 2 lo-bits into a set
 302       if (size > 4) {
 303         sets |= (sets<<4);       // Smear 4 lo-bits into a set
 304         if (size > 8) {
 305           sets |= (sets<<8);     // Smear 8 lo-bits into a set
 306         }
 307       }
 308     }
 309     _A[i] = sets;
 310   }
 311   verify_sets(size);
 312 }
 313 
 314 //------------------------------is_aligned_set--------------------------------
 315 bool RegMask::is_aligned_sets(const int size) const {
 316   if (size == 1) return true;
 317   assert(2 <= size && size <= 16, "update low bits table");
 318   assert(is_power_of_2(size), "sanity");
 319   int low_bits_mask = low_bits[size>>2];
 320   // Assert that the register mask contains only bit sets.
 321   for (int i = 0; i < RM_SIZE; i++) {
 322     int bits = _A[i];
 323     while (bits) {              // Check bits for pairing
 324       int bit = bits & -bits;   // Extract low bit
 325       // Low bit is not odd means its mis-aligned.
 326       if ((bit & low_bits_mask) == 0) return false;
 327       // Do extra work since (bit << size) may overflow.
 328       int hi_bit = bit << (size-1); // high bit
 329       int set = hi_bit + ((hi_bit-1) & ~(bit-1));
 330       // Check for aligned adjacent bits in this set
 331       if ((bits & set) != set) return false;
 332       bits -= set;  // Remove this set
 333     }
 334   }
 335   return true;
 336 }
 337 
 338 //------------------------------is_bound_set-----------------------------------
 339 // Return TRUE if the mask contains one adjacent set of bits and no other bits.
 340 // Works also for size 1.
 341 int RegMask::is_bound_set(const int size) const {
 342   if( is_AllStack() ) return false;
 343   assert(1 <= size && size <= 16, "update low bits table");
 344   int bit = -1;                 // Set to hold the one bit allowed
 345   for (int i = 0; i < RM_SIZE; i++) {
 346     if (_A[i] ) {               // Found some bits
 347       if (bit != -1)
 348        return false;            // Already had bits, so fail
 349       bit = _A[i] & -_A[i];     // Extract low bit from mask
 350       int hi_bit = bit << (size-1); // high bit
 351       if (hi_bit != 0) {        // Bit set stays in same word?
 352         int set = hi_bit + ((hi_bit-1) & ~(bit-1));
 353         if (set != _A[i])
 354           return false;         // Require adjacent bit set and no more bits
 355       } else {                  // Else its a split-set case
 356         if (((-1) & ~(bit-1)) != _A[i])
 357           return false;         // Found many bits, so fail
 358         i++;                    // Skip iteration forward and check high part
 359         // The lower (32-size) bits should be 0 since it is split case.
 360         int clear_bit_size = 32-size;
 361         int shift_back_size = 32-clear_bit_size;
 362         int set = bit>>clear_bit_size;
 363         set = set & -set; // Remove sign extension.
 364         set = (((set << size) - 1) >> shift_back_size);
 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 }
 373 
 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 }
 386 
 387 //------------------------------Size-------------------------------------------
 388 // Compute size of register mask in bits
 389 uint RegMask::Size() const {
 390   extern uint8_t bitsInByte[512];
 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 }
 400 
 401 #ifndef PRODUCT
 402 //------------------------------print------------------------------------------
 403 void RegMask::dump(outputStream *st) const {
 404   st->print("[");
 405   RegMask rm = *this;           // Structure copy into local temp
 406 
 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


< prev index next >