我正在寻求有关尝试添加到riscv
的扩展的帮助。
全局设置
我的工作基准是 riscv-tools
repo的克隆,其中包含常用工具,其中包括:
nb:我从中克隆的最后一个提交是
c6d58cecb3862deb742e1a5cc9d1c682f2c50ba9
(2018-04-24)。我的工作基于
riscv32-ima
核心。我想向该处理器的ISA
添加一条指令,以激活处理器中的特定组件。从proc本身的行为来看,我没有问题:我修改了峰值,并且我的指令(以及添加到处理器中的组件)运行得很好。
在汇编器中,指令如下所示:
addi a0, a0, 0
... // other code
setupcomp // activate my component ...
... // other code
看到该指令没有任何操作数。
我做的事情
我躲开了一段时间,发现了this tutorial,它有点旧了。
所以我:
riscv-tools/riscv-opcodes/
opcode
及其掩码添加到riscv-tools/riscv-opcodes/opcodes
中。我的看起来像这样:setupcomp 31..28=ignore 27..20=ignore 19..15=ignore 14..12=0 11..7=ignore 6..2=0x1a 1..0=3
.h
文件:make install
stucts
中添加了必要的riscv-tools/riscv-gnu-toolchain/riscv-binutils-gdb/include/opcode/riscv-opc.h
,并正式声明了该指令:#define MATCH_SETUPCOMP 0x6b
#define MASK_SETUPCOMP 0x707f
DECLARE_INSN(setupcomp, MATCH_SETUPCOMP, MASK_SETUPCOMP)
这些值是我从操作码项目中生成的。
riscv-tools/riscv-gnu-toolchain/riscv-binutils-gdb/opcodes/riscv-opc.c
:{"setupcomp", "I", "", MATCH_SETUPCOMP, MASK_SETUPCOMP, match_opcode, 0 },
现在,到这里为止,我相信我已经做了所有必要的事情。我仍然对我想要的操作码有疑问,但是我不认为这会对我观察到的行为和我现在描述的行为产生影响。
我遇到的问题
当我使用
riscv-tools/build-rv32ima.sh script
构建所有内容时,在过程即将结束时(我相信测试套件之类的东西),我收到一条消息,提示:Assembler messages:
Error: internal: bad RISC-V opcode (bits 0xffffffffffff8f80 undefined): setupcomp
Fatal error: Broken assembler. No assembly attempted.
make[6]: *** [lib_a-dummy.o] Error 1
我认为我在指令的声明中缺少某些内容,可能是该声明未正确“转发”到实际需要它的工具链的每个部分。
但是我找不到哪里/什么/如何/何时,对此我将不胜感激。
当然,我很可能会遗漏一些明显的东西,所以要格外温柔:)
最佳答案
向工具链中添加自定义指令的最佳选择是使用我们的.insn
汇编程序指令。虽然这没有给您漂亮的语法(应该使用预处理器宏或C包装函数),但确实可以避免接触到很多问题的工具链。
最好的文档是the GAS testsuite for .insn
。基本上,用户可以发出RISC-V ISA手册定义的任何格式的指令,并带有直接填写每个位模式的选项。它与GCC的内联汇编寄存器分配框架完全集成在一起,与其他任何指令一样工作。
关于riscv - 向RISCV-32ima添加新指令: "bad RISCV-opcode",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51825942/