src/cpu/sparc/vm/assembler_sparc.cpp

changeset 1057
56aae7be60d4
parent 855
a1980da045cc
child 1058
9adddb8c0fc8
     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()

mercurial