diff options
author | Steve MacLean <sdmaclea.qdt@qualcommdatacenter.com> | 2017-06-16 15:56:35 +0000 |
---|---|---|
committer | Steve MacLean, Qualcomm Datacenter Technologies Inc <sdmaclea@qti.qualcomm.com> | 2017-08-25 14:10:47 -0400 |
commit | 7091c756f8da0e547290a2f5d43e3c4009e59010 (patch) | |
tree | 86231c55c05abf837f06fe7a65beca422fe9b83b /src/vm/gcenv.ee.cpp | |
parent | e9e3a69fe00d5e75ed09971b346f3529beba36f6 (diff) | |
download | coreclr-7091c756f8da0e547290a2f5d43e3c4009e59010.tar.gz coreclr-7091c756f8da0e547290a2f5d43e3c4009e59010.tar.bz2 coreclr-7091c756f8da0e547290a2f5d43e3c4009e59010.zip |
[Arm64] Optimize JIT_WriteBarriers
Fixes #5833
Fixes #11374
Fixes #12197
Diffstat (limited to 'src/vm/gcenv.ee.cpp')
-rw-r--r-- | src/vm/gcenv.ee.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/vm/gcenv.ee.cpp b/src/vm/gcenv.ee.cpp index b61069f5fd..b135173c0f 100644 --- a/src/vm/gcenv.ee.cpp +++ b/src/vm/gcenv.ee.cpp @@ -861,7 +861,7 @@ void GCToEEInterface::StompWriteBarrier(WriteBarrierParameters* args) #endif #ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP - if (args->write_watch_table != nullptr) + if (g_sw_ww_enabled_for_gc_heap && (args->write_watch_table != nullptr)) { assert(args->is_runtime_suspended); g_sw_ww_table = args->write_watch_table; @@ -888,6 +888,17 @@ void GCToEEInterface::StompWriteBarrier(WriteBarrierParameters* args) g_lowest_address = args->lowest_address; VolatileStore(&g_highest_address, args->highest_address); + +#if defined(_ARM64_) + // Need to reupdate for changes to g_highest_address g_lowest_address + ::StompWriteBarrierResize(args->is_runtime_suspended, args->requires_upper_bounds_check); + + if(!args->is_runtime_suspended) + { + // If runtime is not suspended, force updated state to be visible to all threads + MemoryBarrier(); + } +#endif return; case WriteBarrierOp::StompEphemeral: // StompEphemeral requires a new ephemeral low and a new ephemeral high @@ -945,6 +956,7 @@ void GCToEEInterface::StompWriteBarrier(WriteBarrierParameters* args) case WriteBarrierOp::SwitchToNonWriteWatch: #ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP assert(args->is_runtime_suspended && "the runtime must be suspended here!"); + g_sw_ww_table = 0; g_sw_ww_enabled_for_gc_heap = false; ::SwitchToNonWriteWatchBarrier(true); #else |