• Hexagon_V65_Programmers_Reference_Manual(14)



    )

    10 指令编码

    本章介绍 Hexagon 处理器指令和指令包的二进制编码。

    10.1 指令

    所有 Hexagon 处理器指令都以 32 位指令字编码。 指令字格式因指令类型而异。

    指令字包含两种类型的位域:

    • 公共字段出现在每条处理器指令中,并且在所有指令中定义相同。
    • 指令特定字段仅出现在某些指令中,或者在整个指令集中定义不同。

    表 10-1 列出了指令位字段。

    表 10-1 指令字段

    NameDescriptionType
    ICLASS指令类命令
    Parse数据包/ 循环比特命令
    MajOpMaj主要操作码已下均为特定指令
    MinOpMin次要操作码
    RegType寄存器类型(32 位、64 位)
    Type操作数类型(字节、半字等)
    Amode寻址方式
    dn目标寄存器操作数
    sn源寄存器操作数
    tn源寄存器操作数 #2
    xn源和目标寄存器操作数
    un条件或修饰符寄存器操作数
    sH源寄存器位域(Rs.H 或 Rs.L)
    tH源寄存器 #2 位域(Rt.H 或 Rt.L)
    UN无符号操作数
    Rs无源寄存器读取
    P条件表达式
    PS条件含义(Pu 或 !Pu)
    DNDot-new 条件
    PTPredict taken
    sm仅Supervisor模式
    注:在某些情况下,指令特定字段用于编码指令属性,而不是表 10-1 中的字段描述的属性。
    
    • 1

    保留位
    一些指令包含当前不用于编码指令属性的保留位。 这些位应始终设置为 0,以确保与指令编码中的任何未来更改兼容。

    注意 保留位在指令编码表中显示为“-”字符。
    
    • 1

    10.2 子指令

    为了减少代码大小,Hexagon 处理器支持在单个 32 位容器中对某些指令对进行编码。 以这种方式编码的指令称为子指令,容器称为双工(第 10.3 节)。

    子指令仅限于某些常用指令:

    • 算术和逻辑运算
    • 注册转移
    • 加载和存储
    • 栈帧分配/释放
    • 子程序返回

    表 10-2 列出了子指令以及用于对它们进行双工编码的组标识符。

    子指令只能访问通用寄存器的子集(R0-R7、R16-R23)。 表 10-3 列出了子指令寄存器编码。

    注意 某些子指令隐式访问诸如 SP (R29) 之类的寄存器。
    
    • 1

    表 10-2 子指令
    在这里插入图片描述
    在这里插入图片描述

    表 10-3 子指令寄存器
    在这里插入图片描述

    10.3 双工

    双工被编码为 32 位指令,位 [15:14] 设置为 00。组成双工的子指令(第 10.2 节)被编码为双工中的 13 位字段。

    表 10-4 显示了双工的编码细节。

    一个指令包可以包含一个双工指令和最多两个其他(非双工)指令。 双工必须始终作为数据包中的最后一个字出现。

    双工中的子指令总是在 Slot 0 和 Slot 1 中执行。
    表 10-4 双工指令
    在这里插入图片描述

    表 10-5 列出了双工 ICLASS 字段值,它们指定了双工中每个子指令的组。
    表 10-5 双工 ICLASS 字段
    在这里插入图片描述

    双工具有以下分组约束:

    • 常量扩展器可以将指令的立即操作数的范围扩展到 32 位(第 10.9 节)。 可以使用常量扩展器扩展以下子指令:
    • Rx = add(Rx,#s7)
    • Rd = #u6
    
    • 1
    • 2

    请注意,双工只能包含一个常量扩展指令,并且它必须出现在插槽 1 的位置。

    • 如果一个双工包含两条具有相同子指令组的指令,则指令必须在双工中按如下顺序排列:当子指令被视为 13 位无符号整数值时,数值较小的值对应的指令必须在双工的插槽 1 位置进行编码。

    • 子指令必须符合适用于各个指令的任何槽分配分组规则,即使存在违反这些分配的双工模式。 此规则存在一个例外:

      • jumpr R31 必须出现在 Slot 0 位置

    10.4 指令类

    指令类(第 3.2 节)被编码在指令字的四个最高有效位中(31:28)。 这些位被称为指令的 ICLASS 字段。

    表 10-6 列出了指令类的编码值。 Slots 列指示哪些插槽可以接收指令类。

    表 10-6 指令类编码
    在这里插入图片描述

    10.5 指令包

    指令包使用指令字的两位编码 (15:14),称为指令字的 Parse 字段。 字段值具有以下定义:

    • “11”表示一条指令是包中的最后一条指令(即最高地址的指令字)。
    • “01”或“10”表示指令不是数据包中的最后一条指令。
    • “00”表示双工(第 10.3 节)

    如果出现任何四个连续指令的序列而其中没有一个包含“11”或“00”,则处理器将引发错误异常(非法操作码)。

    图 10-1 显示了 Parse 字段在指令字中的位置。
    在这里插入图片描述

    图 10-1 指令包编码

    以下示例显示如何使用 Parse 字段对指令包进行编码:

    { A ; B}
    	01 11 // Parse fields of instrs A,B
    { A ; B ; C}
    	01 01 11 // Parse fields of instrs A,B,C
    { A ; B ; C ; D}
    	01 01 01 11 // Parse fields of instrs A,B,C,D
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    【MySQL篇】第四篇——数据类型
    一文读懂java变量类型
    【CKA考试笔记】十三、k8s中的网络
    leetcode25 K个一组反转链表
    ZKP5.2 PLONK IOP
    nginx配置指南
    英语——分享篇——每日200词——1001-1200
    浏览器执行原理-V8引擎
    22.11.19打卡 CF1278B
    目标文件格式
  • 原文地址:https://blog.csdn.net/weixin_38498942/article/details/126035224