OpenJDK / portola / portola
changeset 50552:b93bf5846277
8203344: Make C1 leal patchable on SPARC
Reviewed-by: neliasso, thartmann
author | eosterlund |
---|---|
date | Wed, 13 Jun 2018 15:08:08 +0200 |
parents | 7bf4f1b5e438 |
children | cf88c15d9171 |
files | src/hotspot/cpu/sparc/c1_LIRAssembler_sparc.cpp |
diffstat | 1 files changed, 26 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/hotspot/cpu/sparc/c1_LIRAssembler_sparc.cpp Wed Jun 13 12:52:21 2018 +0200 +++ b/src/hotspot/cpu/sparc/c1_LIRAssembler_sparc.cpp Wed Jun 13 15:08:08 2018 +0200 @@ -3202,23 +3202,38 @@ const Register dest_reg = dest->as_pointer_register(); const Register base_reg = addr->base()->as_pointer_register(); - if (Assembler::is_simm13(addr->disp())) { - 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); + if (patch_code != lir_patch_none) { + PatchingStub* patch = new PatchingStub(_masm, PatchingStub::access_field_id); + assert(addr->disp() != 0, "must have"); + assert(base_reg != G3_scratch, "invariant"); + __ patchable_set(0, G3_scratch); + patching_epilog(patch, patch_code, base_reg, info); + assert(dest_reg != G3_scratch, "invariant"); 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); + } else { + if (Assembler::is_simm13(addr->disp())) { + 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); + 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); + } } }