Сборка RISC-V на GCC — почему генерируется избыточная команда mv?

#riscv #riscv32

Вопрос:

У меня есть следующие строки

 la x14, L2
sw x13, 0(x14)
 

где находится адрес L2 0x2018 .

Когда я генерирую файл ELF и проверяю его с помощью objdump , это то, что я вижу (только соответствующие части):

 ...
1018: auipc   a4,0x1
101c: mv      a4,a4
1020: sw      a3,0(a4) # 2018 <L2>
...
 

Строка в 1018, т.е. mv a4 a4 переводится в addi a4, a4, 0 которую, является избыточной. Почему это генерируется? Разве это не будет работать без этой строки?

Есть ли у gcc требование всегда генерировать 2 инструкции для la инструкции?

Ответ №1:

la является псевдокомандой для RISC-V.

См., например, это описано в книге Программирование на языке сборки RISC-V, глава 4.10.2 «Псевдоинструкция la».

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

1. Спасибо, да, но что нужно генерировать mv a4, a4 ? Это в основном то же nop самое, что и .

2. mv a4, a4 то же addi a4, a4, 0 самое, что и . В вашем случае на нее указывает перемещение, чтобы компоновщик мог заменить 0 на подходящее значение. В случае, если значение остается равным нулю, инструкция удаляется. Этот процесс известен как расслабление компоновщика .