Le problème spécifique OP a de côté: je l'ai trouvé un moyen de définir une macro qui fonctionne pour les deux versions de syntaxe:
#ifdef _MSC_VER
# define ASM(asm_literal) \
__asm { \
asm_literal \
};
#elif __GNUC__ || __clang__
# define ASM(asm_literal) \
"__asm__(\"" \
#asm_literal \
"\" : :);"
#endif
Malheureusement, parce que le préprocesseur strips newlines before macro expansion, vous devez entourer chaque déclaration d'assemblage avec cette macro .
float abs(float x) {
ASM(fld dword ptr[x]);
ASM(fabs );
ASM(fstp dword ptr[x]);
return x;
}
Mais s'il vous plaît noter que GCC et clang use AT&T/UNIX assembly synax mais MSVC Intel syntaxe usées assemblage (n'a pas pu trouver aucune source officielle bien).Mais heureusement, GCC/clang peut aussi être configured to use Intel syntax. Soit utiliser __asm__(".intel_syntax noprefix");
/__asm__(".att_syntax prefix");
(soyez sûr de réinitialiser les changements car cela affectera tout l'ensemble généré à partir de ce point, même celui généré par le compilateur à partir de la source C). Cela nous laisse avec une macro comme ceci:
#ifdef _MSC_VER
# define ASM(asm_literal) \
__asm { \
asm_literal \
};
#elif __GNUC__ || __clang__
# define ASM(asm_literal) \
"__asm__(\".intel_syntax noprefix\");" \
"__asm__(\"" \
#asm_literal \
"\" : :);" \
"__asm__(\".att_syntax prefix\");"
#endif
Ou vous pouvez aussi compiler avec GCC/clang en utilisant le drapeau -masm=intel
, qui commute la syntaxe à l'échelle mondiale.
Merci! Existe-t-il une variante linux pour intrinsèques rdtsc? –