diff --git a/js/src/moz.build b/js/src/moz.build index cf43ed2bbe..81825bae45 100644 --- a/js/src/moz.build +++ b/js/src/moz.build @@ -325,7 +325,6 @@ main_deunified_sources = [ 'vm/Runtime.cpp', 'vm/SavedStacks.cpp', 'vm/Scope.cpp', - 'vm/SelfHosting.cpp', 'vm/Shape.cpp', 'vm/SharedArrayObject.cpp', 'vm/SharedImmutableStringsCache.cpp', @@ -400,8 +399,13 @@ SOURCES += [ 'jsutil.cpp', 'vm/BigIntType.cpp', 'vm/Initialization.cpp', + 'vm/SelfHosting.cpp', ] +if CONFIG['CC_TYPE'] == 'gcc': + SOURCES['vm/SelfHosting.cpp'].flags += ['-fopenmp'] + OS_LIBS += ['gomp'] + if CONFIG['JS_POSIX_NSPR']: posix_nspr_deunified_sources = [ 'vm/PosixNSPR.cpp', diff --git a/js/src/vm/SelfHosting.cpp b/js/src/vm/SelfHosting.cpp index c9f290463e..26fd6cc9e1 100644 --- a/js/src/vm/SelfHosting.cpp +++ b/js/src/vm/SelfHosting.cpp @@ -1492,9 +1492,22 @@ CopyValues(SharedMem dest, SharedMem src, uint32_t count) using namespace jit; - for (; count > 0; count--) { - AtomicOperations::storeSafeWhenRacy(dest++, - To(AtomicOperations::loadSafeWhenRacy(src++))); +#if defined(_OPENMP) + const int64_t openMpCount = int64_t(count); + if (openMpCount >= (1 << 14)) { +#pragma omp parallel for default(none) shared(dest, src, openMpCount) schedule(static) + for (int64_t i = 0; i < openMpCount; i++) { + uint32_t index = uint32_t(i); + AtomicOperations::storeSafeWhenRacy(dest + index, + To(AtomicOperations::loadSafeWhenRacy(src + index))); + } + return; + } +#endif + + for (uint32_t i = 0; i < count; i++) { + AtomicOperations::storeSafeWhenRacy(dest + i, + To(AtomicOperations::loadSafeWhenRacy(src + i))); } }