# define FOLLY_PPC64 0
#endif
+namespace folly {
+constexpr bool kIsArchAmd64 = FOLLY_X64 == 1;
+constexpr bool kIsArchAArch64 = FOLLY_A64 == 1;
+constexpr bool kIsArchPPC64 = FOLLY_PPC64 == 1;
+}
+
// packing is very ugly in msvc
#ifdef _MSC_VER
# define FOLLY_PACK_ATTR /**/
--- /dev/null
+/*
+ * Copyright 2017 Facebook, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <folly/portability/Builtins.h>
+
+#if _WIN32
+#include <folly/portability/Windows.h>
+
+namespace folly {
+namespace portability {
+namespace detail {
+void call_flush_instruction_cache_self_pid(void* begin, size_t size) {
+ FlushInstructionCache(GetCurrentProcess(), begin, size);
+}
+}
+}
+}
+#endif
#ifdef _WIN32
#include <assert.h>
-#include <intrin.h>
#include <folly/Portability.h>
+#include <intrin.h>
+#include <stdint.h>
+
+namespace folly {
+namespace portability {
+namespace detail {
+void call_flush_instruction_cache_self_pid(void* begin, size_t size);
+}
+}
+}
+
+FOLLY_ALWAYS_INLINE void __builtin___clear_cache(char* begin, char* end) {
+ if (folly::kIsArchAmd64) {
+ // x86_64 doesn't require the instruction cache to be flushed after
+ // modification.
+ } else {
+ // Default to flushing it for everything else, such as ARM.
+ folly::portability::detail::call_flush_instruction_cache_self_pid(
+ static_cast<void*>(begin), static_cast<size_t>(end - begin));
+ }
+}
FOLLY_ALWAYS_INLINE int __builtin_clz(unsigned int x) {
unsigned long index;