跳转至

访存指令

向量访存指令的编码采用了RISC-V标量浮点的访存指令格式。

nf[2:0] mop[2:0] vm umop/rs2[4:0] rs1[4:0] width[2:0] rd/rs3[4:0] opcode[6:0]
nf mop vm lumop ss1 width vd 0000111 VL*
nf mop vm ss2 ss1 width vd 0000111 VLS*
nf mop vm vs2 ss1 width vd 0000111 VLX*
nf mop vm sumop ss1 width vs3 0100111 VS*
nf mop vm ss2 ss1 width vs3 0100111 VSS*
nf mop vm vs2 ss1 width vs3 0100111 VSX*

其中:

  • ss1寄存器保存访存指令的基地址。

  • 对于 unit-stride 访存指令,lumop/sumop编码了指令的不同变种。

  • 对于 strided 访存指令,ss2寄存器保存 stride 值;对于indexed访存指令,ss2寄存器保存地址 offset 值。

  • 对于 STORE 指令,vs3寄存器为要保存的值。

  • vm域标记指令是否被 mask。

  • width域:上表中的 * 可以为 B/H/W/E ,分别表示向目标寄存器的每个单元中加载一个字节/半字/字/单元,通过width域进行编码:

width[2:0] 存储数据量/bit 寄存器数据量/bit 指令
标量浮点半字 001 16 FLEN FLH/FSH
标量浮点字 010 32 FLEN FLW/FSW
标量浮点双字 011 64 FLEN FLD/FSD
标量浮点四字 100 128 FLEN FLQ/FSQ
向量字节 000 vl*8 vl*SEW VxB
向量半字 101 vl*16 vl*SEW VxH
向量字 110 vl*32 vl*SEW VxW
向量单元 111 vl*SEW vl*SEW VxE

如上表所示,width域中有四种编码被标量浮点访存指令占用,未来拟采用这四个编码作为共享寄存器的访存指令。

  • mop域:mop域编码访存地址模式,包括 unit-stride/strided/indexed ,以及非单元尺寸访存的扩展模式:
mop[2:0] LOAD说明 LOAD指令
000 零扩展,unit-stride VLxU, VLE
001 保留
010 零扩展,strided VLSxU, VLSE
011 零扩展,indexed VLXxU, VLXE
100 符号扩展,unit-stride VLx (x!=E)
101 保留
110 符号扩展,strided VLSx (x!=E)
111 符号扩展,indexed VLXx (x!=E)
mop[2:0] STORE说明 STORE指令
000 unit-stride VSx
001 保留
010 strided VSSx
011 indexed-ordered(保留元素顺序) VSXx
100 保留
101 保留
110 保留
111 indexed-unordered(不保留元素顺序) VSUXx

根据RISC-V向量指令集文档,indexed-unordered访存指令为非必需的实现优化。

Warning

TODO: lumop/sumop域编码的指令变种以及segment访存指令


最后更新: April 8, 2020
作者: Harry Chen (57.35%), Jianhui Han (32.35%), Jiajie Chen (10.29%)