#include <stdio.h>
#include <stdint.h>
asm(".text\n"
".globl cmpxchg64\n"
"cmpxchg64:\n"
"mov %rdx,%rax\n"
"lock cmpxchg %rsi,(%rdi)\n"
"ret\n"
);
asm(".text\n"
".globl atomic_add64\n"
"atomic_add64:\n"
" lock xadd %rsi,(%rdi)\n"
"ret\n"
);
asm(".text\n"
".globl atomic_set64\n"
"atomic_set64:\n"
" xchg %rsi,(%rdi)\n"
"ret\n"
);
asm(".text\n"
".globl atomic_read64\n"
"atomic_read64:\n"
" mov (%rdi),%rax\n"
"ret\n"
);
extern uint64_t atomic_set64(uint64_t *ptr, uint64_t v); /* System V ABI */
extern uint64_t atomic_add64(uint64_t *ptr, uint64_t v); /* System V ABI */
extern uint64_t atomic_read64(uint64_t *ptr); /* System V ABI */
extern uint64_t cmpxchg64(uint64_t *ptr, uint64_t new_value, uint64_t compare_value); /* System V ABI */
今日人氣: 32
累積人氣: 188105
2012
06
05
13
54
[c] 自製InterlockedExchange64, 讓gcc 4.xx 64bits 以前的環境可以使用.