SPARC 体系结构之 GPR 和 ABI

SPARC 体系结构之 GPR 和 ABI

当前版本: 1.0
完成日期: 2009-03-23
作者: Jack Tan
Email: jiankemeng@gmail.com
版权声明: 转载请注明出处,商业用途请联系作者

 

A. 以下取 SPARC V9(兼顾 UltraSPARC 2007)之精要

0. SPARC V9 为 64 位,兼容 32 位;SPARC V8 也是 64 位兼容 32 位;而广泛应用于航天器上的 SPARC V7 为 32 位,很精简,天上飞不是闹着玩的,简单、可靠才是王道 :)

1. SPARC 的 GPR (General Purpose Register) 较特殊,其引入寄存器窗口 (Register Windows) 的概念,每个窗口的 GPR 数为 24(可以有 3 ~ 32 个窗口,任一时刻只有一个窗口可见),再加上一组(8 个)全局 GPR (Global GPR,有多组,任一时刻仅一组可见,V9 有 2 组,UltraSPARC 则有 2 ~ 15 组),则任一时刻可见的 GPR 数为 32

可以看到 SPARC 的 GPR 有很多,引入的目的意在提高过程调用的效率。

一般来讲,进入一个子函数首先需要借助栈来保存一些寄存器,而后返回时需要恢复之,参数的保存和恢复需要很多访存操作,这个会增加很多延迟。若 CPU 内有很多组冗余的寄存器,则子函数调用时,直接将当前窗口指针指向下一个,子函数就直接使用新的一组寄存器,就无需一堆的访存指令了。这个思想很好,进入实用还得有些细节问题要考虑:

I. 子函数和父函数间参数和返回值怎么传递?
II. 由于物理的限制,可用寄存器组不可能无限大,当调用链达到一定的深度后,寄存器组不够用怎么办?

这个就看下回分解了 :)

2. 任一时刻可见之 32 个 GPR 编号

24 个窗口寄存器编号为 r8 ~ r31,8 个一组。

r8 ~ r15 又名为 o0 ~ o7,为输出组 (out);
r16 ~ r23 又名为 l0 ~ l7,为本地组 (Local);
r24 ~ r31 又名为 i0 ~ i7,为输入组 (In)。

8 个全局寄存器编号为 r0 ~ r7 又名为 g0 ~ g7

B. SPARC ABI

SPARC 的 ABI 没那么多版本,这个是程序员的福音,psABI:

r24 ~ r29 用作前 6 个输入参数,同时 r24 (i0) 又用作返回值
r30 用作帧指针 fp
r31 置 (函数返回地址 – 8)

r8 ~ r13 用作 6 个输出参数,同时 r8 (o0) 又作第一个输出参数
r14 用作栈指针 sp
r15 置 CALL 指令的地址

 

 

要注意的是与 MIPS 一样 r0 始终为 0

C. Reference

[1] The SPARC Architecture Manual Version 9
[2] UltraSPARC Architecture 2007, Draft D0.9.1, 01 Aug 2007
[3] SYSTEM V APPLICATION BINARY INTERFACE SPARC Processor Supplement Third Edition

 

 

发表评论

6 + 2 = ?