Инструкция ПАУЗЫ — непризнанный код операции «пауза» в RISC-V

#c #linux #assembly #riscv

Вопрос:

В настоящее время я работаю над riscv64 linux на основе SiFive Freedom Unleashed SDK.

Я хотел бы реализовать инструкцию pause с помощью расширенной инструкции asm, встроенной в мой код на языке Си. Ниже приведен пример:

 #include <stdio.h>
#include <stdlib.h>

int main(){
        int a = 10;  
        __asm__ volatile("rep;nop;"::);
        return 0;
}
 

Когда я попытался скомпилировать программу, ассемблер выдает ошибку, в которой говорится: «Ошибка: непризнанный код операции «представитель»».

Я попытался заменить его __asm__ __volatile__ ("pause"::); , и возникла аналогичная ошибка: «Ошибка: непризнанный код операции «пауза»».

В соответствии с Руководством по набору инструкций RISC-V:

ПАУЗА кодируется как команда ЗАБОРА с pred=W, succ=0, fm=0, rd=x0 и rs1=x0

Поэтому я предполагаю, что правильный способ реализации начинается с __asm__ volatile("fence") , но как реализовать ограничения (pred=W, succ=0, fm=0, rd=x0 и rs1=x0)?

Если мое понимание неверно, не мог бы кто-нибудь, пожалуйста, сказать мне, как реализовать инструкцию pause с расширенным asm?

Заранее спасибо.

Комментарии:

1. rep;nop это то, как pause инструкция x86 ( felixcloutier.com/x86/pause ) может быть закодирован с помощью старых ассемблеров x86, которые не распознают pause мнемонику. Это мнемоника x86, а не RISC-V. Конечно, ассемблер RISC-V не распознает rep мнемоническую ( felixcloutier.com/x86/rep:repe:repz:repne:repnz ). Я бы посоветовал убрать это отвлечение от вашего вопроса.

2. Я понимаю, почему ваш ассемблер RISC-V не распознает мнемонику RISC-V pause , если только она не новая или не требуется какая -march -либо опция. (встроенный ассемблер clang trunk не справляется с этим: godbolt.org/z/o6rxK7GE5 ). Вы могли бы закодировать его вручную .word 0x... .

3. @PeterCordes: Спасибо за ваш ответ. Что касается кодирования вручную, вы имели в виду asm volatile(«.word 0x…»)?

4. Да, но, конечно, вам нужно проверить руководство RISC-V, чтобы выяснить, какое 32-разрядное шестнадцатеричное значение следует использовать, исходя из сведений о том, для каких полей и для fence каких .

5. @PeterCordes re: кодирование вручную: приятно знать, что эквивалент установки множества переключателей и кнопки «загрузить» все еще доступен в эту современную эпоху. Я боялся, что это исчезло еще в 1970-х годах!