Hexagon_V65_Programmers_Reference_Manual(14)

281 篇文章 30 订阅


)

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 中的字段描述的属性。

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

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

10.2 子指令

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

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

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

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

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

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

表 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 的位置。

  • 如果一个双工包含两条具有相同子指令组的指令,则指令必须在双工中按如下顺序排列:当子指令被视为 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值