跳转至

块指令开始伪指令:BSTART

BSTART.<type> <brType>, <label>     /*通用伪指令形态*/

BSTART <brType>, <label>            /*块类型为标准块时的通用伪指令形态*/

跳转类型为FALL的标准块的两种简化表达形式

BSTART                              /*块类型为标准块且跳转类型为FALL时的伪指令形态*/

BSTART.STD                          /*块类型为标准块且跳转类型为FALL时的伪指令形态*/

BSTART表示块指令的开始,从此开始的汇编可以是块头描述的积累,也可以是块体微指令,直至遇到块指令的结束。块指令要求以'BSTART'开头,否则会触发运行异常,汇编器不做额外的检测。BSTART的汇编伪指令描述包含块的类型、跳转类型及跳转类型为DIRECT、CALL、COND时的跳转目标地址。链接器根据链接的实际情况,生成最终的汇编,最终汇编可能的情况有:

  • 与伪指令形态一致
  • 生成压缩块头指令'C.BSTART'。生成该形态的汇编要求使能编译器压缩指令特性。

接下来主要详细描述一下BSTART伪指令中<type>、<brType>及<label>。

块类型

<type>用来指示块的类型,块的类型包括STD, FP, SYS, SIMT, LOOP, ECALL, ERET,缺省示标准块。

块指令种类 描述
STD 标准块指令 Standard Block,块内允许所有的公有编码域的指令及标准块的私有编码域的指令
FP 浮点块指令 Floating-point Block,块内允许所有的公有编码域的指令及浮点块的私有编码域的指令
SYS 系统块指令 System Block,块内允许所有的公有编码域的指令及系统块的私有编码域的指令。
PAR 并行块指令,块内仅支持所有的并行块私有编码域的指令,指示该并行块group间可并行,相关参数需要提前配置。
VECT 向量块指令,块内仅支持所有的SIMT块私有编码域的指令,指示该块group内可并行,相关的参数需提前配置。

跳转类型

<brType>用来指示块的跳转类型,跳转类型包括FALL, DIRECT, CALL, INDCALL, IND, COND, RET。仅支持标准块的FALL类型的缺省。

描述符 简要描述 是否具有操作对象 操作对象的格式约束
FALL Fall-Through,顺序执行接下来的一个块指令 NA
DIRECT 直接跳转到该操作对象的值指向的块指令的位置 表达式(某个块头地址)
CALL 直接跳转到此操作对象的值指向的位置,并且需要用addpc将顺序的下一个块指令的第一条块头地址设置到RA寄存器中 表达式(某个块头地址)
COND 有条件地跳转到此操作对象的值指向的位置 表达式(某个块头地址)
IND 间接跳转到setc.tgt的操作数的值所指向的位置 NA
ICALL 间接跳转到setc.tgt的操作数的值所指向的位置,并且需要用addpc将顺序的下一个块指令的第一条块头地址设置到RA寄存器中 NA
RET 间接跳转到setc.tgt的操作数的值所指向的位置 NA

使用注意事项

  • 对于块类型为PAR的块,其跳转类型只支持FALL。

  • COND跳转类型的块指令的块体需要包含setc.cond类的微指令。

  • CALL跳转类型的块指令的块体中需要addpc来设置RA寄存器中的值。

  • 间接跳转类型的块指令的块体中需要包含setc.tgt。

  • FALL/DIRECT/CALL跳转类型的块指令的块体中不能出现setc.开头的微指令。

跳转目标地址

<label>仅在跳转类型为DIRECT、CALL、COND这三种情况下存在。

示例

基础示例:

BSTART.STD COND, .LBB0     /* 标准块指令有条件跳转的跳转目标地址为label(‘.LBB0’)对应的地址 */
微指令
BSTART COND, 0x20000       /* 标准块指令有条件跳转的跳转目标地址为0x20000 */
微指令
.LBB0:
BSTART                     /* 跳转类型为FALL的标准块指令*/

向量数据块需要提前设置LB寄存器,具体使用方式可以参见向量数据块