12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- /*
- * Copyright 2016-present 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.
- */
- #pragma once
- #include <folly/Portability.h>
- #include <chrono>
- #include <cstdint>
- #ifdef _MSC_VER
- #include <intrin.h>
- #endif
- namespace folly {
- inline void asm_volatile_memory() {
- #if defined(__clang__) || defined(__GNUC__)
- asm volatile("" : : : "memory");
- #elif defined(_MSC_VER)
- ::_ReadWriteBarrier();
- #endif
- }
- inline void asm_volatile_pause() {
- #if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
- ::_mm_pause();
- #elif defined(__i386__) || FOLLY_X64
- asm volatile("pause");
- #elif FOLLY_AARCH64 || defined(__arm__)
- asm volatile("yield");
- #elif FOLLY_PPC64
- asm volatile("or 27,27,27");
- #endif
- }
- inline std::uint64_t asm_rdtsc() {
- #if _MSC_VER
- return (uint64_t)__rdtsc();
- #elif defined(__i386__) || FOLLY_X64
- // read the timestamp counter on x86
- auto hi = std::uint32_t{};
- auto lo = std::uint32_t{};
- asm volatile("rdtsc" : "=a"(lo), "=d"(hi));
- return (((std::uint64_t)lo) + (((std::uint64_t)hi) << 32));
- #else
- // use steady_clock::now() as an approximation for the timestamp counter on
- // non-x86 systems
- return std::chrono::steady_clock::now().time_since_epoch().count();
- #endif
- }
- } // namespace folly
|