跳转至

跳转方式

在灵犀指令集中,控制流的灵活管理是实现高效并行计算的关键。块指令提供了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_labelrt_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指令

使用场景:

.block0: 
    BSTART.STD RET
    inst0
    setc.tgt ra           # 设置返回地址
    ...
    instx
.block1:
    BSTART.FP FALL
    ...

总结

这些跳转方式共同构建了灵犀指令集灵活高效的控制流系统,使程序员能够在保持代码简洁性的同时实现复杂的跳转控制逻辑。

并不是所有类型的块都支持以上7种块类型,允许某种块类型仅支持一种或几种跳转方式,具体根据块类型特点而定。