src/cpu/sparc/vm/assembler_sparc.cpp

changeset 2399
7737fa7ec2b5
parent 2350
2f644f85485d
child 2425
84f36150fcc3
     1.1 --- a/src/cpu/sparc/vm/assembler_sparc.cpp	Mon Dec 13 22:41:03 2010 -0800
     1.2 +++ b/src/cpu/sparc/vm/assembler_sparc.cpp	Tue Dec 14 12:44:30 2010 -0800
     1.3 @@ -23,6 +23,7 @@
     1.4   */
     1.5  
     1.6  #include "precompiled.hpp"
     1.7 +#include "asm/assembler.hpp"
     1.8  #include "assembler_sparc.inline.hpp"
     1.9  #include "gc_interface/collectedHeap.inline.hpp"
    1.10  #include "interpreter/interpreter.hpp"
    1.11 @@ -1327,37 +1328,38 @@
    1.12  }
    1.13  
    1.14  
    1.15 -int MacroAssembler::size_of_sethi(address a, bool worst_case) {
    1.16 +int MacroAssembler::insts_for_sethi(address a, bool worst_case) {
    1.17  #ifdef _LP64
    1.18 -  if (worst_case) return 7;
    1.19 -  intptr_t iaddr = (intptr_t)a;
    1.20 -  int hi32 = (int)(iaddr >> 32);
    1.21 -  int lo32 = (int)(iaddr);
    1.22 -  int inst_count;
    1.23 -  if (hi32 == 0 && lo32 >= 0)
    1.24 -    inst_count = 1;
    1.25 -  else if (hi32 == -1)
    1.26 -    inst_count = 2;
    1.27 +  if (worst_case)  return 7;
    1.28 +  intptr_t iaddr = (intptr_t) a;
    1.29 +  int msb32 = (int) (iaddr >> 32);
    1.30 +  int lsb32 = (int) (iaddr);
    1.31 +  int count;
    1.32 +  if (msb32 == 0 && lsb32 >= 0)
    1.33 +    count = 1;
    1.34 +  else if (msb32 == -1)
    1.35 +    count = 2;
    1.36    else {
    1.37 -    inst_count = 2;
    1.38 -    if ( hi32 & 0x3ff )
    1.39 -      inst_count++;
    1.40 -    if ( lo32 & 0xFFFFFC00 ) {
    1.41 -      if( (lo32 >> 20) & 0xfff ) inst_count += 2;
    1.42 -      if( (lo32 >> 10) & 0x3ff ) inst_count += 2;
    1.43 +    count = 2;
    1.44 +    if (msb32 & 0x3ff)
    1.45 +      count++;
    1.46 +    if (lsb32 & 0xFFFFFC00 ) {
    1.47 +      if ((lsb32 >> 20) & 0xfff)  count += 2;
    1.48 +      if ((lsb32 >> 10) & 0x3ff)  count += 2;
    1.49      }
    1.50    }
    1.51 -  return BytesPerInstWord * inst_count;
    1.52 +  return count;
    1.53  #else
    1.54 -  return BytesPerInstWord;
    1.55 +  return 1;
    1.56  #endif
    1.57  }
    1.58  
    1.59 -int MacroAssembler::worst_case_size_of_set() {
    1.60 -  return size_of_sethi(NULL, true) + 1;
    1.61 +int MacroAssembler::worst_case_insts_for_set() {
    1.62 +  return insts_for_sethi(NULL, true) + 1;
    1.63  }
    1.64  
    1.65  
    1.66 +// Keep in sync with MacroAssembler::insts_for_internal_set
    1.67  void MacroAssembler::internal_set(const AddressLiteral& addrlit, Register d, bool ForceRelocatable) {
    1.68    intptr_t value = addrlit.value();
    1.69  
    1.70 @@ -1379,6 +1381,23 @@
    1.71    }
    1.72  }
    1.73  
    1.74 +// Keep in sync with MacroAssembler::internal_set
    1.75 +int MacroAssembler::insts_for_internal_set(intptr_t value) {
    1.76 +  // can optimize
    1.77 +  if (-4096 <= value && value <= 4095) {
    1.78 +    return 1;
    1.79 +  }
    1.80 +  if (inv_hi22(hi22(value)) == value) {
    1.81 +    return insts_for_sethi((address) value);
    1.82 +  }
    1.83 +  int count = insts_for_sethi((address) value);
    1.84 +  AddressLiteral al(value);
    1.85 +  if (al.low10() != 0) {
    1.86 +    count++;
    1.87 +  }
    1.88 +  return count;
    1.89 +}
    1.90 +
    1.91  void MacroAssembler::set(const AddressLiteral& al, Register d) {
    1.92    internal_set(al, d, false);
    1.93  }
    1.94 @@ -1443,11 +1462,11 @@
    1.95    }
    1.96  }
    1.97  
    1.98 -int MacroAssembler::size_of_set64(jlong value) {
    1.99 +int MacroAssembler::insts_for_set64(jlong value) {
   1.100    v9_dep();
   1.101  
   1.102 -  int hi = (int)(value >> 32);
   1.103 -  int lo = (int)(value & ~0);
   1.104 +  int hi = (int) (value >> 32);
   1.105 +  int lo = (int) (value & ~0);
   1.106    int count = 0;
   1.107  
   1.108    // (Matcher::isSimpleConstant64 knows about the following optimizations.)

mercurial