Отказ от ответственности: Слова не могут описать, как я ненавижу AT & T синтаксисаКакой код встроенной сборки подходит для rdtscp?
стиля У меня есть проблема, которую я надеюсь, что вызывается регистр затирание. Если нет, у меня гораздо большая проблема.
Первый вариант я использовал
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;
}
Это успокоительно нечитаемое и официальный вид, но, как я сказал, что мой вопрос не всегда воспроизводим, так что я просто пытаюсь исключить одну возможную причину моего проблема.
Причина, по которой I считает первой проблемой, является то, что она перезаписывает регистр, который ранее содержал параметр функции.
Что такое ... версия 1 или версия 2 или оба?
Поделитесь своей ненавистью к синтаксису. Когда я дойду до этого момента, я ищу встроенные функции компилятора или просто поместите функции в файл .s и соберу их самостоятельно ... –
@MichaelDorgan VC++ предлагает прекрасный внутренний, gcc, к сожалению, нет. – James
+1 только для 'detest AT & T style syntax' –