ZHCUAU3J January 2018 – March 2024
严格的惯例将特定寄存器与 C/C++ 环境中的特定运算相关联。
寄存器惯例规定了编译器如何使用寄存器以及如何在函数调用之间保留值。
表 6-2 中的寄存器可供编译器分配寄存器变量和临时表达式结果之用。如果编译器无法分配所需类型的寄存器,则会发生溢出。溢出是将寄存器的内容移动到存储器以释放寄存器用于其他目的的过程。
C7000 有两个数据路径:一个带有 64 位“标量”寄存器的 A 端数据路径和一个带有 512 位“矢量”寄存器的 B 端数据路径。通过从名称中删除“V”,任何 B 端矢量寄存器的低 64 位也可以作为标量寄存器来访问。标量寄存器不限于存储标量值;如果合适,矢量可以存储在标量寄存器中。
D15 是栈指针 (SP)。栈指针必须始终在 2 字(8 字节)边界上保持对齐。SP 指向低于(小于)当前分配栈的第一个对齐地址。
RP、D15 (SP)、A8-A15、B14/VB14 和 B15/VB15 是被调用者保存 寄存器。也就是说,需要由被调用的函数保留上述寄存器,确保其在从函数返回时具有与调用时相同的值。
所有其他寄存器都是调用者保存 寄存器;也就是说,它们不会在调用中保留,因此如果调用后需要它们的值,调用者负责保存和恢复它们的内容。
寄存器 | 文件 | 由被调用者保留? | 在调用惯例中的作用 |
---|---|---|---|
A0 | A 端标量 | 否 | |
A1 | 否 | 指向按引用返回值的指针 | |
A2 | 否 | ||
A3 | 否 | ||
A4 | 否 | 第 1 个标量参数 | |
A5 | 否 | 第 2 个标量参数 | |
A6 | 否 | 第 3 个标量参数 | |
A7 | 否 | 第 4 个标量参数 | |
A8 | 是 | 第 5 个标量参数 | |
A9 | 是 | 第 6 个标量参数 | |
A10 | 是 | 第 7 个标量参数 | |
A11 | 是 | 第 8 个标量参数 | |
A12 | 是 | 第 9 个标量参数 | |
A13 | 是 | ||
A14 | 是 | ||
A15 | 是 | ||
AL0-AL7 | A 端局部 L | 否 | |
AM0-AM7 | A 端局部 M | 否 | |
VB0 | B 端矢量 | 否 | 第 1 个矢量参数 |
VB1 | 否 | 第 2 个矢量参数 | |
VB2 | 否 | 第 3 个矢量参数 | |
VB3 | 否 | 第 4 个矢量参数 | |
VB4 | 否 | 第 5 个矢量参数 | |
VB5 | 否 | 第 6 个矢量参数 | |
VB6 | 否 | 第 7 个矢量参数 | |
VB7 | 否 | 第 8 个矢量参数 | |
VB8 | 否 | 第 9 个矢量参数 | |
VB9 | 否 | 第 10 个矢量参数 | |
VB10 | 否 | 第 11 个矢量参数 | |
VB11 | 否 | 第 12 个矢量参数 | |
VB12 | 否 | 第 13 个矢量参数 | |
VB13 | 否 | 第 14 个矢量参数 | |
VB14 | 是 | 第 15 个矢量参数 | |
VB15 | 是 | 第 16 个矢量参数 | |
VBL0-VBL7 | B 端局部 L | 否 | |
VBM-VBM7 | B 端局部 M | 否 | |
D0-D14 | D 单元局部 | 否 | |
D15 | 是 | 栈指针 | |
RP | 控制 | 是 | 返回指针 |
P0 | 矢量谓词 | 否 | 第 1 个矢量谓词参数 |
P1 | 否 | 第 2 个矢量谓词参数 | |
P2 | 否 | 第 3 个矢量谓词参数 | |
P3 | 否 | 第 4 个矢量谓词参数 | |
P4 | 否 | 第 5 个矢量谓词参数 | |
P5 | 否 | 第 6 个矢量谓词参数 | |
P6 | 否 | 第 7 个矢量谓词参数 | |
P7 | 否 | 第 8 个矢量谓词参数 | |
CUCR0-CUCR3 | C 单元控制寄存器 | 否 |
编译器不会保存或恢复所有其他控制寄存器。
编译器假设,表 6-2 中未列出的控制寄存器会影响具有默认值的编译代码。