ZHCADC4A September 2011 – March 2014
为了鼓励使用可压缩指令,某些 C64x+ 函数的寄存器保存/恢复代码略有不同。
通常,编译器使用一个 SP 递减分配整个帧,然后使用相对于 SP 的写入保存被调用者保存的寄存器。
STW B14, *SP--[12]
STDW A15:A14, *SP[5]
STDW A13:A12, *SP[4]
STDW A11:A10, *SP[3]
STDW B13:B12, *SP[2]
STDW B11:B10, *SP[1]
在紧凑帧 模式下,编译器改成为每个寄存器对生成一系列 SP 自动递减存储。
STW B14, *SP--[2]
STDW A15:A14, *SP--
STDW A13:A12, *SP--
STDW A11:A10, *SP--
STDW B13:B12, *SP--
STDW B11:B10, *SP--
对于这种情况,堆栈布局是相同的。但是,对于不同的已保存的寄存器子集,堆栈布局可能不同。例如,假设我们需要保存 A10、A11、B10、B11 和 B3,我们选择使用紧凑帧布局以减小代码量。传统布局将最有效地利用堆栈空间:
STW A11, *SP--[6]
STW A10, *+SP[5]
STW B3, *+SP[4]
STW B11, *+SP[3]
STW B10, *+SP[2]
但是,为了使用更多可压缩 SP 递减指令,紧凑帧布局将在寄存器保存区域中留下多个空洞。由于每次压入必须将 SP 递减 8(以确保中断安全),编译器会尝试将寄存器对的成员压在一起;如果无法做到,则必须将单个寄存器压入一个双字中,因而在保存区域中形成空洞。
STW A11, *SP--[2]
STW A10, *SP--[2]
STDW B11:B10, *SP--
STW B3, *SP--[2]