向 RISCV-32ima 添加新指令:“错误的 RISCV 操作码”

Lio*_*rel 5 binutils riscv

我正在寻求有关我尝试添加的扩展的帮助 riscv

全局设置

我的工作基线是riscv-toolsrepo的克隆,包含常用工具,其中包括:

  • riscv-fesvr
  • riscv-gnu-工具链
  • riscv-isa-sim
  • riscv 操作码
  • RISCV-PK

注意:我克隆的最后一次提交是c6d58cecb3862deb742e1a5cc9d1c682f2c50ba9(2018-04-24)。

我的工作基于一个riscv32-ima核心。我想向该处理器添加一条指令,该指令ISA将激活我的处理器中的特定组件。

从 proc 本身的行为来看,我没有问题:我修改了尖峰并且我的指令(以及我添加到处理器的组件)工作得很好。

在汇编程序中,指令如下所示:

addi a0, a0, 0
...            // other code
setupcomp      // activate my component ... 
...            // other code
Run Code Online (Sandbox Code Playgroud)

看到这条指令没有任何操作数。

我所做的

我躲了一会儿,发现这个教程有点旧

所以我:

  1. riscv-tools/riscv-opcodes/
  2. 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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 从那里,我重建必要的.h文件:

    make install
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在,我将必要的添加stuctsriscv-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)
    
    Run Code Online (Sandbox Code Playgroud)

    这些值是我从操作码项目生成的值中获得的。

  5. 我还将必要的定义添加到 riscv-tools/riscv-gnu-toolchain/riscv-binutils-gdb/opcodes/riscv-opc.c

    {"setupcomp", "I", "", MATCH_SETUPCOMP, MASK_SETUPCOMP, match_opcode, 0 },
    
    Run Code Online (Sandbox Code Playgroud)

现在,到这里为止,我相信我已经做了所有必要的事情。我仍然对我想要的操作码有疑问,但我认为这不会影响我观察到的行为以及我现在描述的行为。

我遇到的问题

当我用 构建所有东西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
Run Code Online (Sandbox Code Playgroud)

我想我在指令的声明中遗漏了一些东西,可能是这个声明没有正确地“转发”到实际需要它的工具链的每个部分。但我找不到在哪里/什么/如何/何时,我将非常感谢您对此的任何意见。

当然,我很可能遗漏了一些明显的东西,所以要温柔:)

小智 3

将自定义指令添加到工具链的最佳选择是使用我们的.insn汇编器指令。虽然这并没有给你提供漂亮的语法(你应该使用预处理器宏或 C 包装函数),但它确实可以让你避免接触工具链,因为这充满了问题。

最好的文档.insn. 本质上,用户可以发出 RISC-V ISA 手册定义的任何格式的指令,并可以选择直接填写每个位模式。这与 GCC 的内联汇编寄存器分配框架干净地集成,它的工作方式就像任何其他指令一样。