这是原始代码:
#define CPU_PREFETCH(cache_line) \
{ int* address = (int*) (cache_line); \
_asm mov edx, address \
_asm prefetcht0[edx] \
}
#define CPU_GET_CYCLES(low) \
{ \
_asm rdtsc \
_asm mov dword ptr [low], eax \
}
#define CPU_SYNC \
{ \
_asm mov eax, 0 \
_asm cpuid \
}
#define CPU_CACHE_FLUSH(cache_line) \
{ int* address = (int*) (cache_line); \
_asm mov edx, address \
_asm clflush[edx] \
_asm mfence \
}
感谢Jester,我现在有了这个:
#define CPU_PREFETCH(cache_line) \
{ \
__asm__ __volatile__ ("prefetcht0 %0" : : "m" (*(int*)cache_line)); \
}
#define CPU_GET_CYCLES(low) \
{ \
__asm__ __volatile__ ("rdtsc" : "=a" (low) : : "%edx"); \
}
#define CPU_SYNC \
{ \
__asm__ __volatile__ ("cpuid" : : : "%eax", "%ebx", "%ecx", "%edx"); \
}
#define CPU_CACHE_FLUSH(cache_line) \
{ \
__asm__ ("clflush %0; mfence" : : "m" (*(int*)cache_line)); \
}
显然,gcc不喜欢clflush的 volatile 。 感谢大家。
我正在尝试使用gcc编译Slicing-By-8作为dll,以便我可以在我的VB6应用程序中使用它。
答案 0 :(得分:4)
使用正确的内联函数会很好。无论如何,这是你的宏版本:
#define CPU_PREFETCH(cache_line) \
{ \
__asm__ __volatile__ ("prefetcht0 %0" : : "m" (*(int*)cache_line)); \
}
#define CPU_GET_CYCLES(low) \
{ \
__asm__ __volatile__ ("rdtsc" : "=a" (low) : : "%edx"); \
}
#define CPU_SYNC \
{ \
__asm__ __volatile__ ("cpuid" : : : "%eax", "%ebx", "%ecx", "%edx"); \
}
#define CPU_CACHE_FLUSH(cache_line) \
{ \
__asm__ __volatile__ ("clflush %0; mfence" : : "m" (*(int*)cache_line)); \
}
答案 1 :(得分:3)
为什么不告诉GCC你只想编译英特尔语法,而不是将英特尔语法转换为AT& T?
你可以这样做:
在任何其他装配线之前添加此行:
asm(".intel_syntax noprefix\n");
然后像这样运行GCC:
gcc -o my_output_file -masm=intel my_src_file.c