控制线程指令¶
控制线程指令的长度为32位,采用ROCC格式,如下所示:
| funct[6:0] | rs2[4:0] | rs1[4:0] | xd | xs1 | xs2 | rd[4:0] | opcode[6:0] |
|---|---|---|---|---|---|---|---|
| roccinst | src2 | src1 | xd | xs1 | xs2 | dest | custom-0/1 |
其中:
- 自定义
opcode遵从RISC-V指令集文档中给出的划分:
| 操作码 | 值 |
|---|---|
| custom-0 | 0001011 |
| custom-1 | 0101011 |
x*域标识相应的操作数/结果是否来自/写回相应的源寄存器/结果寄存器:- 若
xs*置位,则操作数来自相应寄存器;否则为立即数/无效; - 若
xd置位,结果写回控制线程rd寄存器。
- 若
向量配置指令¶
VSETVL/VSETVLI 指令根据其参数设置vtype和vl寄存器的值,并将新的vl值写入rd寄存器。
新的vtype由立即数或者rs2寄存器保存的值来编码。
新的vl通过在rs1寄存器中的值与新的vtype设置下硬件支持的最大向量长度中取最小值取得。如果 rs1=x0 而 rd!=x0 ,则将vl设置为VLMAX。如果 rs1=x0 且 rd=x0 ,则修改vtype而保持vl不变。
VSETVL/VSETVLI指令编码格式如下:
| funct[6:0] | rs2[4:0] | rs1[4:0] | xd | xs1 | xs2 | rd[4:0] | opcode[6:0] | |
|---|---|---|---|---|---|---|---|---|
| 0000000 | rs2 | rs1 | 1 | 1 | 1 | rd | custom-0 | VSETVL |
| imm[11:5] | imm[4:0] | rs1 | 1 | 1 | 0 | rd | custom-0 | VSETVLI |
向量移动指令¶
VMCS 指令将内容从控制线程的rs1寄存器移动到向量共享寄存器sd,VMCSH 设置高 32 位。VMCS 和 VMCSH 指令编码格式如下:
| funct[6:0] | rs2[4:0] | rs1[4:0] | xd | xs1 | xs2 | rd[4:0] | opcode[6:0] | |
|---|---|---|---|---|---|---|---|---|
| 0000000 | 10000 | rs1 | 0 | 1 | 0 | sd | custom-1 | VMCS |
| 1000000 | 10000 | rs1 | 0 | 1 | 0 | sd | custom-1 | VMCSH |
向量取指指令¶
VF指令根据目标地址执行一块向量指令代码。目标地址通过将12位有符号立即数加至rs1寄存器获得。VF指令编码格式如下:
| funct[6:0] | rs2[4:0] | rs1[4:0] | xd | xs1 | xs2 | rd[4:0] | opcode[6:0] | |
|---|---|---|---|---|---|---|---|---|
| imm[11:5] | 00000 | rs1 | 0 | 1 | 0 | imm[4:0] | custom-1 | VF |
指令总览¶
| funct[6:0] | rs2[4:0] | rs1[4:0] | xd | xs1 | xs2 | rd[4:0] | opcode[6:0] | |
|---|---|---|---|---|---|---|---|---|
| 0000000 | 00000 | rs1 | 1 | 1 | 1 | rd | 0001011 | VSETVL |
| imm[11:5] | imm[4:0] | rs1 | 1 | 1 | 0 | rd | 0001011 | VSETVLI |
| 0000000 | 10000 | rs1 | 0 | 1 | 0 | sd | 0101011 | VMCS |
| 1000000 | 10000 | rs1 | 0 | 1 | 0 | sd | 0101011 | VMCSH |
| imm[11:5] | 00000 | rs1 | 0 | 1 | 0 | imm[4:0] | 0101011 | VF |
最后更新: July 2, 2020
作者: