Paolo Teti 8d663bd234 Fix x86 build on latest nightly (#533)
`cargo test --no-run` raise:

```
error[E0432]: unresolved import
  --> crates/coresimd/src/../../../coresimd/x86/rdtsc.rs:62:9
   |
62 |     use coresimd::x86::rdtsc;
   |         ^^^^^^^^^^^^^^^^^^^^
```
2018-07-22 10:58:21 -05:00

78 lines
2.4 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//! RDTSC instructions.
#[cfg(test)]
use stdsimd_test::assert_instr;
/// Reads the current value of the processors time-stamp counter.
///
/// The processor monotonically increments the time-stamp counter MSR
/// every clock cycle and resets it to 0 whenever the processor is
/// reset.
///
/// The RDTSC instruction is not a serializing instruction. It does
/// not necessarily wait until all previous instructions have been
/// executed before reading the counter. Similarly, subsequent
/// instructions may begin execution before the read operation is
/// performed.
///
/// On processors that support the Intel 64 architecture, the
/// high-order 32 bits of each of RAX and RDX are cleared.
///
/// [Intel's documentation](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_rdtsc)
#[inline]
#[cfg_attr(test, assert_instr(rdtsc))]
#[stable(feature = "simd_x86", since = "1.27.0")]
pub unsafe fn _rdtsc() -> i64 {
rdtsc()
}
/// Reads the current value of the processors time-stamp counter and
/// the `IA32_TSC_AUX MSR`.
///
/// The processor monotonically increments the time-stamp counter MSR
/// every clock cycle and resets it to 0 whenever the processor is
/// reset.
///
/// The RDTSCP instruction waits until all previous instructions have
/// been executed before reading the counter. However, subsequent
/// instructions may begin execution before the read operation is
/// performed.
///
/// On processors that support the Intel 64 architecture, the
/// high-order 32 bits of each of RAX, RDX, and RCX are cleared.
///
/// [Intel's documentation](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=__rdtscp)
#[inline]
#[cfg_attr(test, assert_instr(rdtscp))]
#[stable(feature = "simd_x86", since = "1.27.0")]
pub unsafe fn __rdtscp(aux: *mut u32) -> u64 {
rdtscp(aux as *mut _)
}
#[allow(improper_ctypes)]
extern "C" {
#[link_name = "llvm.x86.rdtsc"]
fn rdtsc() -> i64;
#[link_name = "llvm.x86.rdtscp"]
fn rdtscp(aux: *mut u8) -> u64;
}
#[cfg(test)]
mod tests {
use coresimd::x86::*;
use stdsimd_test::simd_test;
#[simd_test(enable = "sse2")]
unsafe fn _rdtsc() {
let r = rdtsc::_rdtsc();
assert_ne!(r, 0); // The chances of this being 0 are infinitesimal
}
#[simd_test(enable = "sse2")]
unsafe fn _rdtscp() {
let mut aux = 0;
let r = rdtsc::__rdtscp(&mut aux);
assert_ne!(r, 0); // The chances of this being 0 are infinitesimal
}
}