块指令开始伪指令:BSTART¶
跳转类型为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寄存器,具体使用方式可以参见向量数据块。