跳转至

向量指令

汇编语法

向量指令的汇编格式如下:

    opcode SrcR1<.T1>, SrcR2<.T2>, ->DstR<.W>

其中,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位是主指令。

向量指令解码类型如下:

instType64

各域段编解码说明

向量指令域段主要包括输入寄存器域输出寄存器域操作数参数域立即数域,下面是对各个域的详细说明。

输入寄存器域

输入寄存器域为描述符中带有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整型数据

注意事项

  • 同一条向量指令的输入寄存器和输出寄存器位宽允许不相同。如果目的寄存器更宽则扩展,更窄则截断。
  • 不同的指令,后序指令索引前序指令输出时,后序指令指定的源寄存器位宽必须与前序指令的输出寄存器位宽一致。否则硬件报异常。