Hexagon处理器的指令编码

来源:互联网 发布:419是什么意思网络用语 编辑:程序博客网 时间:2024/05/22 18:24

Hexagon处理器的指令编码

概述

本文将讲解Hexagon处理器指令以及指令包的二进制编码,它包含如下几个部分

l  指令

l  子指令

l  Duplex指令

l  指令类

l  指令包

l  循环包

l  立即操作数

l  扩展立即操作数

l  常数补充

l  新值操作数

l  指令映射

指令

所有的Hexagon处理器指令都是基于32位指令字来编码的。指令字格式根据指令的类型各有不同。

 

指令字中包含了两种位域的方式

 

l  通用域在每个处理器指令中都存在,并且在所有指令中都拥有相同的定义。

l  特定指令域只会在某些指令中出现,或者根据指令集的定义不同而各有差异。

 

指令的位域信息如下图所示:


表一 指令的位域信息

子指令

为了减少编码大小,Hexagon处理器支持在单一的32位容器中进行指令对的编码。这样的指令编码被称作子指令。而容器被称作duplexes

 

子指令用于如下几种常用的指令:

 

l  算数以及逻辑操作

l  寄存器的分配与传送

l  Load与Store指令

l  栈帧的分配与释放

l  子路径的返回操作

 

图二列出了子指令与群标识符



表二 子指令与群标识符

指令的地址信息如下表所示:


表三 指令的地址信息

复式结构指令

复式结构通过将[15:14]位设置为00来编码为32位指令。被用于构成duplex的子指令在duplex中被编码为13位域。

 

下图显示了duplex的编码细节


表四 

一个指令包可以包含一个duplex以及超过两个的非duplex指令。Duplex只能包含在包的最后一个字中。Duplex指令中的执行流程总是从Slot0-Slot1


Duplex拥有如下的群限制:

表四 Duplex的群限制:

 

常数扩展使得指令的立即数操作扩展至32位。如下的子指令可以通过常数扩展来使用

Rx = add(Rx,#s7)Rd = #u6

如果duplex包含两个相同子指令群的指令,那么在duplex中,指令比如按照如下的方式来安排:如果子指令以13位的无符号数来操作,那么相应的更小的数字应该被放置在duplex的Slot1中。

 

子指令必须遵循任意slot的安排群规则,从而适应于单指令,即使duplex模式的存在违反了这些安排。对这些规则,有一个特例:

Jumpr R31必须出现在Slot0的位置上。

指令类

指令类在指令字中四个最重要的位编码(31:28)。这些位被参考为指令的ICLASS域。表五列出了相应指令类的编码值。Slot一列表示slot可以接受的指令类:


表五 指令类的编码值

指令包

指令包通过使用指令字中的两个位[15:14]来进行编码,它们对应着指令字中的Parse域。这些域值有如下的定义

 

11:意味着该指令是包中的最后一个指令(在指令字的最高位地址)

01或10:意味着该指令不是包中的最后一个指令

00:意味该指令是一个duplex指令

 

如果四个连续的指令序列都没有包括11,那么处理器将会抛出一个错误异常。下图给出了指令字中Parse域的定位:


图一 Parse域的定位

如下的案例显示了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

循环包

除了编码包中的最后一个指令外,指令字中的Parse域还被用于编码硬件循环中的最后一个包。

 

Hexagon处理器支持两种硬件循环:标签0与1.这些循环中的最后一个包受如下的规则限制:

 

硬件循环0中的最后一个包必须包含两个或者更多的指令

硬件循环1中的最后一个包必须包含三个或者更多的指令

 

如果循环中最后一个包使用汇编语言来表述,那么汇编器将自动添加一个或两个NOP指令从而扩充编码包,无论该包是否是最后一个循环。

 

下表显示了用于编码循环包的Parse域:


表六 编码循环包的Parse域

如下的代码案例显示了Parse域是如何用来编码循环包的:

{ A B}:endloop010 11 // Parse fields of instrs A,B{ A B C}:endloop010 01 11 // Parse fields of instrs A,B,C{ A B C D}:endloop010 01 01 11 // Parse fields of instrs A,B,C,D{ A B C}:endloop101 10 11 // Parse fields of instrs A,B,C{ A B C D}:endloop101 10 01 11 // Parse fields of instrs A,B,C,D{ A B C}:endloop0:endloop110 10 11 // Parse fields of instrs A,B,C{ A B C D}:endloop0:endloop110 10 01 11 // Parse fields of instrs A,B,

0 0