diff -r 98b4b0661837 -r ac27a9c85bea src/share/vm/memory/cardTableModRefBS.hpp --- a/src/share/vm/memory/cardTableModRefBS.hpp Wed Sep 06 00:35:24 2017 -0700 +++ b/src/share/vm/memory/cardTableModRefBS.hpp Thu May 24 18:41:44 2018 +0800 @@ -316,6 +316,9 @@ inline void inline_write_ref_array(MemRegion mr) { dirty_MemRegion(mr); +#ifdef MIPS64 + if (UseSyncLevel >= 2000) OrderAccess::fence(); +#endif } protected: void write_ref_array_work(MemRegion mr) { @@ -329,7 +332,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 (UseSyncLevel >= 2000) OrderAccess::fence(); +#endif + } template inline void inline_write_ref_field(T* field, oop newVal, bool release) { jbyte* byte = byte_for((void*)field); @@ -339,6 +346,9 @@ } else { *byte = dirty_card; } +#ifdef MIPS64 + if (UseSyncLevel >= 2000) OrderAccess::fence(); +#endif } // These are used by G1, when it uses the card table as a temporary data