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.)