diff -r 28b50d07f6f8 -r 710a3c8b516e src/share/vm/memory/cardTableModRefBS.hpp --- a/src/share/vm/memory/cardTableModRefBS.hpp Mon Sep 08 12:35:01 2014 -0700 +++ b/src/share/vm/memory/cardTableModRefBS.hpp Tue Aug 08 15:57:29 2017 +0800 @@ -309,6 +309,9 @@ inline void inline_write_ref_array(MemRegion mr) { dirty_MemRegion(mr); +#ifdef MIPS64 + if (Use3A2000) OrderAccess::fence(); +#endif } protected: void write_ref_array_work(MemRegion mr) { @@ -322,7 +325,11 @@ // *** Card-table-barrier-specific things. - template inline void inline_write_ref_field_pre(T* field, oop newVal) {} + template inline void inline_write_ref_field_pre(T* field, oop newVal) { +#ifdef MIPS64 + if (Use3A2000) OrderAccess::fence(); +#endif + } template inline void inline_write_ref_field(T* field, oop newVal, bool release) { jbyte* byte = byte_for((void*)field); @@ -332,6 +339,9 @@ } else { *byte = dirty_card; } +#ifdef MIPS64 + if (Use3A2000) OrderAccess::fence(); +#endif } // These are used by G1, when it uses the card table as a temporary data