src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp

changeset 4106
7eca5de9e0b6
parent 4051
8a02ca5e5576
child 4142
d8ce2825b193
child 4159
8e47bac5643a
     1.1 --- a/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp	Wed Sep 19 16:50:26 2012 -0700
     1.2 +++ b/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp	Thu Sep 20 16:49:17 2012 +0200
     1.3 @@ -1315,7 +1315,13 @@
     1.4  
     1.5  Address LIR_Assembler::as_Address(LIR_Address* addr) {
     1.6    Register reg = addr->base()->as_register();
     1.7 -  return Address(reg, addr->disp());
     1.8 +  LIR_Opr index = addr->index();
     1.9 +  if (index->is_illegal()) {
    1.10 +    return Address(reg, addr->disp());
    1.11 +  } else {
    1.12 +    assert (addr->disp() == 0, "unsupported address mode");
    1.13 +    return Address(reg, index->as_pointer_register());
    1.14 +  }
    1.15  }
    1.16  
    1.17  
    1.18 @@ -3438,7 +3444,28 @@
    1.19    }
    1.20  }
    1.21  
    1.22 -
    1.23 -
    1.24 +void LIR_Assembler::atomic_op(LIR_Code code, LIR_Opr src, LIR_Opr data, LIR_Opr dest, LIR_Opr tmp) {
    1.25 +  LIR_Address* addr = src->as_address_ptr();
    1.26 +
    1.27 +  assert(data == dest, "swap uses only 2 operands");
    1.28 +  assert (code == lir_xchg, "no xadd on sparc");
    1.29 +
    1.30 +  if (data->type() == T_INT) {
    1.31 +    __ swap(as_Address(addr), data->as_register());
    1.32 +  } else if (data->is_oop()) {
    1.33 +    Register obj = data->as_register();
    1.34 +    Register narrow = tmp->as_register();
    1.35 +#ifdef _LP64
    1.36 +    assert(UseCompressedOops, "swap is 32bit only");
    1.37 +    __ encode_heap_oop(obj, narrow);
    1.38 +    __ swap(as_Address(addr), narrow);
    1.39 +    __ decode_heap_oop(narrow, obj);
    1.40 +#else
    1.41 +    __ swap(as_Address(addr), obj);
    1.42 +#endif
    1.43 +  } else {
    1.44 +    ShouldNotReachHere();
    1.45 +  }
    1.46 +}
    1.47  
    1.48  #undef __

mercurial