Отказ от ответственности: слова не могут описать, насколько я ненавижу синтаксис стиля 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);
}
Я замечаю, что в этой версии нет "clobbering". Является ли это проблемой, я не знаю... Я полагаю, это зависит от того, компилятор строит функцию или нет. Использование этой версии вызывает проблемы, которые не всегда воспроизводятся.
Следующая версия, которую я нашел, -
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 или версия 2 или оба?