--- old/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp 2017-04-25 16:43:39.891177112 +0200 +++ new/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp 2017-04-25 16:43:39.771177117 +0200 @@ -2567,9 +2567,10 @@ void LIR_Assembler::emit_compare_and_swap(LIR_OpCompareAndSwap* op) { + LIR_Address* address = op->addr()->as_address_ptr(); if (op->code() == lir_cas_long) { assert(VM_Version::supports_cx8(), "wrong machine"); - Register addr = op->addr()->as_pointer_register(); + Register addr = address->base()->as_pointer_register(); Register cmp_value_lo = op->cmp_value()->as_register_lo(); Register cmp_value_hi = op->cmp_value()->as_register_hi(); Register new_value_lo = op->new_value()->as_register_lo(); @@ -2584,7 +2585,7 @@ // overwritten with the original value in "addr" and will be equal to t1. __ cmp(t1, t2); } else if (op->code() == lir_cas_int || op->code() == lir_cas_obj) { - Register addr = op->addr()->as_pointer_register(); + Register addr = address->base()->as_pointer_register(); Register cmp_value = op->cmp_value()->as_register(); Register new_value = op->new_value()->as_register(); Register t1 = op->tmp1()->as_register(); @@ -3164,16 +3165,31 @@ __ srl (rs, 0, rd->successor()); } - void LIR_Assembler::leal(LIR_Opr addr_opr, LIR_Opr dest) { - LIR_Address* addr = addr_opr->as_address_ptr(); - assert(addr->index()->is_illegal() && addr->scale() == LIR_Address::times_1, "can't handle complex addresses yet"); + const LIR_Address* addr = addr_opr->as_address_ptr(); + assert(addr->scale() == LIR_Address::times_1, "can't handle complex addresses yet"); + const Register dest_reg = dest->as_pointer_register(); + const Register base_reg = addr->base()->as_pointer_register(); if (Assembler::is_simm13(addr->disp())) { - __ add(addr->base()->as_pointer_register(), addr->disp(), dest->as_pointer_register()); + if (addr->index()->is_valid()) { + const Register index_reg = addr->index()->as_pointer_register(); + assert(index_reg != G3_scratch, "invariant"); + __ add(base_reg, addr->disp(), G3_scratch); + __ add(index_reg, G3_scratch, dest_reg); + + } else { + __ add(base_reg, addr->disp(), dest_reg); + } } else { __ set(addr->disp(), G3_scratch); - __ add(addr->base()->as_pointer_register(), G3_scratch, dest->as_pointer_register()); + if (addr->index()->is_valid()) { + const Register index_reg = addr->index()->as_pointer_register(); + assert(index_reg != G3_scratch, "invariant"); + __ add(index_reg, G3_scratch, G3_scratch); + + } + __ add(base_reg, G3_scratch, dest_reg); } }