跳转方式¶
在灵犀指令集中,控制流的灵活管理是实现高效并行计算的关键。块指令提供了7种不同的跳转方式,每种方式针对特定场景设计,共同构建了完整的控制流体系。
跳转方式分类¶
| 跳转类型 | 功能描述 | 目标地址 | 使用场景 |
|---|---|---|---|
| Fall | 顺序执行下一条块指令 | 下个顺延块首地址 | 默认执行流程 |
| Direct | 直接跳转到指定标签位置 | 直接跳转目标 label |
无条件跳转、循环控制 |
| Call | 调用子程序并保存返回地址 | 调用目标块头地址 label |
函数调用、代码复用 |
| Cond | 根据条件判断结果决定是否跳转 | 岔路目标块头地址 label |
条件分支、if-else逻辑 |
| Ind | 通过寄存器值间接跳转到动态计算的目标地址 | 间接目标块头地址 | 跳转表、动态调度 |
| Icall | 通过寄存器值间接调用子程序 | 间接目标块头地址 | 函数指针、多态调用 |
| Ret | 从子程序调用返回到调用点 | 间接目标块头地址 | 函数返回、调用栈管理 |
详细说明¶
1. Fall(顺延执行)¶
- 特点:默认执行模式,无显式跳转指令
- 行为:顺序执行下一条指令
使用场景:
.block0:
BSTART.STD FALL
inst0
inst1
...
instx
.block1:
BSTART.SYS FALL # 执行完.block0,顺序执行.block1
...
2. Direct(直接跳转)¶
- 特点:绝对地址跳转
- 指令格式:
BSTART.BType DIRECT, <label>
使用场景:
.block0:
BSTART.STD DIRECT, .block2
inst0
inst1
...
instx
.block1:
BSTART.SYS FALL
...
.block2:
BSTART.VPAR FALL
...
3. Call(调用)¶
- 特点:原子地退役当前 block,安装 direct-call BARG,并将显式返回目标写入
ra。 - 指令格式:
BSTART.CALL <br_label>, <rt_label>, ->ra
使用场景:
.block0:
BSTART.CALL .block2, .block1, ->ra
.block1:
BSTART.SYS FALL
...
.block2:
BSTART.VPAR FALL
...
br_label 与 rt_label 是两个相互独立的 PC-relative 操作数。该操作不需要,也不允许再用独立的 SETRET 提供返回目标。
4. Cond(条件跳转)¶
- 特点:基于块内
setc.cond指令条件判断结果决定是否跳转,不跳转则顺延执行下个块。 - 约束:不能是空块,块内必须包含一条setc.cond指令。
使用场景:
.block0:
BSTART.STD COND, .block2
inst0
setc.eq a0, t#1 # 判断a0和t#1是否相等,决定是否跳转到block2
...
instx
.block1:
BSTART.SYS FALL
...
.block2:
BSTART.VPAR FALL
...
5. Ind(间接跳转)¶
- 特点:目标地址来自块内计算结果
- 约束:不能是空块,块内必须包含一条setc.tgt指令。
使用场景:
.block0:
BSTART.STD IND
inst0
add a0, t#1, ->t
setc.tgt t#1 # 设置跳转目标地址
...
instx
.block1:
BSTART.SYS FALL
...
.block2:
BSTART.VPAR FALL
...
6. Icall(间接调用)¶
- 特点:原子地退役活动的 STD 或 FP block,将该 block 的
BARG.BPCN快照为间接调用目标,并将显式返回标签写入ra。 - 指令格式:
BSTART.ICALL <rt_label>, ->ra - 约束:退役 block 必须具有有效的 STD/FP BARG,且
BPCN必须对齐。该指令不读取SETC.TGT,也不需要独立的SETRET。
使用场景:
.block0:
BSTART.STD DIRECT, .block2 # 建立将要退役的 BARG.BPCN
...
instx
BSTART.ICALL .block1, ->ra # 快照 BPCN 并写入返回目标
.block1:
BSTART.SYS FALL
...
.block2:
BSTART.VPAR FALL
...
7. Ret(调用返回)¶
- 特点:恢复调用上下文
- 约束:不能是空块,块内必须包含一条setc.tgt指令。
使用场景:
总结¶
这些跳转方式共同构建了灵犀指令集灵活高效的控制流系统,使程序员能够在保持代码简洁性的同时实现复杂的跳转控制逻辑。
并不是所有类型的块都支持以上7种块类型,允许某种块类型仅支持一种或几种跳转方式,具体根据块类型特点而定。