mirror of
https://github.com/rust-lang/rust.git
synced 2025-11-18 14:00:09 +00:00
* fix build after stabilization of cfg_target_feature and target_feature * fix doc tests * fix spurious unused_attributes warning * fix more unused attribute warnings * More unnecessary target features * Remove no longer needed trait imports * Remove fixed upstream workarounds * Fix parsing the #[assert_instr] macro Following upstream proc_macro changes * Fix form and parsing of #[simd_test] * Don't use Cargo features for testing modes Instead use RUSTFLAGS with `--cfg`. This'll help us be compatible with the latest Cargo where a tweak to workspaces and features made the previous invocations we had invalid. * Don't thread RUSTFLAGS through docker * Re-gate on x86 verification Closes #411
78 lines
2.4 KiB
Rust
78 lines
2.4 KiB
Rust
//! RDTSC instructions.
|
||
|
||
#[cfg(test)]
|
||
use stdsimd_test::assert_instr;
|
||
|
||
/// Reads the current value of the processor’s 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 processor’s 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::rdtsc;
|
||
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
|
||
}
|
||
}
|