Zastrzeżenie: Słowa nie mogą opisać, jak bardzo nienawidzę AT & T składniKtóry wbudowany kod zespołu jest poprawny dla rdtscp?
Mam problem, który mam nadzieję jest spowodowane rejestru przebijania. Jeśli nie, mam znacznie większy problem.
Pierwsza wersja Kiedyś był
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);
}
zauważam, nie ma „gdyż temu” rzeczy w tej wersji. Niezależnie od tego, czy jest to problem, którego nie znam ... Przypuszczam, że zależy to od tego, czy kompilator włącza funkcję, czy nie. Używanie tej wersji powoduje problemy z odtwarzaniem , które nie zawsze są odtwarzalne..
Kolejna wersja znalazłem jest
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;
}
to uspokajająco nieczytelny i oficjalny wygląd, ale jak mówiłem mój problem nie zawsze jest powtarzalna, więc jestem po prostu próbuje wykluczyć jedną możliwą przyczynę mojego problem.
Powodem, dla którego I wierzę w pierwszą wersją jest problem polegający na nadpisaniu rejestru, który poprzednio posiadał parametr funkcji.
Co jest poprawne ... wersja 1 lub wersja 2, lub obie?
Podziel się nienawiścią składni. Kiedy dojdę do tego punktu, szukam wewnętrznych funkcji kompilatora lub po prostu umieszczam funkcje w pliku .s i sam je montuję ... –
@MichaelDorgan VC++ oferuje piękne wewnętrzne, niestety nie. – James
+1 tylko dla "nie lubię składni stylu AT & T" –