访存指令¶
向量访存指令的编码采用了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
作者: