向量指令¶
汇编语法¶
向量指令的汇编格式如下:
其中,SrcR1和SrcR2表示输入寄存器,DstR表示输出寄存器。T½表示对寄存器中数据类型的说明,W指定输出寄存器的位宽。
和传统标量寄存器不同,向量寄存器有4种可选宽度。每条指令需要通过汇编标识B,H,W,D来表达其输出寄存器的宽度,其中:
- B:全称Byte,表示8位寄存器。
- H:全称Half Word,表示16位寄存器。
- W:全称Word,表示32位寄存器。
- D:全称Double Word,表示64位寄存器。
例如指令op t#1.sw, u#2.sw, ->n.w,其中.sw和.w表示源寄存器t#1, u#2和目的寄存器n都是32位宽度的寄存器。
需要特殊注意的是:
- 一条指令的输入寄存器和输出寄存器位宽允许不相同。如果目的寄存器更宽则扩展,更窄则截断。
- 不同的指令,后序指令索引前序指令输出时,后序指令指定的源寄存器位宽必须与前序指令的输出寄存器位宽一致。否则硬件报异常。
解码类型¶
向量指令采用前缀与主指令拼接的方式进行编码,指令长度统一为64bit。其中低32位是前缀指令,高32位是主指令。
向量指令解码类型如下:
各域段编解码说明¶
向量指令域段主要包括输入寄存器域、输出寄存器域、操作数参数域和立即数域,下面是对各个域的详细说明。
输入寄存器域¶
输入寄存器域为描述符中带有Src的域段,包括:SrcL, SrcR, SrcD, SrcP等。
无特殊说明,该域索引编码与对应的寄存器映射关系如下表:
| RegSrc | 寄存器名 | 寄存器别名 | 解释 |
|---|---|---|---|
| 0-3 | VTR1-VTR4 | VT#1-VT#4 | VT结果队列前第一至第四条指令结果 |
| 4-7 | Reserve | Reserve | 预留 |
| 8-11 | VUR1-VUR4 | VU#1-VU#4 | VU结果队列前第一至第四条指令结果 |
| 12-15 | Reserve | Reserve | 预留 |
| 16-19 | VMR1-VMR4 | VM#1-VM#4 | VM结果队列前第一至第四条指令结果 |
| 20-23 | Reserve | Reserve | 预留 |
| 24-27 | VNR1-VNR4 | VN#1-VN#4 | VN结果队列前第一至第四条指令结果 |
| 28-31 | Reserve | Reserve | 预留 |
| 32-41 | RI0-RI11 | RI0-RI11 | 全局寄存器输入形参 |
| 42-55 | Reserve | Reserve | 预留 |
| 56-59 | TR1-TR4 | T#1-T#4 | T结果队列前第一至第四条指令结果 |
| 60-63 | UR1-UR4 | U#1-U#4 | U结果队列前第一至第四条指令结果 |
| 64 | Lane Counter 0 | LC0 | lane计数寄存器0, 最内层迭代变量 |
| 65 | Lane Bound 0 | LB0 | lane上限寄存器0, 最内层迭代长度 |
| 66-67 | Reserve | Reserve | 预留 |
| 68 | Lane Counter 1 | LC1 | lane计数寄存器1, 第二层迭代变量 |
| 69 | Lane Bound 1 | LB1 | lane上限寄存器1, 第二层迭代长度 |
| 70-71 | Reserve | Reserve | 预留 |
| 72 | Lane Counter 2 | LC2 | lane计数寄存器2, 第三层迭代变量 |
| 73 | Lane Bound 2 | LB2 | lane上限寄存器2, 第三层迭代长度 |
| 74-79 | Reserve | Reserve | 预留 |
| 80 | TA | TA | 第一个输入Tile寄存器形参 |
| 81 | TB | TB | 第二个输入Tile寄存器形参 |
| 82 | TC | TC | 第三个输入Tile寄存器形参 |
| 83 | TD | TD | 第四个输入Tile寄存器形参 |
| 84 | TE | TE | 第五个输入Tile寄存器形参 |
| 85 | TF | TF | 第六个输入Tile寄存器形参 |
| 86 | TG | TG | 第七个输入Tile寄存器形参 |
| 87 | TH | TH | 第八个输入Tile寄存器形参 |
| 88 | TO | TO | 第一个输出Tile寄存器形参 |
| 89 | TO1/TS | TO1/TS | 第二个输出Tile寄存器形参 |
| 90 | TO2 | TO2 | 第三个输出Tile寄存器形参 |
| 91 | TO3 | TO3 | 第四个输出Tile寄存器形参 |
| 92 | P | P | 掩码寄存器 |
| 93-94 | Reserve | Reserve | 预留 |
| 95 | Zero | Zero | 零寄存器 |
| 96 | VTR1.REUSE | VT#1.REUSE | VT结果队列前第一条指令结果 |
| 97 | VTR2.REUSE | VT#2.REUSE | VT结果队列前第二条指令结果 |
| 98 | VTR3.REUSE | VT#3.REUSE | VT结果队列前第三条指令结果 |
| 99 | VTR4.REUSE | VT#4.REUSE | VT结果队列前第四条指令结果 |
| 100-103 | Reserve | Reserve | 预留 |
| 104 | VUR1.REUSE | VU#1.REUSE | VU结果队列前第一条指令结果 |
| 105 | VUR2.REUSE | VU#2.REUSE | VU结果队列前第二条指令结果 |
| 106 | VUR3.REUSE | VU#3.REUSE | VU结果队列前第三条指令结果 |
| 107 | VUR4.REUSE | VU#4.REUSE | VU结果队列前第四条指令结果 |
| 108-111 | Reserve | Reserve | 预留 |
| 112 | VMR1.REUSE | VM#1.REUSE | VM结果队列前第一条指令结果 |
| 113 | VMR2.REUSE | VM#2.REUSE | VM结果队列前第二条指令结果 |
| 114 | VMR3.REUSE | VM#3.REUSE | VM结果队列前第三条指令结果 |
| 115 | VMR4.REUSE | VM#4.REUSE | VM结果队列前第四条指令结果 |
| 116-119 | Reserve | Reserve | 预留 |
| 120 | VNR1.REUSE | VN#1.REUSE | VN结果队列前第一条指令结果 |
| 121 | VNR2.REUSE | VN#2.REUSE | VN结果队列前第二条指令结果 |
| 122 | VNR3.REUSE | VN#3.REUSE | VN结果队列前第三条指令结果 |
| 123 | VNR4.REUSE | VN#4.REUSE | VN结果队列前第四条指令结果 |
| 124-127 | Reserve | Reserve | 预留 |
操作数参数域¶
64bit解码格式的微指令需要指定输入数据的数据类型输出寄存器的宽度。所使用的参数域如下:
- s/t width:这个域段处于Src/RegDst的高三位,用于表示源/目的寄存器中的数据类型,即如何解析输入/输出寄存器中的数据。该域对所有并行块的输入/输出寄存器有效。具体介绍如下:
| s/t width | 汇编标识 | 解释 |
|---|---|---|
| 浮点指令(输入) t width | ||
| 000 | fd | 操作数为64bit双精度浮点型数据 |
| 001 | fs | 操作数为32bit单精度浮点型数据 |
| 010 | fh | 操作数为16bit半精度浮点型数据 |
| 011 | fb | 操作数为8bit低精度浮点型数据 |
| 100 | reserve | 预留编码 |
| 101 | reserve | 预留编码 |
| 110 | reserve | 预留编码 |
| 111 | reserve | 预留编码 |
| 整型指令(输入) s width | ||
| 000 | ud | 操作数为64bit无符号整型数据 |
| 001 | uw | 操作数为32bit无符号整型数据 |
| 010 | uh | 操作数为16bit无符号整型数据 |
| 011 | ub | 操作数为8bit无符号整型数据 |
| 100 | sd | 操作数为64bit有符号整型数据 |
| 101 | sw | 操作数为32bit有符号整型数据 |
| 110 | sh | 操作数为16bit有符号整型数据 |
| 111 | sb | 操作数为8bit有符号整型数据 |
输出寄存器域¶
输出寄存器域是使用描述符RegDst标记的域段。索引编码如下:
| RegDst | 寄存器名 | 寄存器别名 | 解释 |
|---|---|---|---|
| 0 | VT | VT | Push到VT队列 |
| 1 | VU | VU | Push到VU队列 |
| 2 | VM | VM | Push到VM队列 |
| 3 | VN | VN | Push到VN队列 |
| 4~31 | reserve | reserve | 预留 |
| 32~35 | RO0~RO3 | 全局寄存器输出形参 | |
| 36~61 | reserve | reserve | 预留 |
| 62 | U | U | Push到U队列 |
| 63 | T | T | Push到T队列 |
| 64~91 | reserve | reserve | 预留 |
| 92 | P | P | 掩码寄存器 |
| others | Reserve | Reserve | 预留 |
输出寄存器位宽编码:
| width | 汇编标识 | 解释 |
|---|---|---|
| 00 | d | 操作数为64bit整型数据 |
| 10 | w | 操作数为32bit整型数据 |
| 10 | h | 操作数为16bit整型数据 |
| 11 | b | 操作数为8bit整型数据 |
注意事项¶
- 同一条向量指令的输入寄存器和输出寄存器位宽允许不相同。如果目的寄存器更宽则扩展,更窄则截断。
- 不同的指令,后序指令索引前序指令输出时,后序指令指定的源寄存器位宽必须与前序指令的输出寄存器位宽一致。否则硬件报异常。