Hexagon_V65_Programmers_Reference_Manual(15)
10.6 循环包
除了对数据包中的最后一条指令进行编码之外(第10.5节)用于对硬件环路中的最后一个数据包进行编码。Hexagon处理器支持两个硬件环路,标记为0和1(第7.2节)。这个这些循环中的最后一个数据包受以下限制:
- 硬件环路0中的最后一个数据包必须包含两个或多个指令字。
- 硬件环路1中的最后一个数据包必须包含三个或更多指令字。
如果循环中的最后一个数据包是用汇编语言表达的,并且小于所需的值对于字数,汇编程序会自动将一个或两个NOP指令添加到
编码数据包,使其包含所需的最小指令字数。分组的第一和第二指令字(即最低地址)编码该分组是否是硬件环路中的最后一个分组。
表10-7显示了如何使用解析字段对循环数据包进行编码.
以下示例显示了如何使用Parse字段对循环数据包进行编码:
{ A B}:endloop0
10 11 // Parse fields of instrs A,B
{ A B C}:endloop0
10 01 11 // Parse fields of instrs A,B,C
{ A B C D}:endloop0
10 01 01 11 // Parse fields of instrs A,B,C,D
{ A B C}:endloop1
01 10 11 // Parse fields of instrs A,B,C
{ A B C D}:endloop1
01 10 01 11 // Parse fields of instrs A,B,C,D
{ A B C}:endloop0:endloop1
10 10 11 // Parse fields of instrs A,B,C
{ A B C D}:endloop0:endloop1
10 10 01 11 // Parse fields of instrs A,B,C,D
10.7 即时值
为了节省编码空间,Hexagon处理器通常将即时值存储在指令字段的大小(位大小)小于指令中实际需要的值指令操作。
当指令对其一个直接操作数进行操作时,处理器自动将立即值扩展到操作所需的位大小:
- 符号立即值是符号扩展的
- 无符号立即数值是零扩展的
10.8 立即缩放
为了最小化指令字中用于存储某些立即数的位数值,Hexagon处理器将值存储为缩放即时值。按比例立即当立即数必须表示2的幂的整数倍时,使用值在特定范围内。
例如,考虑一个可能值如下的指令操作数:
-32, -28, -24, -20, -16, -12, -8, -4, 0, 4, 8, 12, 16, 20, 24, 28
编码全范围的整数-32…28通常需要6位。然而操作数存储为按比例缩放的立即数,可以先将其右移两位,只需其余四位存储在指令字中。当提取操作数时从指令字开始,处理器自动将值左移两位至重新创建原始操作数值。
注:上述示例中的缩放即时值以符号表示如#s4:2。有关更多信息,请参阅第1.4节。
缩放立即值通常用于编码地址偏移,适用于大小不同的数据类型。例如,表10-8显示了在具有偏移寻址模式的即时值存储为11位缩放即时值。这允许偏移跨越相同范围的数据元素,而不考虑数据类型。
10.9 恒定扩展器
为了支持在多条指令中使用32位操作数,Hexagon处理器定义一个指令字,该指令字的存在仅用于扩展立即数或数的位范围包含在数据包中相邻指令中的地址操作数。这些指示单词称为常量扩展器。
例如,绝对寻址模式将32位常量值指定为有效地址。使用此寻址模式的指令编码在单个数据包中包含普通指令字和具有恒定扩展器的第二字这将指令的正常常量操作数范围增加到32位。
请注意,常量扩展操作数可以对符号进行编码。
常量扩展器编码为32位指令,4位ICLASS字段设置为0并且将2位解析字段设置为其通常值(第10.5节)。存储器中剩余的26位指令字存储在操作数前的数据位,操作数小到6位以创建完整的32位值。
表10-9显示了编码细节。
在数据包中,必须将常量扩展器放置在数据包的正前方它扩展的指令:就内存地址而言,扩展字必须位于地址(<instr_address>-4)。常量扩展器有效地充当指令的前缀:它不会在中执行插槽,也不消耗任何插槽资源。所有数据包必须包含四个或更少常量扩展器占用一个字。
如果要扩展的指令操作数长于6位,则基本指令必须编码为零。常量扩展器中的值始终提供高位26位。
表10-10列出了使用常量扩展器的说明。
表中的Regclass字段列出了位[27:24]在表中必须设置的值指令字,用于将指令标识为可能包含常量扩展器的指令。
注意:在基指令编码两个常量操作数的情况下扩展立即数是表中指定的。常量扩展器在反汇编列表中显示为Hexagon指令名称为Imtext。
注意:如果一个常量扩展器被编码在一个数据包中,则该指令不存在如果接受常量扩展器,则执行结果未定义。汇编程序通常确保只生成有效的常量扩展器。
在加载/存储中编码32位地址操作数在加载或存储指令中编码32位绝对地址有两种方法:
1) 对于无条件加载/存储,使用GP相对加载/存储指令。这个
汇编程序对绝对32位地址进行如下编码:
-
高26位在恒定扩展器中编码
-
较低的6位编码在GP相对序列中包含的6个操作数位中指示
在这种情况下,编码的32位值必须是普通地址,并且存储在
忽略GP寄存器。
注意:当使用GP相对加载/存储显式指定常量扩展器时,处理器忽略GP中的值,直接创建有效地址从32位常量值。
2) 对于其基址仅由6编码的条件加载/存储指令-位立即数操作数,必须显式指定常量扩展器;否则执行结果未定义。汇编程序确保这些指令始终包括:恒定扩展器。
这种情况也适用于使用绝对设置寻址模式的指令,或绝对加寄存器偏移寻址模式。
32位立即操作数的编码某些指令的立即数操作数使用缩放立即数(第10.8节)来增加它们的可寻址范围。当使用常量扩展器时,缩放的立即数为不由处理器缩放。相反,汇编程序必须对完整的32位无标度数据进行编码价值如下:
-
高26位在恒定扩展器中编码
-
低6位在基本指令中以最低有效位编码立即操作数字段的位置。
-
基本指令中的任何重叠位都被编码为零。
编码32位跳转/调用目标地址当跳转/调用具有常量扩展器时,生成的目标地址强制为32位对齐(即地址中的位1:0由硬件清除)。由此产生的跳转/呼叫操作不会导致对齐冲突
10.10 新值操作数
包含新值寄存器操作数的指令在其编码中指定数据包中的指令将其目标寄存器作为新值寄存器访问。
新值消费者包括一个名为 Nt 的 3 位指令字段,它指定此信息。
- Nt[0] 是保留的,应始终编码为零。 非零值产生未定义的结果。
- Nt[2:1] 编码从生产者到消费者的距离(在指令中),如下:
Nt[2:1] = 00 // reserved
Nt[2:1] = 01 // producer is +1 instruction ahead of consumer
Nt[2:1] = 10 // producer is +2 instructions ahead of consumer
Nt[2:1] = 11 // producer is +3 instructions ahead of consumer
“提前”在这里定义为在比当前地址更低的内存地址编码的指令消费指令,不包括空插槽或常量扩展器。例如以下生产者/消费者关系将用Nt[2:1]设置为01进行编码
<producer instruction word>
<consumer constant extender word>
<consumer instruction word>
注意:具有64位寄存器对目标的指令不能产生新值。由于结果未定义,汇编程序将此情况标记为错误。
10.11 指令映射
一些Hexagon处理器指令由汇编程序编码为其他指令的变体说明书这是为功能等同于其他操作的操作完成的但是由于它们的编程,仍然被定义为单独的指令实用程序作为常见操作。
表10-11列出了一些映射到其他指令的指令。
表10-11指令映射