src/cpu/sparc/vm/sharedRuntime_sparc.cpp

changeset 2138
d5d065957597
parent 1934
e9ff18c4ace7
child 2314
f95d63e2154a
     1.1 --- a/src/cpu/sparc/vm/sharedRuntime_sparc.cpp	Thu Sep 02 11:40:02 2010 -0700
     1.2 +++ b/src/cpu/sparc/vm/sharedRuntime_sparc.cpp	Fri Sep 03 17:51:07 2010 -0700
     1.3 @@ -3331,10 +3331,8 @@
     1.4    __ stf(FloatRegisterImpl::D, Freturn0, saved_Freturn0_addr);
     1.5  #if !defined(_LP64)
     1.6  #if defined(COMPILER2)
     1.7 -  if (!TieredCompilation) {
     1.8 -    // 32-bit 1-register longs return longs in G1
     1.9 -    __ stx(Greturn1, saved_Greturn1_addr);
    1.10 -  }
    1.11 +  // 32-bit 1-register longs return longs in G1
    1.12 +  __ stx(Greturn1, saved_Greturn1_addr);
    1.13  #endif
    1.14    __ set_last_Java_frame(SP, noreg);
    1.15    __ call_VM_leaf(L7_thread_cache, CAST_FROM_FN_PTR(address, Deoptimization::unpack_frames), G2_thread, G4deopt_mode);
    1.16 @@ -3347,24 +3345,15 @@
    1.17    __ reset_last_Java_frame();
    1.18    __ ldf(FloatRegisterImpl::D, saved_Freturn0_addr, Freturn0);
    1.19  
    1.20 -  // In tiered we never use C2 to compile methods returning longs so
    1.21 -  // the result is where we expect it already.
    1.22 -
    1.23  #if !defined(_LP64) && defined(COMPILER2)
    1.24    // In 32 bit, C2 returns longs in G1 so restore the saved G1 into
    1.25 -  // I0/I1 if the return value is long.  In the tiered world there is
    1.26 -  // a mismatch between how C1 and C2 return longs compiles and so
    1.27 -  // currently compilation of methods which return longs is disabled
    1.28 -  // for C2 and so is this code.  Eventually C1 and C2 will do the
    1.29 -  // same thing for longs in the tiered world.
    1.30 -  if (!TieredCompilation) {
    1.31 -    Label not_long;
    1.32 -    __ cmp(O0,T_LONG);
    1.33 -    __ br(Assembler::notEqual, false, Assembler::pt, not_long);
    1.34 -    __ delayed()->nop();
    1.35 -    __ ldd(saved_Greturn1_addr,I0);
    1.36 -    __ bind(not_long);
    1.37 -  }
    1.38 +  // I0/I1 if the return value is long.
    1.39 +  Label not_long;
    1.40 +  __ cmp(O0,T_LONG);
    1.41 +  __ br(Assembler::notEqual, false, Assembler::pt, not_long);
    1.42 +  __ delayed()->nop();
    1.43 +  __ ldd(saved_Greturn1_addr,I0);
    1.44 +  __ bind(not_long);
    1.45  #endif
    1.46    __ ret();
    1.47    __ delayed()->restore();

mercurial