SPARC V8寄存器介绍

  • SPARC V8 概述
  • SPARC 寄存器
  • PSR
  • FSR
  • WIM
  • TBR
  • Y
  • PC,nPC
  • R寄存器
  • F寄存器
  • 寄存器推荐使用方法汇总
  • 输入(in)寄存器
  • 本地(local)寄存器
  • 输出(out)寄存器
  • 全局(global)寄存器
  • 状态(state)寄存器
  • 浮点(f)寄存器


SPARC V8 概述

SPARC (Scalable Processor Architecture)是一种精简指令集(RISC)指令集架构。根据性能、价格等不同需求,SPARC体系架构有不同的实现方式。SPARC 的设计目标是优化编译器、简化流水线的硬件实现。

SPARC 架构产品的优势在于执行速度和开发周期。SPARC 主要包括下面几个特性:

  • 32 位线性地址空间,理论上可寻址 4GB 空间;
  • 简洁的指令格式:均为 32 位宽,在内存中以 32 位对齐存储,诸多的指令只有三种存储格式,不同的存储格式其操作码和寄存器地址的存放位置固定;
  • 只有 load 和 store 命令可以访问内存;
  • 少数几种寻址模式:寄存器+寄存器、寄存器+立即数;
  • 三寄存器寻址:一般都是将两个寄存器中的内容作相应运算后将结果放到第三个寄存器中;
  • 一个大的窗口寄存器文件:在任一时刻,每个程序可以访问 8 个全局整数寄存器和一个由 24 个寄存器组成的寄存器窗口。所谓的窗口寄存器可以理解为存储着进程参数、局部变量和返回地址的存储区;
  • 独立的浮点寄存器文件:可由软件设置成单(32 位)、双(64 位)、四(128 位)三种不同精度;
  • 延迟控制转移特性:指示 CPU 延迟一条指令执行或跳过下一条指令,由控制转移指令的“annul”位决定执行还是跳过;
  • 快速的陷阱处理:陷阱的处理存放在向量表中,陷阱处理时将旋转到下一个新的寄存器窗口。

SPARC 寄存器

SPARC处理器中寄存器分为通用寄存器控制寄存器两类。IU中的通用寄存器被称为R寄存器,FPU中的通用寄存器被称为F寄存器。

寄存器

英文

功能

PSR

Processor State Register

处理器状态寄存器

FSR

Floating-Point State Register

浮点状态寄存器

WIM

Window Invalid Mask

窗口不可用屏蔽寄存器

TBR

Trap Base Register

陷阱基址寄存器

Y

Multiply/Divide Register

乘/除寄存器

PC, nPC

Program Counters

程序计数器

ASRs

AncillaryState Registers

辅助寄存器(依赖于具体实现)

DTQ

IU Deferred-Trap Queue

延迟陷阱队列(依赖于具体实现)

FQ

Floating-Point Deferred-Trap Queue

浮点延迟陷阱队列(依赖于具体实现)

R[0~31]

R Register

通用定点寄存器

F[0~31]

Fpu Register

通用浮点寄存器

PSR

32 位的处理器状态寄存器 PSR 的不同位域对应控制处理器和挂起状态信息,它可以被 SAVE、RESTORE、Ticc 和 RETT 指令修改,以及所有的修改条件码的指令。特权指令 RDPSR 和 WRPSR 可以直接对 PSR 进行读和写。PSR 的位域定义如:

sparc cpu架构 sparc v8架构_register


sparc cpu架构 sparc v8架构_sparc cpu架构_02

sparc cpu架构 sparc v8架构_SPARC_03

FSR

FSR 寄存器域包含 FPU 模式和状态信息,通过 STFSR 和 LDFSR 指令来进行读写。

sparc cpu架构 sparc v8架构_SPARC_04


sparc cpu架构 sparc v8架构_register_05


sparc cpu架构 sparc v8架构_寄存器_06

WIM

窗口不可用屏蔽寄存器WIM由管态软件控制,硬件使用它来判断SAVE、RESTORE或者RETT指令是否产生窗口下溢或者上溢陷阱。WIM格式如图 2-5所示,其中的每一位对应于一个窗口,如果其值是1,则表明该窗口是被屏蔽的,如果SAVE、RESTORE或RETT指令使CWP指向这样的窗口,将产生上溢或下溢陷阱。

sparc cpu架构 sparc v8架构_sparc cpu架构_07


sparc cpu架构 sparc v8架构_寄存器_08

TBR

陷阱基址寄存器TBR包括三个位域,它们一起组成陷阱发生时控制要转移到的地址,其位域定义如图 2-6所示。

sparc cpu架构 sparc v8架构_sparc cpu架构_09


sparc cpu架构 sparc v8架构_寄存器_10

Y

32位的Y寄存器包括整数乘法产生的双精度积的最高有效字,该乘积可以是来自整数乘法指令SMUL、SMULcc、UMUL和UMULcc指令,或者是使用整数乘步MULScc指令的例程。

Y寄存器还能保持整数除法指令SDIVcc,UDIV,UDIVcc的双精度被除数的最高有效字。该寄存器可以使用RDY和WRY指令进行读和写。

sparc cpu架构 sparc v8架构_寄存器_11

PC,nPC

32位PC寄存器包括当前IU执行的指令的地址,nPC存储下一条要被执行的指令的地址(假定没有陷阱发生)。对于延迟控制转移来讲,紧跟在转移指令后面的指令称为延迟指令。该延迟指令在控制转移到目标前执行(除非控制转移指令取消该指令)。当PC指向延迟指令,在延迟指令的执行中,nPC指向控制转移指令的目标。PC由CALL或者JMPL指令来读;PC和nPC由陷阱中的两个"local"寄存器来写。

sparc cpu架构 sparc v8架构_寄存器_12

R寄存器

IU 包括 40 到 520 个通用 32 位 r 寄存器,这些 r 寄存器被分成 8 个全局寄存器,一系列由16个寄存器组成的寄存器组,这16个寄存器又可分成8个输入寄存器和8个局部寄存器。

sparc cpu架构 sparc v8架构_寄存器_13


窗口 r 寄存器:任一时刻,一条指令可以访问 8 个全局寄存器和 24 个窗口寄存器,每个寄存器窗口由 8 个输入寄存器、8 个局部寄存器和共享相邻寄存器组的 8 个输入寄存器(作为本窗口的输出寄存器)组成。当前窗口由 CWP 指针指定。

窗口的重叠:窗口的重叠指定是当前的窗口可以访问 CWP+1 窗口的输出寄存器,作为本窗口的输入寄存器;当前窗口的输出寄存器可以作为 CWP-1 窗口的输入寄存器,每个窗口的 8 个 local 寄存器是唯一的。窗口按一个环顺序排列,也就是说最后一个窗口指针加 1指向 0 窗口。另外 save 命令将使 CWP 减 1,restore 命令将使 CWP 加 1。

sparc cpu架构 sparc v8架构_SPARC_14

特殊 r 寄存器:有四个特殊的 r 寄存的用法是固定的:

  • (1)如果 r[0]作为源操作数或是作为 store 的目的地址,那么 r[0]将被当作 0 来读写,如果 r[0]作为目的操作数,那么相应的操作将被忽略。
  • (2)call 指令将把自身的地址写进 r[15]寄存器。
  • (3)陷阱发生的时候:PC和 nPC 中的内容将会自动复制到 r[17]和 r[18]当中。

F寄存器

FPU 总共包含 32 个 32 位浮点 f 寄存器,标号从 f[0]到 f[31],f 寄存器可以通过浮点数操作指令访问。与 r 寄存器不同的是这 32 个 f 寄存器都可以访问。另外,一个 f 寄存器可以存放 1 个单精度浮点数,对于双精度和四精度的浮点数的存放,则分别需要两个和四个相邻的浮点寄存器。

寄存器推荐使用方法汇总

输入(in)寄存器

sparc cpu架构 sparc v8架构_SPARC_15

本地(local)寄存器

sparc cpu架构 sparc v8架构_寄存器_16

输出(out)寄存器

sparc cpu架构 sparc v8架构_SPARC_17

全局(global)寄存器

sparc cpu架构 sparc v8架构_浮点_18

状态(state)寄存器

sparc cpu架构 sparc v8架构_register_19

浮点(f)寄存器

sparc cpu架构 sparc v8架构_SPARC_20