--- old/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp 2017-09-19 14:27:28.794804976 +0300 +++ new/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp 2017-09-19 14:27:28.624804984 +0300 @@ -129,7 +129,7 @@ } } -int MacroAssembler::patch_calculate_address_from_global_toc_at(address a, address bound, address addr) { +address MacroAssembler::patch_calculate_address_from_global_toc_at(address a, address bound, address addr) { const int offset = MacroAssembler::offset_to_global_toc(addr); const address inst2_addr = a; @@ -155,7 +155,7 @@ assert(is_addis(inst1) && inv_ra_field(inst1) == 29 /* R29 */, "source must be global TOC"); set_imm((int *)inst1_addr, MacroAssembler::largeoffset_si16_si16_hi(offset)); set_imm((int *)inst2_addr, MacroAssembler::largeoffset_si16_si16_lo(offset)); - return (int)((intptr_t)addr - (intptr_t)inst1_addr); + return inst1_addr; } address MacroAssembler::get_address_of_calculate_address_from_global_toc_at(address a, address bound) { @@ -201,7 +201,7 @@ // clrldi rx = rx & 0xFFFFffff // clearMS32b, optional // ori rx = rx | const.lo // Clrldi will be passed by. -int MacroAssembler::patch_set_narrow_oop(address a, address bound, narrowOop data) { +address MacroAssembler::patch_set_narrow_oop(address a, address bound, narrowOop data) { assert(UseCompressedOops, "Should only patch compressed oops"); const address inst2_addr = a; @@ -227,7 +227,7 @@ set_imm((int *)inst1_addr, (short)(xc)); // see enc_load_con_narrow_hi/_lo set_imm((int *)inst2_addr, (xd)); // unsigned int - return (int)((intptr_t)inst2_addr - (intptr_t)inst1_addr); + return inst1_addr; } // Get compressed oop or klass constant. --- old/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp 2017-09-19 14:27:29.258138290 +0300 +++ new/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp 2017-09-19 14:27:29.091471630 +0300 @@ -105,13 +105,15 @@ }; inline static bool is_calculate_address_from_global_toc_at(address a, address bound); - static int patch_calculate_address_from_global_toc_at(address a, address addr, address bound); + // Returns address of first instruction in sequence. + static address patch_calculate_address_from_global_toc_at(address a, address bound, address addr); static address get_address_of_calculate_address_from_global_toc_at(address a, address addr); #ifdef _LP64 // Patch narrow oop constant. inline static bool is_set_narrow_oop(address a, address bound); - static int patch_set_narrow_oop(address a, address bound, narrowOop data); + // Returns address of first instruction in sequence. + static address patch_set_narrow_oop(address a, address bound, narrowOop data); static narrowOop get_narrow_oop(address a, address bound); #endif --- old/src/hotspot/cpu/ppc/nativeInst_ppc.cpp 2017-09-19 14:27:29.704804937 +0300 +++ new/src/hotspot/cpu/ppc/nativeInst_ppc.cpp 2017-09-19 14:27:29.531471611 +0300 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2015 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -221,13 +221,13 @@ // A calculation relative to the global TOC. if (MacroAssembler::get_address_of_calculate_address_from_global_toc_at(addr, cb->content_begin()) != (address)data) { - const int invalidated_range = - MacroAssembler::patch_calculate_address_from_global_toc_at(addr, cb->content_begin(), + const address inst2_addr = addr; + const address inst1_addr = + MacroAssembler::patch_calculate_address_from_global_toc_at(inst2_addr, cb->content_begin(), (address)data); - const address start = invalidated_range < 0 ? addr + invalidated_range : addr; - // FIXME: - const int range = invalidated_range < 0 ? 4 - invalidated_range : 8; - ICache::ppc64_flush_icache_bytes(start, range); + assert(inst1_addr != NULL && inst1_addr < inst2_addr, "first instruction must be found"); + const int range = inst2_addr - inst1_addr + BytesPerInstWord; + ICache::ppc64_flush_icache_bytes(inst1_addr, range); } next_address = addr + 1 * BytesPerInstWord; } else if (MacroAssembler::is_load_const_at(addr)) { @@ -288,15 +288,15 @@ } void NativeMovConstReg::set_narrow_oop(narrowOop data, CodeBlob *code /* = NULL */) { - address addr = addr_at(0); + address inst2_addr = addr_at(0); CodeBlob* cb = (code) ? code : CodeCache::find_blob(instruction_address()); - if (MacroAssembler::get_narrow_oop(addr, cb->content_begin()) == (long)data) return; - const int invalidated_range = - MacroAssembler::patch_set_narrow_oop(addr, cb->content_begin(), (long)data); - const address start = invalidated_range < 0 ? addr + invalidated_range : addr; - // FIXME: - const int range = invalidated_range < 0 ? 4 - invalidated_range : 8; - ICache::ppc64_flush_icache_bytes(start, range); + if (MacroAssembler::get_narrow_oop(inst2_addr, cb->content_begin()) == (long)data) + return; + const address inst1_addr = + MacroAssembler::patch_set_narrow_oop(inst2_addr, cb->content_begin(), (long)data); + assert(inst1_addr != NULL && inst1_addr < inst2_addr, "first instruction must be found"); + const int range = inst2_addr - inst1_addr + BytesPerInstWord; + ICache::ppc64_flush_icache_bytes(inst1_addr, range); } // Do not use an assertion here. Let clients decide whether they only