1.1 --- a/src/cpu/sparc/vm/assembler_sparc.cpp Tue Mar 03 18:25:57 2009 -0800 1.2 +++ b/src/cpu/sparc/vm/assembler_sparc.cpp Wed Mar 04 09:58:39 2009 -0800 1.3 @@ -2615,6 +2615,29 @@ 1.4 } 1.5 } 1.6 1.7 +RegisterConstant MacroAssembler::delayed_value(intptr_t* delayed_value_addr, 1.8 + Register tmp, 1.9 + int offset) { 1.10 + intptr_t value = *delayed_value_addr; 1.11 + if (value != 0) 1.12 + return RegisterConstant(value + offset); 1.13 + 1.14 + // load indirectly to solve generation ordering problem 1.15 + Address a(tmp, (address) delayed_value_addr); 1.16 + load_ptr_contents(a, tmp); 1.17 + 1.18 +#ifdef ASSERT 1.19 + tst(tmp); 1.20 + breakpoint_trap(zero, xcc); 1.21 +#endif 1.22 + 1.23 + if (offset != 0) 1.24 + add(tmp, offset, tmp); 1.25 + 1.26 + return RegisterConstant(tmp); 1.27 +} 1.28 + 1.29 + 1.30 void MacroAssembler::biased_locking_enter(Register obj_reg, Register mark_reg, 1.31 Register temp_reg, 1.32 Label& done, Label* slow_case, 1.33 @@ -4057,6 +4080,24 @@ 1.34 card_table_write(bs->byte_map_base, tmp, store_addr); 1.35 } 1.36 1.37 +// Loading values by size and signed-ness 1.38 +void MacroAssembler::load_sized_value(Register s1, RegisterConstant s2, Register d, 1.39 + int size_in_bytes, bool is_signed) { 1.40 + switch (size_in_bytes ^ (is_signed ? -1 : 0)) { 1.41 + case ~8: // fall through: 1.42 + case 8: ld_long( s1, s2, d ); break; 1.43 + case ~4: ldsw( s1, s2, d ); break; 1.44 + case 4: lduw( s1, s2, d ); break; 1.45 + case ~2: ldsh( s1, s2, d ); break; 1.46 + case 2: lduh( s1, s2, d ); break; 1.47 + case ~1: ldsb( s1, s2, d ); break; 1.48 + case 1: ldub( s1, s2, d ); break; 1.49 + default: ShouldNotReachHere(); 1.50 + } 1.51 +} 1.52 + 1.53 + 1.54 + 1.55 void MacroAssembler::load_klass(Register src_oop, Register klass) { 1.56 // The number of bytes in this code is used by 1.57 // MachCallDynamicJavaNode::ret_addr_offset()