1use std::arch::asm;
3use std::sync::atomic::{compiler_fence, Ordering};
4
5enum ZSimMagic {
6 RoiBegin = 1025,
7 RoiEnd = 1026,
8 RegisterThread = 1027,
9 HeartBeat = 1028,
10 WorkBegin = 1029,
11 WorkEnd = 1030,
12}
13
14#[cfg(target_arch = "x86_64")]
15#[inline]
16fn zsim_magic_op(op: u64) {
17 compiler_fence(Ordering::SeqCst);
18 unsafe {
19 asm!("xchg rcx, rcx", in("rcx") op);
20 }
21 compiler_fence(Ordering::SeqCst);
22}
23
24#[cfg(not(target_arch = "x86_64"))]
25#[inline]
26fn zsim_magic_op(_op: u64) {}
27
28#[inline]
29pub fn zsim_roi_begin() {
30 zsim_magic_op(ZSimMagic::RoiBegin as u64);
31}
32
33#[inline]
34pub fn zsim_roi_end() {
35 zsim_magic_op(ZSimMagic::RoiEnd as u64);
36}
37
38#[inline]
39pub fn zsim_register_thread() {
40 zsim_magic_op(ZSimMagic::RegisterThread as u64);
41}
42
43#[inline]
44pub fn zsim_heartbeat() {
45 zsim_magic_op(ZSimMagic::HeartBeat as u64);
46}
47
48#[inline]
49pub fn zsim_work_begin() {
50 zsim_magic_op(ZSimMagic::WorkBegin as u64);
51}
52
53#[inline]
54pub fn zsim_work_end() {
55 zsim_magic_op(ZSimMagic::WorkEnd as u64);
56}