--- a/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.inline.hpp Fri Dec 04 14:06:38 2015 +0100
+++ b/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.inline.hpp Fri Dec 04 16:38:04 2015 +0100
@@ -70,9 +70,11 @@
}
inline void MacroAssembler::membar(int bits) {
- // TODO: use elemental_membar(bits) for Power 8 and disable optimization of acquire-release
- // (Matcher::post_membar_release where we use PPC64_ONLY(xop == Op_MemBarRelease ||))
- if (bits & StoreLoad) sync(); else lwsync();
+ // Comment: Usage of elemental_membar(bits) is not recommended for Power 8.
+ // If elemental_membar(bits) is used, disable optimization of acquire-release
+ // (Matcher::post_membar_release where we use PPC64_ONLY(xop == Op_MemBarRelease ||))!
+ if (bits & StoreLoad) { sync(); }
+ else if (bits) { lwsync(); }
}
inline void MacroAssembler::release() { membar(LoadStore | StoreStore); }
inline void MacroAssembler::acquire() { membar(LoadLoad | LoadStore); }
@@ -86,7 +88,7 @@
// Offset of given address to the global TOC.
inline int MacroAssembler::offset_to_global_toc(const address addr) {
intptr_t offset = (intptr_t)addr - (intptr_t)MacroAssembler::global_toc();
- assert(Assembler::is_simm((long)offset, 31) && offset >= 0, "must be in range");
+ assert(Assembler::is_uimm((long)offset, 31), "must be in range");
return (int)offset;
}
@@ -98,7 +100,7 @@
// Offset of given address to current method's TOC.
inline int MacroAssembler::offset_to_method_toc(address addr) {
intptr_t offset = (intptr_t)addr - (intptr_t)method_toc();
- assert(is_simm((long)offset, 31) && offset >= 0, "must be in range");
+ assert(Assembler::is_uimm((long)offset, 31), "must be in range");
return (int)offset;
}
@@ -190,13 +192,13 @@
// Variant 1, the 1st instruction contains the destination address:
//
// bcxx DEST
- // endgroup
+ // nop
//
const int instruction_1 = *(int*)(instruction_addr);
const int instruction_2 = *(int*)(instruction_addr + 4);
return is_bcxx(instruction_1) &&
(inv_bd_field(instruction_1, (intptr_t)instruction_addr) != (intptr_t)(instruction_addr + 2*4)) &&
- is_endgroup(instruction_2);
+ is_nop(instruction_2);
}
// Relocation of conditional far branches.
@@ -302,13 +304,17 @@
}
}
-inline void MacroAssembler::load_with_trap_null_check(Register d, int si16, Register s1) {
- if (!os::zero_page_read_protected()) {
+inline void MacroAssembler::null_check(Register a, int offset, Label *Lis_null) {
+ if (!ImplicitNullChecks || needs_explicit_null_check(offset) || !os::zero_page_read_protected()) {
if (TrapBasedNullChecks) {
- trap_null_check(s1);
+ assert(UseSIGTRAP, "sanity");
+ trap_null_check(a);
+ } else if (Lis_null){
+ Label ok;
+ cmpdi(CCR0, a, 0);
+ beq(CCR0, *Lis_null);
}
}
- ld(d, si16, s1);
}
inline void MacroAssembler::load_heap_oop_not_null(Register d, RegisterOrConstant offs, Register s1, Register tmp) {
@@ -365,6 +371,26 @@
return current; // Encoded oop is in this register.
}
+inline Register MacroAssembler::encode_heap_oop(Register d, Register src) {
+ if (Universe::narrow_oop_base() != NULL) {
+ if (VM_Version::has_isel()) {
+ cmpdi(CCR0, src, 0);
+ Register co = encode_heap_oop_not_null(d, src);
+ assert(co == d, "sanity");
+ isel_0(d, CCR0, Assembler::equal);
+ } else {
+ Label isNull;
+ or_(d, src, src); // move and compare 0
+ beq(CCR0, isNull);
+ encode_heap_oop_not_null(d, src);
+ bind(isNull);
+ }
+ return d;
+ } else {
+ return encode_heap_oop_not_null(d, src);
+ }
+}
+
inline Register MacroAssembler::decode_heap_oop_not_null(Register d, Register src) {
if (Universe::narrow_oop_base_disjoint() && src != noreg && src != d &&
Universe::narrow_oop_shift() != 0) {