Haftungsausschluss: Worte können nicht beschreiben, wie sehr ich verabscheue AT & T Stil SyntaxWelcher Inline-Assemblercode ist für rdtscp korrekt?
Ich habe ein Problem, das ich hoffe, wird durch Register Clobbering verursacht. Wenn nicht, habe ich ein viel größeres Problem.
Die erste Version war ich verwendet
static unsigned long long rdtscp(void)
{
unsigned int hi, lo;
__asm__ __volatile__("rdtscp" : "=a"(lo), "=d"(hi));
return (unsigned long long)lo | ((unsigned long long)hi << 32);
}
ich es bemerkt, ist kein Material in dieser Version 'Verfälschungs'. Ob dies ein Problem ist oder nicht, weiß ich nicht ... Ich nehme an, es kommt darauf an, ob der Compiler die Funktion einreiht oder nicht. Die Verwendung dieser Version verursacht Probleme , die nicht immer reproduzierbar sind.
Die nächste Version, die ich gefunden ist
static unsigned long long rdtscp(void)
{
unsigned long long tsc;
__asm__ __volatile__(
"rdtscp;"
"shl $32, %%rdx;"
"or %%rdx, %%rax"
: "=a"(tsc)
:
: "%rcx", "%rdx");
return tsc;
}
Dieses beschwichtigend unlesbar ist und offiziell aussehende, aber wie ich schon sagte, mein Problem ist nicht immer reproduzierbar, so bin ich nur versucht, auf eine mögliche Ursache auszuschließen meine Problem.
Der Grund, warum ich glaube die erste Version ist ein Problem ist, dass es ein Register überschreibt, das zuvor einen Funktionsparameter enthielt.
Was ist korrekt ... Version 1 oder Version 2 oder beides?
Teilen Sie Ihren Hass der Syntax. Wenn ich an diesen Punkt komme, suche ich nach intrinsischen Funktionen des Compilers oder platziere einfach die Funktionen in einer .s-Datei und stelle sie selbst zusammen ... –
@MichaelDorgan VC++ bietet eine schöne intrinsische, gcc leider nicht. – James
+1 nur für 'AT & T-Stil-Syntax zu verachten' –