// #include #include typedef unsigned int u32; #define __HLE_ACQUIRE ".byte 0xf2 ; " #define __HLE_RELEASE ".byte 0xf3 ; " static inline void __hle_xchg (volatile u32* addr) { u32 value = 1; asm volatile (__HLE_ACQUIRE "lock; xchgl %0,%1" : "+r" (value), "+m" (*addr) :: "memory"); } static inline void __hle_move (volatile u32* addr) { asm volatile (__HLE_RELEASE "movl $0,%0" : "+m" (*addr) :: "memory"); } ////////////////////////////////////////////////////////////////////// static inline void __raw_xchg (volatile u32* addr) { u32 value = 1; asm volatile ("lock; xchgl %0,%1" : "+r" (value), "+m" (*addr) :: "memory"); } static inline void __raw_move (volatile u32* addr) { asm volatile ("movl $0,%0" : "+m" (*addr) :: "memory"); } ////////////////////////////////////////////////////////////////////// static void do_hle (int count) { u32 data = 0; int p1; for (p1 = 0 ; p1 < count ; ++ p1) { __hle_xchg (& data); __hle_move (& data); } } ////////////////////////////////////////////////////////////////////// static void do_raw (int count) { u32 data = 0; int p1; for (p1 = 0 ; p1 < count ; ++ p1) { __raw_xchg (& data); __raw_move (& data); } } ////////////////////////////////////////////////////////////////////// int main (int argc, char* argv []) { int test = argc < 2 ? 1 : atoi (argv [1]); int count = argc < 3 ? 1 : atoi (argv [2]); switch (test) { case 1: do_hle (count); break; case 2: do_raw (count); break; } return 0; }