本节主要介绍HVX编程的基础知识以及示例代码,主要是五部分:
Registers: 介绍常用的寄存器
Program Flow: 介绍程序流中常用到的循环、跳转、调用等指令
Software Stack: 介绍软件栈的结构,以及SP、FP、LR等寄存器的正确使用方法
Scalar/Vector Instructions: 介绍常用的标量和向量指令
Sample Code: 结合前三部分的内容实现的示例代码
Registers
General registers
我们先看General register(下面我们统称为通用寄存器),Hexagon 处理器一共有32个32-bit 的通用寄存器,R0-R31,其中R29、R30、R31都有别名,分别为:Stack Pointer(SP)、Frame Pointer(FP)、Link Register(LR)。这三个寄存器和函数栈及函数调用有关,SP与FP分别指向函数栈的栈顶和栈底,LR则保存了函数调用的返回地址,在介绍 Software Stack 时我们会详细分析。
R0-R5用于接受函数传参,如果函数的传参超过6个,则超出的参数通过栈来传递。
在汇编函数中使用通用寄存器时,我们需要注意的一点是”保存现场“,”保存现场“指的是:在使用某些寄存器之前,需要将这些寄存器的内容保存起来,使用完后,需要恢复这些寄存器的内容,确保函数返回后这些寄存器的内容不会改变。需要在代码中手动保存的寄存器我们称之为”Callee saved register“,无需手动保存的我们称之为”Caller saved Register“,如下所示,R16-R27以及SP、FP、LR在修改前需要手动保存:
Control registers
Control register(下面我们统称为控制寄存器)有很多个,作用各不相同,比如控制程序计数、硬件循环,完整的介绍如下所示:
我们通常只会用到Loop Registers、