-1

У меня есть следующий код, который отлично работает в 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"); 

Спасибо

+3

Это не так просто, как изменение имени регистра. 'cpuid' и' rdtsc' являются инструкциями, специфичными для x86. Вам нужно будет определить, какой подходящий альфа-эквивалент для этих инструкций, и может быть даже не один. Лучшей идеей было бы просто использовать переносимый системный API для получения этой информации. Вам действительно нужна точность часов реального времени? И если вы это сделаете, действительно ли ваша целевая операционная система * не предоставляет переносимый способ запроса? –

+0

Пока я не говорю альфа, я вижу '__builtin_alpha_rpcc' в gcc [docs] (https://gcc.gnu.org/onlinedocs/gcc/Alpha-Built-in-Functions.html). Встроенные функции обычно являются лучшим выбором, чем встроенный asm. –

+0

@CodyGray: да. , мне нужна точность. – ANTHONY

ответ

1

Я собираюсь идти вперед и предложить это как ответ , Я не на альфе, поэтому я ее не тестировал, но, похоже, соответствует требованиям OP и может быть полезен будущим пользователям SO.

Обычно я стараюсь избегать использования inline asm. Трудно получить право и легко ошибиться. Если мне нужно что-то, что сама C не предоставляет, я сначала подумал, что нужно использовать встроенную. В этом случае gcc docs a:

long x = __builtin_alpha_rpcc(); 

 Смежные вопросы

  • Нет связанных вопросов^_^