• Hexagon_V65_Programmers_Reference_Manual(10)


    7.4 投机的跳跃

    条件指令通常依赖于在前一个指令包。然而,dot新断言(第6.1.4节)启用了条件断言使用在包含条件的同一数据包中生成的断言的说明指示当点新断言与条件跳转一起使用时,生成的指令是被称为投机跳跃。例如:
    {
    P0 = cmp.eq(R9,#16) // single-packet compare-and-jump
    IF (P0.new) jumpr:t R11 // … enabled by use of P0.new
    }
    推测性跳转需要程序员在跳转中指定方向提示指令,指示是否预期进行条件跳转。该提示用于初始化Hexagon处理器的动态分支预测器。无论何时预测器错误,推测跳转指令需要两个周期才能执行(由于管道失速)。提示可以通过指示推测性跳转的程度来提高程序性能预期在程序过程中执行:指定提示的频率越高指示指令的实际执行方式,性能越好。提示在汇编语言中通过将后缀“:t”或“:nt”附加到跳转指令符号。例如:

    • jump:t – The jump instruction will most often be taken
    • jump:nt – The jump instruction will most often be not taken
      除了点新断言外,推测性跳转也接受条件算术涉及通用寄存器Rs的表达式(=0,!=0,>=0,<=0)。表7-8列出了推测性跳转指令。
      t7-8
      7-8-1

    7.5 比较跳跃

    为了减少代码大小,Hexagon处理器支持一个复合指令,该指令在单个32位指令中结合比较和推测跳转。例如:
    {
    p0 = cmp.eq (R2,R5) // single-instr compare-and-jump
    if (p0.new) jump:nt target // enabled by compound instr
    }
    比较跳转中使用的寄存器操作数仅限于R0-R7或R16-R23(表10-3)。
    可在比较跳转中使用的比较和跳转指令仅限于表7-9中列出的指令。
    比较可以使用断言P0或P1,而跳转必须指定在比较中设置的相同断言。比较跳转指令在汇编源代码中表示为两个独立的比较并在数据包中跳转指令。汇编程序将这两条指令转换为单复合指令。
    7-9

    7.5.1 新值跳跃比较

    比较跳转指令可以访问在同一指令中分配了新值的寄存器

    指令包(第3.3节)。此功能由以下更改:

    • 将后缀“.new”附加到比较中的新值寄存器

    • 重写比较跳转,使其组成比较和跳转操作

    显示为单个条件指令,例如:
    // load-compare-and-jump packet enabled by new-value compare jump
    {
    R0 = memw(R2+#8)
    if (cmp.eq(R0.new,#0)) jump:nt target
    }

    新值比较跳转指令有以下限制:

    • 它们仅限于表7-10中列出的说明格式。

    • 它们不能与同一数据包中的另一个跳转指令组合。

    • 如果指令生成64位结果或执行浮点运算(第1.3.4节),其结果寄存器不能用作新的值寄存器。

    • 如果指令使用自动递增或绝对设置寻址模式(第5.8节),其地址寄存器不能用作新的值寄存器。

    • 如果设置新值寄存器的指令是有条件的(第6.1.2节),则
      必须始终执行

    如果指定的跳转方向提示错误(第7.4节),则新值比较跳转执行需要三个周期,而不是一个周期。而这个惩罚比有规律的投机性跳转,整体性能仍优于使用常规跳转推测性跳转(在所有情况下都必须执行额外的数据包)。

    注意,新的值比较跳转指令被分配给指令类NV,只能在插槽0中执行。分配新值的指令必须在插槽1、2或3中执行。
    7-10

    7.6 寄存器转换跳跃

    为了减少代码大小,Hexagon处理器支持一个复合指令,该指令将寄存器传输与单个32位指令中的无条件跳转相结合。例如:
    {
    jump target // jump to label “target”
    R1 = R2 // assign contents of reg R2 to R1
    }
    寄存器传输中的源寄存器和目标寄存器操作数限制为R0-R7或R16-R23(表10-3)。跳转中的目标地址是一个按比例缩放的9位PC相对地址值(与常规无条件跳转指令中的22位值)。
    寄存器转移跳转指令在汇编源代码中表示为两个独立的数据包中的指令。汇编程序将指令翻译成单个复合词指示
    表7-11列出了寄存器转移跳转指令
    7-11

    7.7 双路跳跃

    两个软件分支指令(此处称为“跳转”)可以出现在同一个目录中指令包,在表7-12中列出的条件下。第一次跳转定义为低位地址的跳转指令,第二次跳转定义为低位地址的跳转指令作为较高地址的跳转指令。

    与大多数分组操作不同,双跳转不是并行执行的(第3.3.1节)。

    相反,这两个跳转在数据包中以定义良好的顺序进行处理:

    1.计算第一个跳转中的断言。

    2.如果第一次跳转,则忽略第二次跳转。

    3.如果未进行第一次跳转,则执行第二次跳转。
    7-12-1
    7-12-2

    7.8 提示间接跳转目标

    因为它从寄存器中获得跳转目标地址,所以跳转指令(第7.3.1节)通常会导致处理器暂停一个周期。
    为了避免跳转指令引起的暂停惩罚,Hexagon处理器支持跳转提示指令hintjr,可以在跳转指令之前指定。
    hintjr指令表示程序即将执行跳转到包含在指定寄存器中的地址。表7-13列出了推测性跳转指令。
    7-13
    注意:为了防止暂停,必须至少执行2次hintjr指令相应jumpr指令之前的数据包。

    用作返回的jumpr指令不需要hintjr指令(第7.3.3节),因为在这种情况下,Hexagon处理器会自动根据最近的嵌套调用指令预测跳转目标

    7.9 暂停

    暂停暂停程序的执行一段时间,并将其置于低功耗状态模式程序在指令中指定的时间内保持挂起状态。

    pause指令接受无符号8位立即数操作数,该操作数指定以周期为单位的暂停持续时间。最大可能持续时间为263个周期(255+8)。

    Hexagon处理器中断导致程序在指定的暂停状态之前退出暂停状态持续时间已过。

    暂停指令有助于实现用户级低功耗同步操作(如旋转锁)。

    表7-14列出了暂停指令

    7-14

    7.10 异常

    暂停暂停程序的执行一段时间,并将其置于低功耗状态模式程序在指令中指定的时间内保持挂起状态。

    pause指令接受无符号8位立即数操作数,该操作数指定以周期为单位的暂停持续时间。最大可能持续时间为263个周期(255+8)。

    Hexagon 处理器中断导致程序在指定的暂停状态之前退出暂停状态持续时间已过。

    暂停指令有助于实现用户级低功耗同步操作(如旋转锁)。

    表7-14列出了暂停指令
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    快速平方根倒数计算
    二十一、vite中的glob-import批量导入
    go语言float64保留2位小数
    virtualbox安装openEuler-方案二
    【C++类和对象】const成员函数及流插入提取
    Parquet 文件生成和读取
    ELK监控nginx日志总结
    渗透测试--3.中间人攻击
    行业追踪,2023-10-25
    linux中好玩的数据流定向和管道命令一
  • 原文地址:https://blog.csdn.net/weixin_38498942/article/details/126029404