免責事項:AT&Tスタイルの構文をどれだけ嫌うかを言葉で説明することはできません
レジスターの破損が原因であると思われる問題があります。そうでなければ、私ははるかに大きな問題を抱えています。
私が最初に使用したバージョンは
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);
}
このバージョンには「クラバリング」のものがないことに気づきました。これが問題かどうかはわかりませんが…コンパイラが関数をインライン化するかどうかによると思います。このバージョンを使用すると、常に再現できるとは限らない問題が発生します。
私が見つけた次のバージョンは
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;
}
これは安心して読めない公式な見た目ですが、私が言ったように、私の問題は常に再現可能であるとは限らないので、私は単に私の問題の考えられる原因の1つを除外しようとしています。
最初のバージョンが問題であると私が信じる理由は、以前に関数パラメーターを保持していたレジスターを上書きしているためです。
何が正しいですか...バージョン1、バージョン2、またはその両方?