У меня есть следующий код, который отлично работает в x86/linux. Я хочу преобразовать этот код в ALPHA с помощью gcc cross compiler. Это порождает ошибки, как следующее:Альфа-эквивалент для x86-RDTSC?
неизвестное имя регистра «EAX» в «ASM»
Я не смог найти соответствующие источники, чтобы сделать самостоятельно.
inline uint64_t timestamp(void)
{
unsigned long a;
unsigned long d;
asm volatile("xorl %%eax,%%eax\n cpuid \n" ::: "%eax", "%ebx", "%ecx", "%edx"); // flush pipeline
asm volatile("rdtsc\n" : "=a" (a), "=d" (d)); // read rdtsc
asm volatile("xorl %%eax,%%eax\n cpuid \n" ::: "%eax", "%ebx", "%ecx", "%edx"); // flush pipeline again
return a | ((uint64_t)d << 32);
}
Я едва нашел, что rpcc эквивалентна инструкции для rdts. cpuid и xorl - то же самое, я думаю. Но eax, ebx - регистры, специфичные для x86, а не ALPHA. Регистры Alpha ISA нумеруются от 0 до 31, как here
Может кто-нибудь, пожалуйста, преобразует вышеуказанный код в ALPHA или может предложить мне, как это сделать, предоставив некоторые ссылки с разумной информацией?
Это будет достаточно, если я знаю, как преобразовать следующую строку, по крайней мере в ALPHA инлайн:
asm volatile ("rdtsc" : "=a" (a), "=d" (d) : : "ebx", "ecx");
Спасибо
Это не так просто, как изменение имени регистра. 'cpuid' и' rdtsc' являются инструкциями, специфичными для x86. Вам нужно будет определить, какой подходящий альфа-эквивалент для этих инструкций, и может быть даже не один. Лучшей идеей было бы просто использовать переносимый системный API для получения этой информации. Вам действительно нужна точность часов реального времени? И если вы это сделаете, действительно ли ваша целевая операционная система * не предоставляет переносимый способ запроса? –
Пока я не говорю альфа, я вижу '__builtin_alpha_rpcc' в gcc [docs] (https://gcc.gnu.org/onlinedocs/gcc/Alpha-Built-in-Functions.html). Встроенные функции обычно являются лучшим выбором, чем встроенный asm. –
@CodyGray: да. , мне нужна точность. – ANTHONY