压缩后的C.LW和C.SW指令是否不能使用标签?

Are the compressed C.LW and C.SW instructions unable to use labels?

我正在编写一个 RISCV 规范子集的仿真器,打算使用压缩的 ISA 作为我定制的 16 位指令集的基线。但是,riscv32-unknown-elf-as 拒绝 assemble C.SW 和 C.LW 带有标签作为立即值的指令。

我知道 RV-C 只是基础 ISA 的扩展,不适合独立执行,但我想使用 riscv32-unknown-elf-as assembler 实用程序作为一个简单的工具我的 simulator/emulator.

assemble 小程序的方法

根据 RISC-V ISA 规范(截至撰写本文时),C.SW 指令采用 7 位立即数,并将该值左移两次(乘以 4)如下loads/stores 无论如何都假定为 4 字节对齐。

因此,riscv32-unknown-elf-as 认为以下程序集合法并成功 assembles:

C.SW x12, 64(x13)

有人会认为,如果标签正确对齐 4 字节,代表地址 0x64,您将能够编写等效的程序集:

C.SW x12, my_label(x13)

但是,riscv32-unknown-elf-as 拒绝 assemble 这一行,声明:

test_asm.S: Assembler messages:
test_asm.S:4: Error: illegal operands `c.sw x12,my_label(x13)'

我尝试了很多这种语法的组合,以及各种对齐指令w.r.t。标签。作为参考,这是程序集文件本身:

main:
    .option rvc
    c.sw x12, my_label(x13)

my_label:
    .word 1

是否需要添加额外的编译器指令?根据 ISA 规范,我希望这是有效的程序集。

汇编程序无法知道您在 x13 中可能有什么值,因此无法猜测 my_label 需要的偏移量。这些指令的立即数非常小,以至于您想使用相对值而不是绝对地址。

不过,如果您使用 target-base 形式,并在使用前定义它们,那么汇编器将接受紧凑指令并计算正确的偏移量/立即数。

试试这个:

my_label = 64

main:
    .option rvc
    c.sw x12, my_label(x13)

这是一个更大的有效标签示例:

label =  32
    .data
lab1:
    .word 0
lab2:
    .word 1
lab3 = lab2 - lab1
    .text
lab5:
    .word 0
lab6:
    .word 2
lab4 = lab6-lab5
main:
    .option rvc
    c.sw x12,64(x14)
    c.sw x12,label(x13)
    c.sw x12,lab3(x12)
    c.sw x12,lab4(x11)

唯一的限制似乎是汇编器希望看到这些短距离标签在使用前定义。

因为这些紧凑的指令有这么短的偏移量(reach),上面用相等和减法定义的标签可能是最有用的。 (在示例中,我们假设 lab1 的地址在 x12 中,而 lab5 在 x11 中。)