ARM AArch64 应用程序级程序员模型中文翻译
Chapter B1 AArch64应用程序级程序员模型(The AArch64 Application Level Programmer’s Model)
B1.1 关于应用程序级模型(About the application-level model)
Chapter B1
AArch64 应用程序级程序员模型(The AArch64 Application Level Programmers’ Model)
本章描述了 AArch64 应用程序级程序员模型。它包含以下几节:
- 关于应用程序级程序员模型。
- AArch64 执行状态下的寄存器。
- 进程状态 PSTATE。
- 可伸缩向量扩展与可伸缩矩阵扩展(SVE 和 SME)。
- 软件控制特性与 EL0。
B1.1 关于应用程序级程序员模型(About the Application level programmers’ model)
本章包含应用程序开发所需的程序员模型信息。
本章所提供的信息与为操作系统或更高级系统软件下支持应用程序执行所需的系统信息是有所区别的。然而,仍需要对系统信息有一定了解,才能将应用程序级程序员模型置于正确的上下文中。
根据具体实现的选择,该架构支持多个级别的执行特权,这些特权通过从 EL0 到 EL3 编号递增的不同异常级别(Exception levels)来指示。EL0 对应最低特权级别,通常被描述为非特权(unprivileged)级别。应用程序级程序员模型就是针对在 EL0 执行的软件的程序员模型。更多信息,请参见”异常级别(Exception levels)”一节。
系统软件决定软件运行所处的异常级别,从而也决定了其特权级别。当操作系统同时支持 EL1 和 EL0 上的执行时,应用程序通常以非特权身份在 EL0 运行。这样做:
- 允许操作系统以独占或共享的方式向应用程序分配系统资源。
- 提供了一定程度的保护,使其免受其他进程的影响,从而帮助保护操作系统免受故障软件的影响。
本章将指出在哪些地方需要一定的系统级理解,并在相关之处给出系统级描述的参考。
在任何高于 EL0 的异常级别上执行通常被称为特权执行(privileged execution)。
有关该架构系统级视图的更多信息,请参见《AArch64 系统级程序员模型(The AArch64 System Level Programmers’ Model)》。
译者注:
- PE(Processing Element,处理单元):在 ARM 架构中,PE 指代一个执行指令的硬件线程或核心,类似于”处理器核心”的概念。
- Exception level(异常级别):ARMv8-A 架构定义了四个异常级别(EL0~EL3),数字越大特权越高。EL0 用于应用程序(非特权),EL1 用于操作系统内核,EL2 用于虚拟机监视器(Hypervisor),EL3 用于安全监视器(Secure Monitor)。
- 非特权执行(Unprivileged execution):在 EL0 执行的代码无法访问系统级寄存器,也无法执行某些特权指令,任何试图越权操作会导致异常陷入更高的异常级别,由系统软件处理。
- PSTATE:即 Process State,是 AArch64 中保存处理器当前状态信息的抽象概念,包括条件标志位、当前异常级别、执行状态(AArch64/AArch32)等。
B1.2 AArch64执行状态下的寄存器(Registers in AArch64 Execution state)
以下寄存器在使用AArch64时在EL0层级可见:
| 寄存器 | 描述 |
|---|---|
| R0-R30 | 31个通用寄存器,R0至R30。每个寄存器可按以下方式访问: |
| • 64位通用寄存器,命名为X0至X30。 | |
| • 32位通用寄存器,命名为W0至W30。 |

Figure B1-1 通用寄存器命名
X30通用寄存器用作过程调用链接寄存器(procedure call link register)。
译者注: 链接寄存器(Link Register, LR)用于存储子程序调用的返回地址。在AArch64中,X30就是LR。当使用
BL(Branch with Link)指令调用子程序时,返回地址自动保存在X30中。
| 寄存器 | 描述 |
|---|---|
| SP | 一个64位专用的栈指针寄存器。栈指针的最低32位可以使用寄存器名WSP访问。 |
| 在指令中将SP作为操作数使用时,表示使用当前的栈指针。 | |
| 注意: 栈指针对齐到16字节边界的行为可在EL1配置。更多信息,请参见_Arm 64位架构的过程调用标准(Procedure Call Standard for the Arm 64-bit Architecture)_。 |
| 寄存器 | 描述 |
|---|---|
| PC | 一个64位的程序计数器,保存当前指令的地址。 |
| 软件不能直接写入PC。PC只能在分支、异常入口或异常返回时更新。 | |
| 注意: 尝试执行一个非字对齐(word-aligned)的A64指令会产生PC对齐错误,参见_PC对齐检查(PC alignment checking)_。 |
译者注: “字对齐”(word-aligned)在此处指指令地址必须按4字节(一个字)对齐。由于A64指令长度固定为4字节,指令地址必须是4的倍数。
| 寄存器 | 描述 |
|---|---|
| V0-V31 | 32个SIMD&FP寄存器,V0至V31。每个寄存器可按以下方式访问: |
| • 128位寄存器,命名为Q0至Q31。 | |
| • 64位寄存器,命名为D0至D31。 | |
| • 32位寄存器,命名为S0至S31。 | |
| • 16位寄存器,命名为H0至H31。 | |
| • 8位寄存器,命名为B0至B31。 | |
| • 128位元素向量,参见Figure A1-1。 | |
| • 64位元素向量,参见Figure A1-1。 | |
| 当某个寄存器名描述的比特位数未能占据整个SIMD&FP寄存器时,它指的是最低有效位(least significant bits)。参见Figure B1-2。 | |
| 有关数据类型和向量格式的更多信息,请参见_支持的数据类型(Supported data types)_。 |

Figure B1-2 SIMD和浮点寄存器命名
译者注: SIMD&FP寄存器的命名层次如下:
- B(Byte)= 8位,H(Halfword)= 16位,S(Single)= 32位,D(Double)= 64位,Q(Quad)= 128位。
例如,V0寄存器的低8位可通过B0访问,低16位可通过H0访问,以此类推。这种设计允许同一寄存器以不同精度参与整数和浮点运算。
| 寄存器 | 描述 |
|---|---|
| FPCR, FPSR | FPCR是浮点控制寄存器(Floating-point Control Register)。FPSR是浮点状态寄存器(Floating-point Status Register)。 |
| Z0-Z31 | 32个SVE可伸缩向量寄存器,Z0至Z31,长度相等。每个寄存器可按以下方式访问: |
| • 可配置长度的元素向量。长度VL是2的幂次,从最小128位到实现定义(IMPLEMENTATION DEFINED)的最大值(不超过2048位)。参见Figure B1-3、Figure A1-5以及_可配置的SVE向量长度(Configurable SVE vector lengths)_。 | |
| • 一个SIMD&FP寄存器,如V0-V31所述。每个Zn寄存器的Bits[127:0]保存着对应编号的V0-V31 SIMD&FP寄存器,如Figure B1-3所示: |

Figure B1-3 SVE可伸缩向量寄存器命名
另请参见:
- 最大实现的SVE向量长度(Maximum implemented SVE vector lengths)。
- 可配置的SVE向量长度(Configurable SVE vector lengths)。
- SVE可伸缩向量寄存器的处理(Treatment of SVE scalable vector registers)。
- SVE对标量值的寄存器写入(SVE writes of scalar values to registers)。
| 寄存器 | 描述 |
|---|---|
| P0-P15 | 16个SVE谓词寄存器,命名为P0至P15。每个SVE谓词寄存器为SVE标量向量寄存器的每个字节保存1位。 |
| 注意: 最大实现的SVE谓词长度等于最大实现的SVE向量长度除以8。请参见_最大实现的SVE向量长度(Maximum implemented SVE vector lengths)_。 | |
| 另请参见_向量谓词(Vector predication)_。 |
译者注: SVE(Scalable Vector Extension)是ARM的可伸缩向量扩展。谓词寄存器(Predicate Register)是SVE的核心特性之一,用于实现向量长度无关(Vector Length Agnostic, VLA)的编程模型。每个谓词寄存器的每一位对应向量寄存器中一个字节的有效性标记,用于条件化执行向量操作。
| 寄存器 | 描述 |
|---|---|
| FFR | 专用的SVE首错误寄存器(First Fault Register),其大小和格式与SVE谓词寄存器P0-P15相同。参见_FFR(First Fault Register)_。 |
| ZA | 能够保存二维字节数组的架构状态。参见_ZA存储(ZA storage)_。 |
| ZT0 | 一个512位的SME2查找表寄存器。参见_SME2 ZT0寄存器_。 |
另请参见:
- 系统寄存器(System registers)。
- AArch64状态下寄存器的伪代码描述(Pseudocode description of registers in AArch64 state)。
- 用于指令处理和异常处理的寄存器(Registers for instruction processing and exception handling)。
B1.2.1 FFR,首错误寄存器(First Fault Register)
RTRLWH SVE有一个专用的首错误寄存器,命名为FFR。
IXPLQW FFR捕获一系列SVE首错误(First-fault)和非错误(Non-fault)向量加载指令的累积错误状态。
RCPQQN FFR与谓词寄存器具有相同的大小和格式。
译者注: “首错误”(First Fault)机制是SVE的一项特性,允许向量加载操作在遇到第一个故障元素时停止,并记录哪些元素已成功加载、哪些未加载。这对处理稀疏数据或边界检查等场景非常有用。
IPBWPM FFR是一个特殊用途寄存器(Special-purpose register)。
RCGHCK 通过使用SETFFR指令,FFR中在当前异常级别(Exception level)可访问的所有位均被初始化为1。
RWZJVT 当SVE首错误或非错误向量加载的某个活动元素(Active element)对应的访问被抑制或产生错误时,FFR中的位会被间接设置为0。
RBZLJG 向量加载指令永远不会将FFR中的位设置为1。
IXLZQY 在一条SETFFR指令之后、没有任何WRFFR指令介入的情况下,执行一条或多条SVE首错误或非错误加载指令后,FFR包含一个单调谓词值(monotonic predicate value)。
DSRDGX 单调谓词值是指,从谓词元素0开始,由零个或多个TRUE元素组成,随后仅跟随着零个或多个FALSE元素的值。
ITQMTV FFR中的TRUE元素指示可能包含从内存加载的有效数据的最短连续元素序列。
RGHFRQ 能直接读取FFR的指令仅有:
- RDFFR。
- RDFFRS。
RLHBRN 能直接写入FFR的指令仅有:
- WRFFR。
- SETFFR。
IDTHXN WRFFR指令要求其源谓词包含一个单调谓词值。如果源不是一个单调谓词值,则FFR中的结果值为UNKNOWN(未知)。
RXXMMP 所有对FFR的直接和间接读写都按照程序顺序执行,相对于其他指令无需显式同步。
B1.2.2 系统寄存器(System registers)
系统寄存器为执行控制、状态和一般系统配置提供支持。大多数系统寄存器在EL0层级不可访问。
但是,部分系统寄存器可以配置为允许在EL0执行的软件访问。从EL0对没有访问权限的系统寄存器的任何访问都将导致指令被捕获(trap)。以下寄存器可以从EL0访问:
调试寄存器(Debug registers)
调试通信通道(Debug Communications Channel)由MDCCSR_EL0、DBGDTR_EL0、DBGDTRRX_EL0、DBGDTRTX_EL0、DLR_EL0和DSPSR_EL0寄存器支持。
译者注: 这些是用于调试目的的寄存器,支持通过外部调试器与目标处理器通信。
通用系统控制寄存器(General system control registers)
- CTR_EL0和DCZID_EL0寄存器提供EL0缓存管理支持的实现参数。
- SCXTNUM_EL0寄存器提供一个可用于区分不同上下文编号的值。
- POR_EL0权限覆盖(Permission Overlay)寄存器确定EL1&0和EL2&0转换机制的未特权阶段1覆盖权限。
- TPIDR_EL0、TPIDR2_EL0和TPIDRRO_EL0寄存器提供软件可存储线程标识信息的位置。
译者注: TPIDR(Thread Pointer ID Register)寄存器通常用于存储线程本地存储(TLS)的指针,操作系统可以使用这些寄存器来管理每线程的数据。
通用定时器寄存器(Generic timer registers)
- 通过CNTFRQ_EL0读取系统计数器的有效频率。
- 物理和虚拟定时器计数寄存器:CNTPCT_EL0、CNTVCT_EL0、CNTPCTSS_EL0和CNTVCTSS_EL0。
- 物理向上计数比较、向下计数值和定时器控制寄存器:CNTP_CVAL_EL0、CNTP_TVAL_EL0和CNTP_CTL_EL0。
- 虚拟向上计数比较、向下计数值和定时器控制寄存器:CNTV_CVAL_EL0、CNTV_TVAL_EL0和CNTV_CTL_EL0。
译者注: Arm架构提供通用定时器(Generic Timer),包含物理定时器和虚拟定时器。物理定时器直接基于系统计数器;虚拟定时器则在虚拟机场景中使用,自动计入虚拟机管理程序的偏移量。
性能监视器寄存器(Performance Monitors registers)
性能监视器扩展(Performance Monitors Extension)提供计数器和配置寄存器。在EL1或更高异常级别执行的软件可以将其中一些寄存器配置为在EL0可访问。
更多详情,请参见_性能监视器扩展(The Performance Monitors Extension)_。
活动监视器寄存器(Activity Monitors registers)
活动监视器扩展(Activity Monitors Extension)提供计数器和配置寄存器。在EL1或更高异常级别执行的软件可以将这些寄存器配置为在EL0可访问。
更多详情,请参见_活动监视器扩展(The Activity Monitors Extension)_。
B1.2.3 AArch64状态下寄存器的伪代码描述(Pseudocode description of registers in AArch64 state)
AArch64伪代码使用getter和setter访问器函数来读取和写入在EL0可见的寄存器文件:
- Setter(赋值)访问器,例如
X{width}(num) = result,用于寄存器写入。 - Getter(非赋值)访问器,
operand = X{width}(num),用于寄存器读取。 num参数指定要在指定寄存器文件内访问的寄存器编号,width指定寄存器访问的位宽。- 对于通用寄存器访问器
X{width}(),寄存器编号31访问零寄存器ZR(zero register),读取返回零,写入被忽略。 - 对于其他寄存器访问器,例如SIMD&FP的
V{width}()访问器,对寄存器编号没有特殊解释。
译者注: 在AArch64中,通用寄存器的编号31有一个特殊含义:当用作通用操作的源/目标时(如ADD X0, XZR, X1),它代表零寄存器XZR/ZR(始终读取为0,写入被忽略);但当用作栈指针操作时(如ADD SP, SP, #16),它代表栈指针SP。伪代码中的
X{width}()访问器对编号31的处理反映了零寄存器的行为。
其他特殊的AArch64访问器包括:
- SP{width}() 访问器没有参数,用于读取或写入当前异常级别下当前选中的64位栈指针。
- PC64{width}() 访问器没有参数列表,用于读取64位程序计数器。
- Vpart{width}() 访问器用于对Advanced SIMD向量寄存器执行部分读取或写入,使用额外的
part参数选择访问向量寄存器的哪一半。 - Z{width}()、**V{width}()和Vpart{width}()**访问器读取和写入相同的底层向量寄存器文件。
其他寄存器访问器根据其他架构特性的需要定义。请参见_A-profile架构伪代码(A-profile Architecture Pseudocode)_,sections/aarch64/functions/registers/部分。
B1.3 处理状态(Process state, PSTATE)
B1.3 处理状态(Process state, PSTATE)
处理状态(Process state,简称PSTATE)是进程状态信息的一种抽象。所有指令集都提供了操作PSTATE各元素的指令。
关于PSTATE的系统级视图,请参见《AArch64系统级程序员模型》中的”处理状态(Process state, PSTATE)”部分。
以下PSTATE信息在EL0下可访问:
条件标志位(Condition flags)
设置标志位的指令会设置这些标志位。具体如下:
N 负数条件标志位(Negative Condition flag)。如果将指令的结果视为二进制补码有符号整数,则处理单元(PE)将其设置为:
- 如果结果为负数,则设置为1。
- 如果结果为零或正数,则设置为0。
Z 零条件标志位(Zero Condition flag)。设置为:
- 如果指令的结果为零,则设置为1。
- 否则设置为0。
- 结果为零通常表示比较结果相等。
C 进位条件标志位(Carry Condition flag)。设置为:
- 如果指令产生了进位条件,例如加法运算导致的无符号溢出,则设置为1。
- 否则设置为0。
V 溢出条件标志位(Overflow Condition flag)。设置为:
- 如果指令产生了溢出条件,例如加法运算导致的有符号溢出,则设置为1。
- 否则设置为0。
条件指令会测试N、Z、C和V条件标志位,并将它们与指令的条件码(Condition code)相结合,以确定该指令是否必须执行。通过这种方式,指令的执行取决于先前操作的结果。有关条件执行的更多信息,请参见”条件标志位及相关指令(Condition flags and related instructions)”。
译者注: 条件执行是ARM架构的重要特性。许多ARM指令可以带条件后缀执行,例如
ADDEQ表示”如果相等(Z=1)才执行加法”。条件标志位由前一条指令(如比较指令CMP或带标志位更新的算术指令)设置,后续的条件指令根据这些标志位决定是否执行。这可以减少分支指令的使用,提高流水线效率。
异常屏蔽位(Exception masking bits)
D 调试异常屏蔽位(Debug exception mask bit)。当EL0被允许修改屏蔽位时,该位可见且可修改。但在EL0下,该位在架构上被忽略。
A SError屏蔽位(SError mask bit)。
I IRQ中断屏蔽位(IRQ interrupt mask bit)。
F FIQ中断屏蔽位(FIQ interrupt mask bit)。
对于每一位,其取值为:
- 0:异常未被屏蔽。
- 1:异常被屏蔽。
在EL0下使用AArch64状态的访问取决于SCTLR_EL1.UMA。
译者注: SError(System Error)是ARM架构中的一种异步异常,用于报告系统级错误,如总线错误或内存访问错误。IRQ(Interrupt Request)和FIQ(Fast Interrupt Request)是两种外部中断,其中FIQ具有更高的优先级。
SCTLR_EL1.UMA是系统控制寄存器中的一个位,控制用户模式(EL0)是否可以修改DAIF屏蔽位。
SME使能控制(SME enable controls)
SM 流式SVE模式使能(Streaming SVE mode enable):
- 0:流式SVE模式未使能。
- 1:流式SVE模式已使能。
- 参见”流式SVE模式(Streaming SVE mode)”。
ZA ZA存储和ZT0寄存器使能:
- 0:ZA存储和ZT0寄存器未使能。
- 1:ZA存储和ZT0寄存器已使能。
- 参见”关于PSTATE.ZA、ZA存储和SME2 ZT0寄存器(About PSTATE.ZA, ZA storage and SME2 ZT0 register)”。
译者注: SME(Scalable Matrix Extension,可扩展矩阵扩展)是ARMv9架构中引入的扩展,用于加速矩阵运算和AI/ML工作负载。流式SVE模式(Streaming SVE mode)是SME的一部分,它允许处理单元在SVE向量长度下连续执行。ZA是SME中的矩阵存储区。ZT0是SME2中引入的一个新寄存器。
B1.3.1 在EL0下访问PSTATE字段
在EL0下使用AArch64状态时,可以使用专用寄存器(Special-purpose registers)来访问PSTATE字段,这些寄存器可以使用MRS指令直接读取,使用MSR (register)指令直接写入。表B1-1显示了当处理单元处于EL0且使用AArch64状态时,用于访问包含AArch64状态的PSTATE字段的专用寄存器。所有其他PSTATE字段在EL0下没有直接读写访问权限。
表B1-1 在EL0下使用MRS和MSR (register)访问PSTATE字段
| 专用寄存器 | PSTATE字段 |
|---|---|
| NZCV | N, Z, C, V |
| DAIF | D, A, I, F |
| SVCR | SM, ZA |
| SSBS | SSBS |
| DIT | DIT |
| TCO | TCO |
软件也可以使用MSR (immediate)指令直接写入PSTATE.{D, A, I, F, SM, ZA, SSBS, DIT, TCO}。表B1-2显示了当处理单元处于EL0且使用AArch64状态时,能够直接写入PSTATE.{D, A, I, F, SM, ZA, SSBS, DIT, TCO}的MSR (immediate)操作数。
表B1-2 在EL0下使用MSR (immediate)访问PSTATE.{D, A, I, F, SM, ZA, SSBS, DIT, TCO}
| 操作数 | PSTATE字段 | 说明 |
|---|---|---|
| DAIFSet | D, A, I, F | 直接将PSTATE.{D, A, I, F}中的任意位设置为1 |
| DAIFClr | D, A, I, F | 直接将PSTATE.{D, A, I, F}中的任意位清除为0 |
| SVCRSM | SM | 直接将PSTATE.SM位设置为CRm<0>的值 |
| SVCRZA | ZA | 直接将PSTATE.ZA位设置为CRm<0>的值 |
| SVCRSMZA | SM, ZA | 直接将PSTATE.{SM, ZA}位设置为CRm<0>的值 |
| SSBS | SSBS | 直接将PSTATE.SSBS位设置为CRm<0>的值 |
| DIT | DIT | 直接将PSTATE.DIT位设置为CRm<0>的值 |
| TCO | TCO | 直接将PSTATE.TCO位设置为CRm<0>的值 |
译者注:
MSR (immediate)是将立即数写入系统寄存器的指令,而MSR (register)是将通用寄存器的值写入系统寄存器。CRm<0>是指指令编码中CRm字段的第0位,用于区分同一操作数的不同变体。MRS则是将系统寄存器的值读取到通用寄存器中。
在EL0下使用AArch64状态访问PSTATE.{D, A, I, F}字段取决于SCTLR_EL1.UMA。
软件可以使用SMSTART和SMSTOP指令更高效地更改PSTATE.{SM, ZA}。
对PSTATE字段的写入会对处理单元操作的各个方面产生副作用。所有这些副作用都保证:
- 不会对执行流中较早的指令可见。
- 会对执行流中较晚的指令可见。
译者注: 这意味着PSTATE写入的副作用是严格按程序顺序(in-order)生效的。前面的指令不会看到副作用,后面的指令一定会看到副作用。这保证了指令执行的正确性和可预测性。
B1.3.2 SVE对PSTATE N、Z、C和V条件标志位的使用
IWYXLS 本节描述了SVE对PSTATE的特殊使用方式。
IYZYCQ PSTATE N、Z、C和V条件标志位可由以下任一方式更新:
- SVE指令,该指令生成一个谓词结果,并根据结果的值更新PSTATE N、Z、C和V条件标志位。
- SVE指令,该指令根据其谓词源寄存器或FFR中的值更新PSTATE N、Z、C和V条件标志位:
PTEST。RDFFRS (predicated)。
- SVE指令,该指令根据其通用源寄存器中的值更新PSTATE N、Z、C和V条件标志位:
CTERMEQ。CTERMNE。
译者注: SVE(Scalable Vector Extension,可扩展向量扩展)是ARMv8/AArch64中的向量扩展架构,其特点是向量长度在架构层面是可扩展的(从128位到2048位)。谓词寄存器(Predicate register)是SVE中的特殊寄存器,用于控制向量元素的掩码操作,类似条件掩码。FFR(First Fault Register)是SVE中用于处理推测性加载和故障处理的特殊寄存器。
RTPXTF 对于设置PSTATE N、Z、C和V条件标志位的SVE谓词设置指令,该指令的管制谓词(Governing predicate)决定了哪些谓词元素被视为活跃(Active)元素。
译者注: 在SVE中,谓词指令的”管制谓词”是指该指令操作中使用的谓词寄存器,它决定了向量中的哪些元素是”活跃的”(即被操作)。只有活跃的元素才会影响条件标志位的设置。
RQJBRW 对于设置PSTATE N、Z、C和V条件标志位的SVE非谓词(unpredicated)设置指令,所有谓词元素都被视为活跃元素。
RZMRXC 除非指令描述中另有说明,SVE设置标志位的指令按如下方式更新PSTATE N、Z、C和V条件标志位:
| 标志位 | SVE名称 | SVE解释 |
|---|---|---|
| N | First(第一个) | 如果第一个活跃元素为TRUE,则设置为1,否则清除为0。 |
| Z | None(没有) | 如果任意活跃元素为TRUE,则清除为0,否则设置为1。 |
| C | Not last(非最后一个) | 如果最后一个活跃元素为TRUE,则清除为0,否则设置为1。 |
| V | - | 清除为0。 |
译者注: 在SVE的上下文中,”活跃元素(Active element)”是指受谓词寄存器控制的、实际参与运算的向量元素。TRUE表示谓词元素值为真(即该元素被使能),FALSE表示谓词元素值为假(即该元素被屏蔽)。”第一个活跃元素”和”最后一个活跃元素”分别指向量中第一个和最后一个被使能的元素。SVE的标志位名称(First、None、Not last)与传统的N、Z、C标志位在含义上有对应关系但有所区别——N对应”第一个活跃元素是否为真”,Z对应”是否没有活跃元素为真”,C对应”是否最后一个活跃元素不为真”。
B1.4 可伸缩向量扩展和可伸缩矩阵扩展(The Scalable Vector and Scalable Matrix Extensions, SVE & SME)
B1.4 可伸缩向量扩展和可伸缩矩阵扩展(SVE & SME)
本节包含以下内容:
- 最大实现的SVE向量长度。
- 可配置的SVE向量长度。
- SVE可伸缩向量寄存器的处理方式。
- SVE对标量值的寄存器写入。
- 向量谓词(Vector predication)。
- 流式SVE模式(Streaming SVE mode)。
- 关于PSTATE.ZA。
- ZA存储(ZA storage)。
- ZA数组向量访问(ZA array vector access)。
- ZA切片访问(ZA tile access)。
- ZA存储布局(ZA storage layout)。
- SME2多向量操作数(SME2 Multi-vector operands)。
- SME2 ZT0寄存器。
B1.4.1 最大实现的SVE向量长度(Maximum implemented SVE vector lengths)
RQSVCQ SVE可伸缩向量寄存器 Z0-Z31 有以下由具体实现定义(IMPLEMENTATION DEFINED)的向量长度:
- 一个最大实现的流式SVE向量长度(Maximum implemented Streaming SVE vector length)。
- 一个最大实现的非流式SVE向量长度(Maximum implemented Non-streaming SVE vector length)。
对于每个由具体实现定义的向量长度,以下条件均适用:
- 架构定义的最小最大长度为128位。
- 架构定义的最大最大长度为2048位。
- 长度为2的幂。
IGZRPL 最大实现的流式SVE向量长度不必大于或等于最大实现的非流式SVE向量长度。
ISGCVT 当本架构规范使用术语”最大实现的SVE向量长度”(Maximum implemented SVE vector length)时,它指的是:
- 当PE处于流式SVE模式时,指最大实现的流式SVE向量长度。
- 其他情况下,指最大实现的非流式SVE向量长度。
另请参阅:
- Z0-Z31。
- 可配置的SVE向量长度。
B1.4.2 可配置的SVE向量长度(Configurable SVE vector lengths)
RKFTHG SVE可伸缩向量寄存器 Z0-Z31 有以下可配置的向量长度:
- 有效的流式SVE向量长度(Effective Streaming SVE vector length, SVL)。
- 有效的非流式SVE向量长度(Effective Non-streaming SVE vector length, NSVL)。
IQQRNR SMCR_ELx.LEN 请求一个SVL。架构定义的SVL集合是从128位到2048位(含)的所有2的幂。允许实现任何子集,最多到(且包括)最大实现的流式SVE向量长度。该子集不必是连续的,也不必从128位开始。允许只实现单个SVL。
译者注: SVL(Streaming Vector Length)是流式SVE模式下的有效向量长度,通过SMCR_ELx.LEN字段配置。与之相对的是NSVL(Non-streaming SVE Vector Length),通过ZCR_ELx.LEN配置。两者的区别在于适用的PE模式不同。
INWYBP ZCR_ELx.LEN 请求一个NSVL。架构定义的NSVL集合是从128位到2048位(含)的所有2的幂。实现必须支持所有架构定义的值,最多到(且包括)最大实现的非流式SVE向量长度。
IWDKGR 允许实现一个与已实现的NSVL集合不重叠的SVL集合。
RGWVHP 当SMCR_ELx.LEN请求一个SVL时,PE按照SMCR_ELx.LEN字段描述中所述的步骤选择一个SVL。
RMMCTJ 当ZCR_ELx.LEN请求一个NSVL时,PE按照ZCR_ELx.LEN字段描述中所述的步骤选择一个NSVL。
IVCQBB 当本架构规范使用术语”有效的SVE向量长度”(Effective SVE vector length, VL)时,它指的是:
- 当PE处于流式SVE模式时,指SVL。
- 其他情况下,指NSVL。
RPXZTM 当在VL小于最大实现的SVE向量长度的异常级别执行时,SVE可伸缩向量寄存器中VL位及更高位,以及SVE谓词寄存器和FFR中VL÷8位及更高位,是不可访问的。
RYRPDH 当VL增加时,先前不可访问的位变为可访问,这些位的值是约束的不可预测的(CONSTRAINED UNPREDICTABLE),可能为:
- 零值。
- 在更受限制的长度下执行之前所具有的值。
IHGYPV VL可能因显式操作(如写入SMCR_ELx.LEN或ZCR_ELx.LEN)或隐式操作(如将异常获取到具有较少限制VL的异常级别)而增加。
IPDLWX 在改变VL时,始终保持可访问的位中的内容保持不变。
RKXKNK 如果以下所有条件都成立,则异常级别ELx处的VL为128位:
- SVE指令在ELx被禁用或被捕获,或者因ELx使用AArch32而不可用。
- 浮点指令在ELx未被捕获。
RDMBPN 当将异常获取到目标异常级别时,如果在目标异常级别以下的所有异常级别中,对于当前安全状态,SVE、SME和浮点指令被禁用、被捕获或不可用,则在目标异常级别处的SVE寄存器状态被保留。
IFMWZZ 当VL增加时,必须采取措施确保新可访问的区域不会暴露属于不同信任或安全范围的其他软件的值。这可以通过例如确保SVE Z、P和FFR寄存器以及SME ZA存储和ZT0寄存器中先前不可访问的位在下次使用前被清零来实现。
IBRMMV 系统软件向下层特权软件提供一个最大VL,下层软件可能进一步约束该VL。然而,系统软件必须初始化和上下文切换与它所提供的最大VL一致的值,并且不应假定下层软件正在使用任何较小的长度。例如,如果虚拟机管理程序向某个VM暴露512的VL,该VM可能选择将VL约束为256。管理程序仍然必须保存和恢复512位向量,以防止VM之间的值泄漏,因为该VM之后可能将其SVL提升到512,并且不能观察到其他软件在寄存器新可见的高位部分中创建的值。
另请参阅:
- 最大实现的SVE向量长度。
- 流式SVE模式。
B1.4.3 SVE可伸缩向量寄存器的处理方式(Treatment of SVE scalable vector registers)
IGKWYJ 除非指令描述中另有说明,SVE指令将SVE可伸缩向量寄存器视为包含一个或多个等大小的向量元素。
ICDKJQ SVE指令可以并行处理向量元素,除非指令描述中另有说明。
RCJZLM 如果SVE指令对向量或谓词元素执行的操作顺序具有可观察的意义,则按递增的元素编号顺序处理元素。
RKHDBN 当SVE指令将SVE可伸缩向量寄存器视为包含多个向量元素时,元素大小编码在指令的操作码中。元素大小为8、16、32、64或128位。
RWKYLB 当当前异常级别的有效SVE向量长度(VL)大于128位时,任何写入128位SIMD&FP寄存器 V0-V31 的AArch64指令都将位[VL-1:128]置为零。
B1.4.4 SVE对标量值的寄存器写入(SVE writes of scalar values to registers)
IZDLGD 某些SVE指令生成标量结果,该结果写入AArch64通用寄存器或向量寄存器的element[0]。
RHNVTM 当SVE指令生成宽度为N位的标量结果时,该指令将结果放入目标寄存器的位[N-1:0]中。
RQCLSH 当SVE指令生成宽度为N位的标量结果,且N小于最大可访问的目标寄存器宽度RW时,该指令将目标寄存器的位[RW-1:N]置为零。
B1.4.5 向量谓词(Vector predication)
RJFJZX 有以下向量谓词概念:
- 作为掩码的谓词(Predicate-as-mask),如果实现了FEAT_SVE或FEAT_SME。
- 作为计数器的谓词(Predicate-as-counter),如果实现了FEAT_SME2或FEAT_SVE2p1。
IHWRFM 谓词寄存器的汇编器语法格式为:
- 对于谓词即掩码(predicate-as-mask):Pg
- 对于谓词即计数器(predicate-as-counter):PNg
Pg和PNg指的是同一个SVE谓词寄存器。
译者注: 传统的SVE谓词使用”谓词即掩码”方式,每个谓词元素的最低位决定对应向量元素是否激活。SME2/SVE2.1引入了”谓词即计数器”方式,用位域编码表示连续TRUE或FALSE元素的数量,更适合多向量操作。
本节其余部分包含:
- 谓词即掩码(Predicate-as-mask)。
- 谓词即计数器(Predicate-as-counter)。
- SVE谓词指令(SVE predicated instructions)。
B1.4.5.1 谓词即掩码(Predicate-as-mask)
IJHCTW 大多数SVE指令将SVE谓词寄存器解释为谓词即掩码编码。
RXMPLM 谓词即掩码编码被划分为1位、2位、4位或8位的谓词元素。每个谓词元素对应SVE可伸缩向量寄存器中的一个向量元素。
RXVRKX 除非指令描述中另有说明,SVE指令将SVE谓词寄存器视为包含一个或多个等大小的谓词元素。
RXCZQR 当SVE指令将SVE谓词寄存器视为包含多个谓词元素时,元素大小编码在指令的操作码中。
RHRPMD 如果谓词元素的最低位编号的位为0,则谓词元素的值为FALSE。
RDNMFH 如果谓词元素的最低位编号的位为1,则谓词元素的值为TRUE。
RLTGQC 对于生成谓词即掩码编码的SVE指令,如果以下所有条件都成立,则每个目标谓词元素中除最低位编号的位之外的所有位都被置为零:
- 该指令不用于移动和置换谓词元素。
- 该指令不是谓词逻辑运算。
RHBMLS 对于消费谓词即掩码编码的SVE指令,如果以下所有条件都成立,则在读取时每个源谓词元素中除最低位编号的位之外的所有位都被忽略:
- 该指令不用于移动和置换谓词元素。
- 该指令不是谓词逻辑运算。
B1.4.5.2 谓词即计数器(Predicate-as-counter)
RDSFKR SME2和SVE2.1多向量指令将SVE谓词寄存器的bits[15:0]解释为谓词即计数器编码:
表 B1-4 谓词即计数器编码
| Bit[15] | Bits[14:(LSZ+1)]^a | Bits[LSZ:0] | 含义 |
|---|---|---|---|
| 反转(Invert) | 元素计数(Element count)^b | 元素大小(Element size) | |
| 0bX | 0bXXXXXXXXXXXXXX | 0b1 | 字节大小的元素 |
| 0bX | 0bXXXXXXXXXXXXX | 0b10 | 半字大小的元素 |
| 0bX | 0bXXXXXXXXXXXX | 0b100 | 字大小的元素 |
| 0bX | 0bXXXXXXXXXXX | 0b1000 | 双字大小的元素 |
| 0bX | 0bXXXXXXXXXXX | 0b0000 | 任意大小的元素。所有FALSE谓词。 |
a. LSZ = 元素大小字段中末尾零的个数。
b. 最高有效4位为保留位。
元素大小,bits[LSZ:0]
- 对于表B1-4中除了0b0000之外的值:
- 末尾零的个数 = log2(以字节为单位的元素大小)。
- 例如,2个末尾零 = log2(4字节)。这意味着字大小的元素。
元素计数,bits[14:(LSZ+1)]
- 一个无符号整数值:
- 从元素0开始的连续元素的数量,根据bit[15]确定为TRUE或FALSE。
反转(Invert),bit[15]
- 0b0: [14:(LSZ+1)] 保存TRUE元素的数量。所有其他元素为FALSE。
- 0b1: [14:(LSZ+1)] 保存FALSE元素的数量。所有其他元素为TRUE。
IZPLKP 谓词即计数器编码可以计数的最大元素数量是四个字节元素向量,其中每个向量的长度是架构定义的最大长度2048位:
表 B1-5
| Bit[15] | Bits[14:(LSZ+1)] | Bits[LSZ:0] | |
|---|---|---|---|
| 反转(Invert) | 元素计数(Element count) | 元素大小(Element size) | 总位数 |
| 1位 | 4位保留位。10位计数位。 | 1位 | 16位 |
| 10位计数位可以计数1024个元素,即四个2048位长向量中的字节元素数量。 |
DBJMYH 规范的all-FALSE谓词即计数器编码的元素计数为零,反转位设为0,元素大小字段设为0b0000。
DJGSYR 规范的all-TRUE谓词即计数器编码的元素计数为零,反转位设为1,元素大小字段由生成指令确定且非零。
RYCRMW 如果有效的SVE向量长度(VL)大于128位,则生成谓词即计数器编码的指令将第16位及更高位置为零。
RSGVTC 如果VL大于128位,则消费谓词即计数器编码的指令忽略第16位及更高位。
RYSTVC 消费谓词即计数器编码的指令使用元素计数字段中所需的最低有效位来计数VL乘以4的字节数。该指令忽略元素计数字段中更重要的位。表B1-6给出了VL=512位且为字节大小元素的示例:
表 B1-6
| Bit[15] 反转(Invert) | Bits[14:(LSZ+1)] 元素计数(Element count) | Bits[LSZ:0] 元素大小(Element size) |
|---|---|---|
| 1位 | 4位保留位,bits[14:11]。指令忽略这些位。 | 1位 |
| 2位,bits[10:9]。指令忽略这些位。 | ||
| 8位计数位,bits[8:1]。指令使用这些位。 | ||
| 8位计数位可以计数256个元素,即四个512位长向量中的字节元素数量。 |
另请参阅:
- P0-P15。
- 可配置的SVE向量长度。
B1.4.5.3 SVE谓词指令(SVE predicated instructions)
IVKHDR 如果指令支持谓词,则称为谓词指令(predicated instruction)。
IFNFRN 用于确定谓词指令的活动元素(Active elements)的谓词操作数称为主导谓词(Governing predicate)。
ISVYXB 没有主导谓词操作数且隐式将所有其他向量和谓词元素视为活动的指令称为无谓词指令(unpredicated instruction)。
译者注: 谓词(predication)是SVE/SME的一种条件执行机制。每个向量元素对应一个谓词位,决定该元素是否参与运算。Active element(活动元素)指受谓词控制、实际参与运算的元素;Inactive element(非活动元素)指被谓词屏蔽、不参与运算的元素。
IKNKBN 许多谓词指令只能使用P0-P7作为主导谓词。
RLZVFJ 当主导谓词元素为TRUE时,其他向量或谓词操作数中对应的元素是活动元素(Active element)。
RCNFLG 当主导谓词元素为FALSE时,其他向量或谓词操作数中对应的元素是非活动元素(Inactive element)。
RCBYJH 谓词指令处理活动元素。
RLDXSF 谓词指令不处理非活动元素。
RGJLPZ 无谓词指令处理其向量或谓词操作数中的所有元素。
RWLQBD 当谓词指令写入向量目标寄存器或谓词目标寄存器时,会发生以下情况之一:
- 目标寄存器中的非活动元素被置为零。
- 目标寄存器中的非活动元素保留其先前的值。
IQBHRN 当目标寄存器中的非活动元素被置为零时,执行清零谓词(Zeroing predication)。
IYPYRF 当目标寄存器中的非活动元素保留其先前的值时,执行合并谓词(Merging predication)。
译者注: 清零谓词(Zeroing predication)和合并谓词(Merging predication)是SVE谓词的两种实现方式。清零模式将非活动元素清零,适合向量化的标量代码;合并模式保留非活动元素的原值,适合条件更新场景。
B1.4.6 流式SVE模式(Streaming SVE mode)
RXDPXS 具有FEAT_SME的PE拥有流式SVE模式。
IZTTNW 在流式SVE模式下:
- SME和SME2指令访问流式SVE寄存器状态,该状态包括:
- SVE可伸缩向量寄存器 Z0 到 Z31。
- SVE谓词寄存器 P0 到 P15。
- SVE首次故障寄存器(First Fault register, FFR),如果实现了FEAT_SME_FA64并且当前异常级别已启用。
- PSTATE.ZA可以被切换,以根据需要启用和禁用ZA存储和ZT0寄存器。
译者注: 流式SVE模式(Streaming SVE mode)通过PSTATE.SM位控制。在该模式下,SVE/SME2指令可以访问ZA存储和ZT0寄存器。与普通SVE模式不同,流式SVE模式下某些SVE/SVE2指令可能不可用(除非实现了FEAT_SME_FA64)。
RRSWFQ 当PSTATE.SM的有效值通过任何方法从0变为1时,执行进入流式SVE模式的操作,并且所有已实现的流式SVE寄存器状态位被置为零。
RKFRQZ 当PSTATE.SM的有效值通过任何方法从1变为0时,执行退出流式SVE模式的操作,并且在新进入的模式中,SVE可伸缩向量寄存器、SVE谓词寄存器和FFR的所有已实现位被置为零。
INHNFF 合法指令(legal instruction)是指架构允许在PSTATE.{SM, ZA}处于所需状态时执行的指令,除非其执行因可配置的陷阱或使能而在当前异常级别被阻止。
IHZFSG 非法指令(illegal instruction)是指当PSTATE.SM和PSTATE.ZA不处于所需状态时,PE尝试执行该指令会导致SME非法指令异常被触发的指令,除非其执行因更高优先级的可配置陷阱或使能而在当前异常级别被阻止。
RVJZBC 在流式SVE模式下:
- 流式SVE寄存器状态有效,访问它的SME和SME2指令是合法的。
- 当PSTATE.ZA为1时,访问ZA存储或ZT0寄存器的SME和SME2指令是合法的。
- 不访问ZA存储或ZT0寄存器的SME和SME2指令是合法的。
- 访问SVE标量向量寄存器或其对应编号的SIMD&FP寄存器的合法指令访问的是流式SVE寄存器状态。
- 如果FEAT_SME_FA64未实现或未在当前异常级别启用,则以下指令是非法的:
- 某些SVE和SVE2指令。SVE指令描述中的各个指令描述说明了哪些是非法的。
- 所有调用 AArch64.CheckFPAdvSIMDEnabled() 函数的指令。
RXBBFD 当PE不处于流式SVE模式时:
- 流式SVE寄存器状态无效,访问它的SME和SME2指令是非法的。
- 当PSTATE.ZA为1时:
- 访问ZA存储的SME LDR(数组向量)、STR(数组向量)和ZERO(切片)指令是合法的。所有其他访问ZA存储的指令是非法的。
- 访问ZT0寄存器的SME2 LDR(表)、STR(表)和ZERO(表)指令是合法的。所有其他访问ZT0寄存器的指令是非法的。
ITDSPN 在流式SVE模式下,如果FEAT_SME_FA64未实现或未在当前异常级别启用,以下指令可能会被显著延迟:
- 依赖于从向量或SIMD&FP寄存器源生成的结果写入通用目标寄存器、谓词目标寄存器或NZCV条件标志的指令。
A64高级SIMD和浮点指令描述以及SVE指令描述中的操作信息部分描述了哪些指令受影响。
IMHTLZ 当PSTATE.SM的有效值通过任何方法从0变为1或从1变为0时,FPSR被设置为值0x0000_0000_0800_009f,将所有累积状态位设置为1。
IYTZVD 涉及SVE可伸缩向量寄存器Z0-Z31值的陈述也隐式地指代通过SIMD&FP寄存器名称V0-V31、Q0-Q31、D0-D31、S0-S31、H0-H31和B0-B31访问的这些寄存器的低位。
另请参阅:
- AArch64执行状态下的寄存器。
- 关于PSTATE.ZA。
- 在EL0访问PSTATE字段。
- 流式SVE模式下的浮点行为。
B1.4.7 关于PSTATE.ZA(About PSTATE.ZA)
IHVKTL PSTATE.ZA使能ZA存储,并且如果实现了FEAT_SME2,还使能ZT0寄存器。
RJHMYL 当PSTATE.ZA为0时,ZA存储和ZT0寄存器的内容无效,访问它们的SME和SME2指令是非法的。
RSFWMY 当PSTATE.ZA为1时,ZA存储和ZT0寄存器的内容有效,并由硬件保留,无论PE是否处于流式SVE模式,并且:
- 访问ZA存储的SME LDR(数组向量)、STR(数组向量)和ZERO(切片)指令是合法的。
- 访问ZT0寄存器的SME2 LDR(表)、STR(表)和ZERO(表)指令是合法的。
- 当PE处于流式SVE模式时,所有其他访问ZA存储或ZT0寄存器的SME和SME2指令是合法的。
RYRZRM 当PSTATE.ZA通过任何方法从0变为1时,ZA存储和ZT0寄存器的所有已实现位被置为零。
ILRDZR 当PSTATE.ZA从1变为0时,对ZA存储和ZT0寄存器没有架构定义的影响,因为当PSTATE.ZA为0时,无法观察到ZA存储和ZT0寄存器的内容。
IQWCJS 当PSTATE.ZA从0变为1,或从1变为0时,如果PSTATE.SM没有改变,则对SVE可伸缩向量寄存器、SVE谓词寄存器和FPSR没有影响。
另请参阅:
- 流式SVE模式。
- ZA存储。
- SME2 ZT0寄存器。
B1.4.8 ZA存储(ZA storage)
RFFWLL 具有FEAT_SME的PE拥有ZA存储。
DJBVYJ 以下是关于SVL位向量中元素数量的术语:
- SVLB:字节元素的数量,SVL ÷ 8。
- SVLH:半字元素的数量,SVL ÷ 16。
- SVLS:字元素的数量,SVL ÷ 32。
- SVLD:双字元素的数量,SVL ÷ 64。
- SVLQ:四字元素的数量,SVL ÷ 128。
RSSXPL ZA存储是架构寄存器状态,由一个二维的ZA数组(ZA array)组成,大小为 [SVLB × SVLB] 字节。
译者注: ZA(阵列,Zero-overhead Array)存储是SME引入的二维寄存器阵列,以SVLB为边长构成方阵。它本质上是一个SVL x SVL位的二维数组,可以通过多种元素大小(B/H/S/D/Q)进行访问。ZA存储是SME矩阵操作的核心存储资源。
另请参阅:
- 关于PSTATE.ZA。
- 在EL0访问PSTATE字段。
- 流式SVE模式。
B1.4.9 ZA数组向量访问(ZA array vector access)
RFFWNB ZA数组可以作为SVL位的向量进行访问。
DPPPCM 对ZA数组的无类型向量访问用 ZA[N] 表示,其中N的范围是0到SVLB-1(含)。
DDTVZN 在SME LDR(数组向量)和STR(数组向量)指令中,无类型的ZA数组向量由32位通用向量选择寄存器Wv与立即数向量选择偏移offs之和(模SVLB)选择。
DYXHFR 无类型ZA数组向量的首选反汇编格式为 ZA[Wv, offs],其中offs是范围为0-15(含)的立即数。
DCRJPC ZA数组可以作为8位、16位、32位、64位或128位元素的向量进行访问。
DWMVZT 对ZA数组的按元素向量访问通过在ZA数组名称和元素大小限定符后附加向量索引”[N]”来表示,其中N的范围是0到SVLB-1(含),如下所示:
- 对ZA数组的8位元素向量访问表示为 ZA.B[N]。
- 对ZA数组的16位元素向量访问表示为 ZA.H[N]。
- 对ZA数组的32位元素向量访问表示为 ZA.S[N]。
- 对ZA数组的64位元素向量访问表示为 ZA.D[N]。
- 对ZA数组的128位元素向量访问表示为 ZA.Q[N]。
译者注: ZA数组向量访问有两种方式:无类型访问(ZA[N])和按元素类型访问(ZA.B[N]、ZA.H[N]等)。无类型访问将整个向量视为比特流,而按元素类型访问则将向量视为指定大小的元素序列。
B1.4.10 ZA切片访问(ZA tile access)
DVSVMX ZA切片(ZA tile)是ZA数组内的一个正方形二维子数组。
IWLRTV 根据访问时使用的元素大小,ZA数组被视为包含一个或多个ZA切片,如下述各节所述。
DDWMYT ZA切片通过在ZA名称后附加切片编号来表示。
DZGBHT ZA切片片(ZA tile slice)是ZA切片内一组一维的、水平或垂直方向连续的元素。
RPZNWB 对切片的向量访问读取或写入一个ZA切片片。
INFXHH ZA切片可以作为8位、16位、32位、64位或128位元素的向量进行访问。
IYZDBS ZA切片可以作为SVL位的水平切片进行访问。
RGPVSZ 如果访问指令操作码中的V字段为0,则ZA切片作为水平切片被访问。
DTRHTX 对水平切片片的访问通过在ZA切片名称上附加”H”后缀来表示。
IHBYTT ZA切片可以作为SVL位的垂直切片进行访问。
RGPPPK 如果访问指令操作码中的V字段为1,则ZA切片作为垂直切片被访问。
DWSBVG 对垂直切片片的访问通过在ZA切片名称上附加后缀来表示。
RTWWTL 在SME指令中,切片片由32位通用切片索引寄存器Ws与立即数切片索引偏移offs之和(模指定切片中的切片片数量)选择。
译者注: ZA slice(切片)和ZA tile slice(切片片)是两个不同的概念。tile是ZA数组中的一个二维子方阵,而tile slice是tile中的一维行或列向量。对tile的向量访问总是通过读取/写入一个tile slice来完成的。
B1.4.10.1 访问8位元素ZA切片(Accessing an 8-bit element ZA tile)
DHMSNH 8位元素ZA切片通过在切片名称后附加”.B”限定符来表示。
DNLCNH 有一个名为 ZA0.B 的切片,由 [SVLB × SVLB] 个8位元素组成,并占据所有ZA存储空间。
RNBSMJ 对水平或垂直8位元素ZA切片片的访问读取或写入SVLB个8位元素。
DNMHLM 对水平或垂直8位元素ZA切片片的访问通过将切片索引”[N]”附加到切片名称、方向后缀和限定符之后来表示。例如,其中N的范围是0到SVLB-1(含):
- ZA0H.B[N] 表示水平8位元素ZA切片片选择。
- ZA0V.B[N] 表示垂直8位元素ZA切片片选择。
IJVTNY 水平与垂直ZA0.B切片片访问如下图所示,以SVL为256位为例:

图 B1-4 SVL为256位时的水平和垂直ZA0.B切片片
RDCSDX 对水平切片片 ZA0H.B[N] 的访问读取或写入ZA数组向量 ZA.B[N] 中的SVLB个字节。
RFHYSQ 对垂直切片片 ZA0V.B[N] 的访问读取或写入ZA0.B每个水平切片内的第[N]个8位元素。
DCDDVV 首选反汇编格式为:
- ZA0H.B[Ws, offs],用于水平8位元素ZA切片片选择。
- ZA0V.B[Ws, offs],用于垂直8位元素ZA切片片选择。
其中offs是范围为0-15(含)的立即数。
B1.4.10.2 访问16位元素ZA切片(Accessing a 16-bit element ZA tile)
DLNXPD 16位元素ZA切片通过在切片名称后附加”.H”限定符来表示。
DGWZDM 有两个切片,名为 ZA0.H 和 ZA1.H。每个切片由 [SVLH × SVLH] 个16位元素组成,并占据ZA存储空间的一半。
RNMGXG 对水平或垂直16位元素ZA切片片的访问读取或写入SVLH个16位元素。
DDHKMC 对水平或垂直16位元素ZA切片片的访问通过将切片索引”[N]”附加到切片名称、方向后缀和限定符之后来表示。例如,其中t为0或1,N的范围是0到SVLH-1(含):
- ZAtH.H[N] 表示水平16位元素ZA切片片选择。
- ZAtV.H[N] 表示垂直16位元素ZA切片片选择。
IZSWJW 水平与垂直ZAt.H切片片访问如下图所示,其中t为0或1,以SVL为256位为例:

图 B1-5 SVL为256位时的水平和垂直ZAt.H切片片
RBTLQC 对水平切片片 ZAtH.H[N] 的访问读取或写入ZA数组向量 ZA.H[t + 2 * N] 中的SVLH个16位元素。
RNGJBJ 对垂直切片片 ZAtV.H[N] 的访问读取或写入ZAt.H每个水平切片内的第[N]个16位元素。
DRHQJT 首选反汇编格式如下:
- ZAtH.H[Ws, offs],用于水平16位元素ZA切片片选择。
- ZAtV.H[Ws, offs],用于垂直16位元素ZA切片片选择。
其中t为0或1,offs是范围为0-7(含)的立即数。
B1.4.10.3 访问32位元素ZA切片(Accessing a 32-bit element ZA tile)
DHBKZV 32位元素ZA切片通过在切片名称后附加”.S”限定符来表示。
DRDRRT 有四个切片,名为 ZA0.S、ZA1.S、ZA2.S 和 ZA3.S。每个切片由 [SVLS × SVLS] 个32位元素组成,并占据ZA存储空间的四分之一。
RXFPPL 对水平或垂直32位元素ZA切片片的访问读取或写入SVLS个32位元素。
DJFPSJ 对水平或垂直32位元素ZA切片片的访问通过将切片索引”[N]”附加到切片名称、方向后缀和限定符之后来表示。例如,其中t为0、1、2或3,N的范围是0到SVLS-1(含):
- ZAtH.S[N] 表示水平32位元素ZA切片片选择。
- ZAtV.S[N] 表示垂直32位元素ZA切片片选择。
ISZXZR 水平与垂直ZAt.S切片片访问如下图所示,其中t为0、1、2或3,以SVL为256位为例:

图 B1-6 SVL为256位时的水平和垂直ZAt.S切片片
RJBJZY 对水平切片片 ZAtH.S[N] 的访问读取或写入ZA数组向量 ZA.S[t + 4 * N] 中的SVLS个32位元素。
RGBYSJ 对垂直切片片 ZAtV.S[N] 的访问读取或写入ZAt.S每个水平切片内的第[N]个32位元素。
DLQLJH 首选反汇编格式为:
- ZAtH.S[Ws, offs],用于水平32位元素ZA切片片选择。
- ZAtV.S[Ws, offs],用于垂直32位元素ZA切片片选择。
其中t为0、1、2或3,offs为0、1、2或3。
B1.4.10.4 访问64位元素ZA切片(Accessing a 64-bit element ZA tile)
DTWMMM 64位元素ZA切片通过在切片名称后附加”.D”限定符来表示。
DTHPSD 有八个切片,名为 ZA0.D、ZA1.D、ZA2.D、ZA3.D、ZA4.D、ZA5.D、ZA6.D 和 ZA7.D。每个切片由 [SVLD × SVLD] 个64位元素组成,并占据ZA存储空间的八分之一。
RZXYBQ 对水平或垂直64位元素ZA切片片的访问读取或写入SVLD个64位元素。
DDCXSX 对水平或垂直64位元素ZA切片片的访问通过将切片索引”[N]”附加到切片名称、方向后缀和限定符之后来表示。例如,其中t的范围是0-7(含),N的范围是0到SVLD-1(含):
- ZAtH.D[N] 表示水平64位元素ZA切片片选择。
- ZAtV.D[N] 表示垂直64位元素ZA切片片选择。
ILGJZC 水平与垂直ZAt.D切片片访问如下图所示,其中t的范围是0-7(含),以SVL为256位为例:

图 B1-7 SVL为256位时的水平和垂直ZAt.D切片片
RCVVJK 对水平切片片 ZAtH.D[N] 的访问读取或写入ZA数组向量 ZA.D[t + 8 * N] 中的SVLD个64位元素。
RJYQKK 对垂直切片片 ZAtV.D[N] 的访问读取或写入ZAt.D每个水平切片内的第[N]个64位元素。
DMQQPX 首选反汇编格式为:
- ZAtH.D[Ws, offs],用于水平64位元素ZA切片片选择。
- ZAtV.D[Ws, offs],用于垂直64位元素ZA切片片选择。
其中t的范围是0-7(含),offs为0或1。
B1.4.10.5 访问128位元素ZA切片(Accessing a 128-bit element ZA tile)
DGZDSH 128位元素ZA切片通过在切片名称后附加”.Q”限定符来表示。
DRPMJL 有16个切片,名为 ZA0.Q、ZA1.Q、ZA2.Q、ZA3.Q、ZA4.Q、ZA5.Q、ZA6.Q、ZA7.Q、ZA8.Q、ZA9.Q、ZA10.Q、ZA11.Q、ZA12.Q、ZA13.Q、ZA14.Q 和 ZA15.Q。每个切片由 [SVLQ × SVLQ] 个128位元素组成,并占据ZA存储空间的1/16。
RQGHPF 对水平或垂直128位元素ZA切片片的访问读取或写入SVLQ个128位元素。
DRLQKW 对水平或垂直128位元素ZA切片片的访问通过将切片索引”[N]”附加到切片名称、方向后缀和限定符之后来表示。例如,其中t的范围是0-15(含),N的范围是0到SVLQ-1(含):
- ZAtH.Q[N] 表示水平128位元素ZA切片片选择。
- ZAtV.Q[N] 表示垂直128位元素ZA切片片选择。
IYQPWS 水平与垂直ZAt.Q切片片访问如下图所示,其中t的范围是0-15(含),以SVL为256位为例:

图 B1-8 SVL为256位时的水平和垂直ZAt.Q切片片
RPJTQJ 对水平切片片 ZAtH.Q[N] 的访问读取或写入ZA数组向量 ZA.Q[t + 16 * N] 中的SVLQ个128位元素。
RTRJFZ 对垂直切片片 ZAtV.Q[N] 的访问读取或写入ZAt.Q每个水平切片内的第[N]个128位元素。
DVCLJP 首选反汇编格式为:
- ZAtH.Q[Ws, 0],用于水平128位元素ZA切片片选择。
- ZAtV.Q[Ws, 0],用于垂直128位元素ZA切片片选择。
其中t的范围是0-15(含),切片索引偏移始终为零。
B1.4.11 ZA存储布局(ZA storage layout)
B1.4.11.1 ZA数组向量与切片片映射(ZA array vector and tile slice mappings)
IPYTLW 每个水平切片片对应一个ZA数组向量。
所有切片大小的水平切片映射如下表所示:
| ZA数组向量 | 8位元素切片 水平切片片 | 16位元素切片 水平切片片 | 32位元素切片 水平切片片 | 64位元素切片 水平切片片 | 128位元素切片 水平切片片 |
|---|---|---|---|---|---|
| ZA[0] | ZA0H.B[0] | ZA0H.H[0] | ZA0H.S[0] | ZA0H.D[0] | ZA0H.Q[0] |
| ZA[1] | ZA0H.B[1] | ZA1H.H[0] | ZA1H.S[0] | ZA1H.D[0] | ZA1H.Q[0] |
| ZA[2] | ZA0H.B[2] | ZA0H.H[1] | ZA2H.S[0] | ZA2H.D[0] | ZA2H.Q[0] |
| ZA[3] | ZA0H.B[3] | ZA1H.H[1] | ZA3H.S[0] | ZA3H.D[0] | ZA3H.Q[0] |
| ZA[4] | ZA0H.B[4] | ZA0H.H[2] | ZA0H.S[1] | ZA4H.D[0] | ZA4H.Q[0] |
| ZA[5] | ZA0H.B[5] | ZA1H.H[2] | ZA1H.S[1] | ZA5H.D[0] | ZA5H.Q[0] |
| ZA[6] | ZA0H.B[6] | ZA0H.H[3] | ZA2H.S[1] | ZA6H.D[0] | ZA6H.Q[0] |
| ZA[7] | ZA0H.B[7] | ZA1H.H[3] | ZA3H.S[1] | ZA7H.D[0] | ZA7H.Q[0] |
| ZA[8] | ZA0H.B[8] | ZA0H.H[4] | ZA0H.S[2] | ZA0H.D[1] | ZA8H.Q[0] |
| ZA[9] | ZA0H.B[9] | ZA1H.H[4] | ZA1H.S[2] | ZA1H.D[1] | ZA9H.Q[0] |
| ZA[10] | ZA0H.B[10] | ZA0H.H[5] | ZA2H.S[2] | ZA2H.D[1] | ZA10H.Q[0] |
| ZA[11] | ZA0H.B[11] | ZA1H.H[5] | ZA3H.S[2] | ZA3H.D[1] | ZA11H.Q[0] |
| ZA[12] | ZA0H.B[12] | ZA0H.H[6] | ZA0H.S[3] | ZA4H.D[1] | ZA12H.Q[0] |
| ZA[13] | ZA0H.B[13] | ZA1H.H[6] | ZA1H.S[3] | ZA5H.D[1] | ZA13H.Q[0] |
| ZA[14] | ZA0H.B[14] | ZA0H.H[7] | ZA2H.S[3] | ZA6H.D[1] | ZA14H.Q[0] |
| ZA[15] | ZA0H.B[15] | ZA1H.H[7] | ZA3H.S[3] | ZA7H.D[1] | ZA15H.Q[0] |
| 若适用 | … | … | … | … | … |
| ZA[16]至ZA[SVLB-1] |
B1.4.11.2 切片映射(Tile mappings)
IYVYJP 最小的ZA切片粒度是128位元素切片。当ZA存储被视为切片阵列时,较大的64位、32位、16位和8位元素切片与多个128位元素切片重叠如下:
| 切片 | 重叠的切片 |
|---|---|
| ZA0.B | ZA0.Q, ZA1.Q, ZA2.Q, ZA3.Q, ZA4.Q, ZA5.Q, ZA6.Q, ZA7.Q, ZA8.Q, ZA9.Q, ZA10.Q, ZA11.Q, ZA12.Q, ZA13.Q, ZA14.Q, ZA15.Q |
| ZA0.H | ZA0.Q, ZA2.Q, ZA4.Q, ZA6.Q, ZA8.Q, ZA10.Q, ZA12.Q, ZA14.Q |
| ZA1.H | ZA1.Q, ZA3.Q, ZA5.Q, ZA7.Q, ZA9.Q, ZA11.Q, ZA13.Q, ZA15.Q |
| ZA0.S | ZA0.Q, ZA4.Q, ZA8.Q, ZA12.Q |
| ZA1.S | ZA1.Q, ZA5.Q, ZA9.Q, ZA13.Q |
| ZA2.S | ZA2.Q, ZA6.Q, ZA10.Q, ZA14.Q |
| ZA3.S | ZA3.Q, ZA7.Q, ZA11.Q, ZA15.Q |
| ZA0.D | ZA0.Q, ZA8.Q |
| ZA1.D | ZA1.Q, ZA9.Q |
| ZA2.D | ZA2.Q, ZA10.Q |
| ZA3.D | ZA3.Q, ZA11.Q |
| ZA4.D | ZA4.Q, ZA12.Q |
| ZA5.D | ZA5.Q, ZA13.Q |
| ZA6.D | ZA6.Q, ZA14.Q |
| ZA7.D | ZA7.Q, ZA15.Q |
IWGZBT 架构允许同时使用不同元素大小的切片。
译者注: 不同大小切片的”重叠”意味着共享相同的物理ZA存储空间。例如,ZA0.D(64位元素切片)与ZA0.Q和ZA8.Q(128位元素切片)共享存储,这意味着写入ZA0.D[0]会影响到ZA0.Q[0]的数据。这种设计允许同一数据以不同粒度访问。
B1.4.11.3 水平切片片映射(Horizontal tile slice mappings)
INJJXW 下图展示了SVL为256位时,32位元素和64位元素水平切片片的ZA存储映射。
每个带编号的小方块代表8位。

图 B1-9 SVL为256位的ZA存储映射:32位和64位元素水平切片片
访问水平切片片 ZA2H.S[1] 或 ZA4H.D[2] 的SME向量加载、存储或移动指令将切片视为以下布局的向量:

图 B1-10 ZA2H.S[1]和ZA4H.D[2]向量布局
B1.4.11.4 垂直切片片映射(Vertical tile slice mappings)
ITNCCV 下图展示了SVL为256位时,32位元素和64位元素垂直切片片的ZA存储映射。
每个带编号的小方块代表8位。

图 B1-11 SVL为256位的ZA存储映射:32位和64位元素垂直切片片
访问垂直切片片 ZA2V.S[1] 或 ZA4V.D[2] 的SME向量加载、存储或移动指令将切片视为以下布局的向量:

图 B1-12 ZA2V.S[1]和ZA4V.D[2]向量布局
B1.4.11.5 混合水平和垂直切片片映射(Mixed horizontal and vertical tile slice mappings)
ICGXPJ 下图展示了SVL为256位时,各种元素大小的切片、水平切片片和垂直切片片的ZA存储映射。
每个小方块代表8位。

图 B1-13 SVL为256位的ZA存储映射:各种垂直和水平切片片
IHVFMB 可以在不同元素大小的切片中同时使用不重叠的ZA数组向量。例如,切片ZA1.H、ZA0.S和ZA2.D没有共同的ZA数组向量,如下图所示,以SVL为256位为例:

图 B1-14 在不同元素大小的切片中使用各种不重叠的ZA数组向量
IWDMCK 也可以在不同元素大小的切片中访问重叠的ZA数组向量。例如,切片ZA0.H、ZA2.S和ZA6.D具有共同的ZA数组向量。
译者注: 不重叠的切片可以同时使用而不会相互干扰,这为编译器优化提供了空间。例如,ZA1.H、ZA0.S和ZA2.D这三个切片在ZA存储中占用不同的ZA数组向量行,因此可以安全地并行操作。
B1.4.12 SME2多向量操作数(SME2 Multi-vector operands)
RKLRKJ 多向量操作数允许某些SME2指令将以下内容作为源和目标操作数进行访问:
- 一组两个或四个SVE Z向量寄存器。
- 一组两个或四个ZA切片片。
- 一组两个、四个、八个或十六个ZA数组向量。
B1.4.12.1 Z多向量操作数(Z multi-vector operands)
DPSTFY 由两个或四个SVE Z向量寄存器组成的多向量操作数称为Z多向量操作数(Z multi-vector operand)。
RVCXBQ Z多向量操作数可以占据:
- 连续编号的Z寄存器。
- 跨步编号(strided numbering)的Z寄存器。
DNYNRZ 占据两个连续编号Z向量的Z多向量操作数由 Zn+0 和 Zn+1 组成,其中n+x模32是范围为0到31(含)的寄存器编号。
DDZDBM 占据四个连续编号Z向量的Z多向量操作数由 Zn+0 到 Zn+3 组成,其中n+x模32是范围为0到31(含)的寄存器编号。
DVYKCM 连续编号Z向量的Z多向量操作数的首选反汇编格式是短划线分隔的寄存器范围,例如 { Z0.S-Z1.S } 或 { Z30.B-Z1.B }。工具链还必须支持使用替代的逗号分隔列表表示法的汇编源代码,例如 { Z0.S, Z1.S } 或 { Z30.B, Z31.B, Z0.B, Z1.B },并且反汇编程序可以提供选项在短划线分隔范围和逗号分隔列表表示法之间进行选择。
DPCYZS 具有跨步寄存器编号的两个Z向量的Z多向量操作数由一个范围在Z0-Z7或Z16-Z23中的第一个寄存器组成,后跟一个编号比第一个高8的第二个寄存器。
DRZTTV 具有跨步寄存器编号的四个Z向量的Z多向量操作数由一个范围在Z0-Z3或Z16-Z19中的第一个寄存器组成,后跟三个编号每个比上一个高4的寄存器。
DDMTSL 具有跨步寄存器编号的Z向量的Z多向量操作数的首选反汇编格式是逗号分隔的寄存器列表,例如 { Z0.D, Z8.D } 或 { Z0.H, Z4.H, Z8.H, Z12.H }。
B1.4.12.2 ZA多切片片操作数(ZA multi-slice operands)
DJMCTK 由两个或四个ZA切片片组成的多向量操作数称为ZA多切片片操作数(ZA multi-slice operand)。
RSCHNH ZA多切片片操作数可以占据:
- 连续编号的水平ZA切片片。
- 连续编号的垂直ZA切片片。
DVXMGC 在由以下组成的ZA多切片片操作数中:
- 两个ZA切片片时,最低编号的切片片是2的倍数。
- 四个ZA切片片时,最低编号的切片片是4的倍数。
DJFDSB 在操作ZA多切片片操作数的指令中,最低编号的切片片由32位通用寄存器(切片索引寄存器Ws)与偏移量(切片索引偏移offs)之和向下舍入到ZA多切片片操作数中切片片数量的最近低倍数(模指定切片中的切片片数量)来选择。
RXMMKZ 操作以下ZA多切片片操作数的指令被视为UNDEFINED:
- 当SVL为128位时,64位元素切片中的四切片片操作数。
- 当SVL为128位时,128位元素切片中的两切片片操作数。
- 当SVL为128位或256位时,128位元素切片中的四切片片操作数。
译者注: 当SVL较小时(128位或256位),某些多切片片操作数组合无法实现,因为切片片的总数不足以支持所需的寻址模式。例如,SVL=128时,64位元素tile只有2个切片片,无法支持4个连续切片片的操作数。
DGJTMX ZA多切片片操作数的首选反汇编格式如下:
- ZAtH.T [Ws, offs1:offs2],用于水平ZA两切片片操作数,其中 offs2 = offs1 + 1。
- ZAtH.T [Ws, offs1:offs4],用于水平ZA四切片片操作数,其中 offs4 = offs1 + 3。
- ZAtV.T [Ws, offs1:offs2],用于垂直ZA两切片片操作数,其中 offs2 = offs1 + 1。
- ZAtV.T [Ws, offs1:offs4],用于垂直ZA四切片片操作数,其中 offs4 = offs1 + 3。
B1.4.12.3 ZA多向量操作数(ZA multi-vector operands)
DRGXBK 由两个、四个、八个或十六个ZA数组向量组成的多向量操作数称为ZA多向量操作数(ZA multi-vector operand)。
DTGDRF 一个ZA数组向量称为ZA单向量组(ZA single-vector group)。
DFCYGL ZA数组中两个连续编号的向量称为ZA双向量组(ZA double-vector group)。
DGCTYB ZA数组中四个连续编号的向量称为ZA四向量组(ZA quad-vector group)。
IPMQRQ ZA多向量操作数由一个、两个或四个向量组组成,其中向量组是以下之一:
- ZA单向量组。
- ZA双向量组。
- ZA四向量组。
IKLBYZ SME2架构包括访问ZA多向量操作数的多向量指令,该操作数的向量组数量与每个Z多向量操作数中的向量数量相同。
IHPKZM 由两个或四个向量组组成的ZA多向量操作数的首选反汇编格式包含符号 VGx2 或 VGx4(分别在声明 DKQZYZ、DJWRSN 和 DTTNGH 中定义)。如果可以从其他操作数推断出来,则符号 VGx2 或 VGx4 可以在汇编源代码中可选地省略。
DCLJBX 在访问ZA多向量操作数的指令中,最低编号的向量由32位通用寄存器(向量选择寄存器Wv)与偏移量(向量选择偏移offs)之和(模以下值之一)选择:
- 当操作数由一个ZA向量组组成时,模 SVLB。
- 当操作数由两个ZA向量组组成时,模 SVLB/2。
- 当操作数由四个ZA向量组组成时,模 SVLB/4。
B1.4.12.3.1 单向量组的ZA多向量操作数(ZA multi-vector operands of single-vector groups)
DQFPHH 在ZA多向量操作数由两个单向量组组成的指令中,每个向量组保存在ZA数组的单独一半中:ZA[n+0] 和 ZA[SVLB/2 + n+0],其中n的范围是0到(SVLB/2 - 1)(含)。
DTTHGQ 在ZA多向量操作数由四个单向量组组成的指令中,每个向量组保存在ZA数组的单独四分之一中:ZA[n+0]、ZA[SVLB/4 + n+0]、ZA[SVLB/2 + n+0] 和 ZA[SVLB*3/4 + n+0],其中n的范围是0到(SVLB/4 - 1)(含)。
DKQZYZ 单向量组的ZA多向量操作数的首选反汇编格式为:
- ZA.T [Wv, offs, VGx2],当操作数由两个单向量组组成时。
- ZA.T [Wv, offs, VGx4],当操作数由四个单向量组组成时。
其中offs的范围是0到7(含),T是B、H、S或D之一。
IBYBQL 单向量组的ZA多向量操作数与32位元素ZA切片片之间的映射(SVL为256位)如下图所示:

图 B1-15 单向量组的ZA数组向量视图和32位元素ZA切片片视图
IMLNNG 单向量组的ZA多向量操作数与64位元素ZA切片片之间的映射(SVL为256位)如下图所示:

图 B1-16 单向量组的ZA数组向量视图和64位元素ZA切片片视图
B1.4.12.3.2 双向量组的ZA多向量操作数(ZA multi-vector operands of double-vector groups)
DRBSQJ 在ZA多向量操作数由一个双向量组组成的指令中,该向量组保存在ZA数组向量 ZA[n+0] 到 ZA[n+1] 中,其中n是2的倍数,范围是0到(SVLB - 2)(含)。
DKKVVG 在ZA多向量操作数由两个双向量组组成的指令中,每个向量组保存在ZA数组的单独一半中:ZA[n+0] 到 ZA[n+1] 和 ZA[SVLB/2 + n+0] 到 ZA[SVLB/2 + n+1],其中n是2的倍数,范围是0到(SVLB/2 - 2)(含)。
DVMYGN 在ZA多向量操作数由四个双向量组组成的指令中,每个向量组保存在ZA数组的单独四分之一中:ZA[n+0] 到 ZA[n+1]、ZA[SVLB/4 + n+0] 到 ZA[SVLB/4 + n+1]、ZA[SVLB/2 + n+0] 到 ZA[SVLB/2 + n+1] 和 ZA[SVLB3/4 + n+0] 到 ZA[SVLB3/4 + n+1],其中n是2的倍数,范围是0到(SVLB/4 - 2)(含)。
DJWRSN 双向量组的ZA多向量操作数的首选反汇编格式为:
- ZA.T [Wv, offs1:offs2],其中 offs1 是2的倍数,范围0到14(含),当操作数由一个双向量组组成时。
- ZA.T [Wv, offs1:offs2, VGx2],其中 offs1 是2的倍数,范围0到6(含),当操作数由两个双向量组组成时。
- ZA.T [Wv, offs1:offs2, VGx4],其中 offs1 是2的倍数,范围0到6(含),当操作数由四个双向量组组成时。
其中 offs2 = offs1 + 1,T是B、H、S或D之一。
ILZRTK 双向量组的ZA多向量操作数与32位元素ZA切片片之间的映射(SVL为256位)如下图所示:

图 B1-17 双向量组的ZA数组向量视图和32位元素ZA切片片视图
IJYQTB 双向量组的ZA多向量操作数与64位元素ZA切片片之间的映射(SVL为256位)如下图所示:

图 B1-18 双向量组的ZA数组向量视图和64位元素ZA切片片视图
B1.4.12.3.3 四向量组的ZA多向量操作数(ZA multi-vector operands of quad-vector groups)
DWSTWB 在ZA多向量操作数由一个四向量组组成的指令中,该向量组保存在ZA数组向量 ZA[n+0] 到 ZA[n+3] 中,其中n是4的倍数,范围是0到(SVLB - 4)(含)。
DQJXHS 在ZA多向量操作数由两个四向量组组成的指令中,每个向量组保存在ZA数组的单独一半中:ZA[n+0] 到 ZA[n+3] 和 ZA[SVLB/2 + n+0] 到 ZA[SVLB/2 + n+3],其中n是4的倍数,范围是0到(SVLB/2 - 4)(含)。
DBQWJD 在ZA多向量操作数由四个四向量组组成的指令中,每个向量组保存在ZA数组的单独四分之一中:ZA[n+0] 到 ZA[n+3]、ZA[SVLB/4 + n+0] 到 ZA[SVLB/4 + n+3]、ZA[SVLB/2 + n+0] 到 ZA[SVLB/2 + n+3] 和 ZA[SVLB3/4 + n+0] 到 ZA[SVLB3/4 + n+3],其中n是4的倍数,范围是0到(SVLB/4 - 4)(含)。
DTTNGH 四向量组的ZA多向量操作数的首选反汇编格式为:
- ZA.T [Wv, offs1:offs4],其中 offs1 是4的倍数,范围0到12(含),当操作数由一个四向量组组成时。
- ZA.T [Wv, offs1:offs4, VGx2],其中 offs1 为0或4,当操作数由两个四向量组组成时。
- ZA.T [Wv, offs1:offs4, VGx4],其中 offs1 为0或4,当操作数由四个四向量组组成时。
其中 offs4 = offs1 + 3,T是B、H、S或D之一。
IZNSGW 四向量组的ZA多向量操作数与32位元素ZA切片片之间的映射(SVL为256位)如下图所示:

图 B1-19 四向量组的ZA数组向量视图和32位元素ZA切片片视图
IKBMLX 四向量组的ZA多向量操作数与64位元素ZA切片片之间的映射(SVL为256位)如下图所示:

图 B1-20 四向量组的ZA数组向量视图和64位元素ZA切片片视图
译者注: SME2多向量操作数是SME2扩展的核心特性之一。通过将多个向量组织为向量组(VGx2/VGx4),SME2指令可以同时处理更大规模的数据。不同的向量组类型(单向量组、双向量组、四向量组)对应不同的数据组织方式,分别映射到ZA数组的不同分区(整体、半区、四分之一区)。
B1.4.13 SME2 ZT0寄存器(SME2 ZT0 register)
RKHZMV 具有FEAT_SME2的PE拥有一个512位寄存器 ZT0,用于存储查找表(lookup table)。
RWDJBC ZT0寄存器保存8位、16位或32位的查找表元素,这些元素存储在32位表项的最低有效位中。寄存器中最低编号的32位保存表项0。
RJQXLS ZT0寄存器查找表可以使用来自一个源Zn SVE可伸缩向量寄存器的编号部分的完全压缩的2位或4位索引进行访问。
IBRRGG 当ZT0寄存器查找表由2位索引寻址时,可以访问给定元素大小的四个不同表元素(0-3)。当查找表由4位索引寻址时,可以访问给定元素大小的16个不同表元素(0-15)。
RJKYRB 索引的8位、16位或32位表元素从ZT0寄存器读出,并打包到SVE Z向量或Z多向量操作数的连续或跨步元素中。
译者注: ZT0是一个512位查找表寄存器,用于SME2的查表指令。它存储一个包含16个32位表项的表格(或相应的更小元素的组合),支持通过2位或4位索引进行快速查表访问,可用于实现复杂的数值计算如激活函数等。
另请参阅:
- 关于PSTATE.ZA。
- 流式SVE模式。
- 在EL0访问PSTATE字段。
B1.5 软件控制特性与EL0(Software control features and EL0)
以下各节描述EL0视角下的软件控制特性:
- 异常处理(Exception handling)
- 等待中断和等待事件(Wait for Interrupt and Wait for Event)
- YIELD指令(The YIELD instruction)
- 应用级缓存管理(Application level cache management)
- 与调试相关的指令(Instructions relating to Debug)
- 关于PSTATE.DIT(About PSTATE.DIT)
B1.5.1 异常处理(Exception handling)
在Arm架构中,异常会导致程序流的改变。异常处理程序的执行从高于EL0的异常级别(Exception level)开始,从与被捕获异常相关的定义向量(vector)处启动。
异常包括:
- 中断(Interrupts)
- 存储系统异常中止(Memory system aborts)
- 因尝试执行未定义(UNDEFINED)指令而产生的异常
- 系统调用(System calls)
- 安全监视器(Secure monitor)或Hypervisor陷阱(traps)
- 调试异常(Debug exceptions)
大多数异常处理的细节对应用级软件不可见,这些内容在《AArch64系统级程序员模型》(The AArch64 System Level Programmers’ Model)中描述。
SVC指令会引发监管者调用异常(Supervisor Call exception)。这为非特权软件向操作系统发起系统调用提供了一种机制。
BRK指令会产生断点指令异常(Breakpoint Instruction exception)。这为使用在同一PE上执行的调试器进行软件调试提供了一种机制,请参见”断点指令异常”(Breakpoint Instruction exceptions)。
注: BRK指令仅在A64指令集中受支持。在T32和A32指令集中,等效的指令是BKPT。
B1.5.2 等待中断和等待事件(Wait for Interrupt and Wait for Event)
发出WFI指令表示在WFI唤醒事件发生之前无需进一步执行,请参见”等待中断机制”(Wait for Interrupt mechanism)。这允许进入低功耗状态。
发出WFE指令表示在WFE唤醒事件发生之前无需进一步执行,请参见”等待事件”(Wait for Event)。这允许进入低功耗状态。
B1.5.3 YIELD指令(The YIELD instruction)
YIELD指令提供一种提示(hint),表明线程执行的任务优先级较低,因此可以让出执行权,请参见”YIELD”。该机制可用于提高对称多线程(Symmetric Multithreading, SMT)或对称多处理(Symmetric Multiprocessing, SMP)系统中的整体性能。
使用YIELD指令的示例包括:处于自旋锁(spin-lock)等待中的线程,或者SMP系统中侦听位(snoop bit)的仲裁优先级被修改的情况。YIELD指令允许在SMT和SMP系统之间实现二进制兼容性。
YIELD指令是一条NOP提示指令。
YIELD指令在单线程系统中没有效果,但此类系统的开发人员可以使用该指令标记其预期用途,以便将来迁移到多处理器或多线程系统。操作系统可以在需要让出提示(yield hint)的位置使用YIELD,并知道如果没有实现收益,它将被当作NOP处理。
B1.5.4 应用级缓存管理(Application level cache management)
少数缓存维护指令可以通过SCTLR_EL1系统寄存器在EL0启用,这需要更高的特权级别进行配置。EL0对没有访问权限的操作的任何访问都会导致该指令被捕获(trapped)。
关于可用操作的说明,请参见”应用级缓存相关功能的访问”(Application level access to functionality related to caches)。
B1.5.5 与调试相关的指令(Instructions relating to Debug)
异常处理部分提到了BRK指令,该指令会产生断点指令异常。此外,在AArch64状态和AArch32状态下,HLT指令会使PE暂停执行并进入调试状态(Debug state)。这为使用PE外部的调试器进行软件调试提供了一种机制,请参见”关于外部调试”(About External Debug)。
注: 在AArch32状态下,架构的早期版本定义了DBG指令,该指令可以向调试系统提供提示。该指令作为NOP执行。Arm已弃用DBG指令的使用。
B1.5.6 关于PSTATE.DIT(About PSTATE.DIT)
数据独立时间代码序列(data-independent-time sequence of code) 是指从PSTATE.DIT由0变为1后执行的第一条指令开始,到PSTATE.DIT由1变为0前执行的最后一条指令为止(包含边界)所执行的指令序列。在PSTATE.DIT从0变为1到从1变为0之间投机执行(speculatively executed)的指令也被视为该数据独立时间代码序列的一部分。
数据独立时间资源(data-independent-time resource) 是以下任何一种:
- 除零寄存器(ZR)之外的通用寄存器(general-purpose register)
- 栈指针寄存器(Stack Pointer register)
- SIMD&FP寄存器
- 如果实现了FEAT_SVE或FEAT_SME,则为SVE可扩展向量寄存器(SVE scalable vector register)
- 如果实现了FEAT_SVE或FEAT_SME,则为SVE可扩展谓词寄存器(SVE scalable predicate register)
- 如果实现了FEAT_SME,则为ZA寄存器
- 如果实现了FEAT_SME2,则为ZT0寄存器
- SPSR_ELx.{N, Z, C, V}
- PSTATE.{N, Z, C, V}
注: PSTATE.{N, Z, C, V}集合和SPSR_ELx.{N, Z, C, V}集合各自被视为一个单一的数据独立时间资源。
数据独立时间指令(data-independent-time instruction) 是一条必须遵守本节所述数据独立时序行为(data-independent timing behaviors)的指令。
数据独立时间值(data-independent-time value) 是以下任何一种:
- 在数据独立时间代码序列(C)中执行的数据独立时间指令(I1)的显式内存读取效果(Explicit Memory Read Effect)从内存中读取的任何给定值(V),且V未被任何其他指令(I2)消费,如果满足以下任一条件:
- I2不是数据独立时间指令
- I2不在C中执行
- V被用于形成I2生成的内存效果(Memory Effect)的地址或逻辑地址标签(Logical Address Tag)
- 如果I2是SVE指令(无论是否启用流模式(streaming mode)),V被用作I2的主控谓词操作数(Governing predicate operand)
- 如果I2是SME指令,V被用作I2的主控谓词操作数、切片索引寄存器(slice index register)或向量选择寄存器(vector select register)
- 在数据独立时间代码序列(C)中执行的数据独立时间指令(I1)写入数据独立时间资源的任何给定值(V),且V未被任何其他指令(I2)消费,如果满足以下任一条件:
- I2不是数据独立时间指令
- I2不在C中执行
- V被用于形成I2生成的内存效果的地址或逻辑地址标签
- 如果I2是SVE指令(无论是否启用流模式),V被用作I2的主控谓词操作数
- 如果I2是SME指令,V被用作I2的主控谓词操作数、切片索引寄存器或向量选择寄存器
- 在数据独立时间代码序列(C)中执行的数据独立时间指令(I1)从数据独立时间资源中读取的任何给定值(V),且以下条件均不适用:
- V由另一条指令(I0)产生,且满足以下任一条件:
- I0不是数据独立时间指令
- I0不在C中执行
- V被用于形成I1产生的内存效果的地址或逻辑地址标签
- V未被任何其他指令(I2)消费,如果满足以下任一条件:
- I2不是数据独立时间指令
- I2不在C中执行
- V被用于形成I2生成的内存效果的地址或逻辑地址标签
- 如果I2是SVE指令(无论是否启用流模式),V被用作I2的主控谓词操作数
- 如果I2是SME指令,V被用作I2的主控谓词操作数、切片索引寄存器或向量选择寄存器
- V由另一条指令(I0)产生,且满足以下任一条件:
- 在数据独立时间代码序列(C)中执行的数据独立时间指令(I1)的显式内存写入效果(Explicit Memory Write Effect)写入内存的任何给定值(V),且以下条件均不适用:
- V由另一条指令(I0)产生,且满足以下任一条件:
- I0不是数据独立时间指令
- I0不在C中执行
- V被用于形成I1产生的内存效果的地址或逻辑地址标签
- V源自有零寄存器(zero register)
- V未被任何其他指令(I2)消费,如果满足以下任一条件:
- I2不是数据独立时间指令
- I2不在C中执行
- V被用于形成I2生成的内存效果的地址或逻辑地址标签
- 如果I2是SVE指令(无论是否启用流模式),V被用作I2的主控谓词操作数
- 如果I2是SME指令,V被用作I2的主控谓词操作数、切片索引寄存器或向量选择寄存器
- V由另一条指令(I0)产生,且满足以下任一条件:
- 作为执行数据独立时间代码序列的结果,从位置(L)投机读取(speculatively read)内存的任何给定值(V),其中L未被数据独立时间代码序列显式读取。示例包括:
- 在读取显式内存读取效果所需字节的同时,从内存中读取额外的字节
- 硬件生成的数据预取(hardware-generated prefetches)
- 预取内存指令(Prefetch memory instructions)
给定数据独立时间代码序列的执行时间必须独立于所有数据独立时间值。
在数据独立时间代码序列内执行的数据独立时间指令(I1)的执行时间必须独立于I1消费或产生的所有数据独立时间值。
从数据独立时间代码序列内捕获的异步异常(asynchronous exception)的响应时间必须独立于所有数据独立时间值。
数据独立时间代码序列(C1)的执行不得导致PE微架构状态(microarchitectural state)发生不可逆的变化,从而使在C1之后执行的代码序列(C2)能够确定C1执行期间访问的任何数据独立时间值。就本要求而言,由显式内存写入效果写入并保存在缓存中的数据独立时间值不被视为微架构状态的不可逆变化。
数据独立时间代码序列(C1)的执行不得以允许在C1之后执行的代码序列(C2)确定C1期间访问的任何数据独立时间值的方式改变PMU计数器的状态。
注: 在架构要求指令仅读取或写入数据独立时间资源的子集的情况下,出于这些要求的目的,整个数据独立时间资源被视为已被读取或写入。
注: 如果数据独立时间值是从外设(peripheral)读取或写入外设的,则架构不保证数据独立时间代码序列的执行时间独立于数据独立时间值。
注: 某值因由数据独立时间指令在数据独立时间代码序列内执行的显式内存读取效果从内存位置(L)读取、或由显式内存写入效果写入L而被归类为数据独立时间值,是基于该特定效果。L中持有的值本身不被视为数据独立时间值。因此,如果L通过以下任一方式被访问,则数据独立时间代码序列的执行时间可能根据L中持有的值而变化:
- 在数据独立时间代码序列之外(架构上或投机地)
- 在数据独立时间代码序列内,但不是作为数据独立时间值
注:
- 指令描述的”操作信息”(Operational information)部分指示该指令是否为数据独立时间指令。如果指令描述的操作信息部分未提及数据独立时间,或者该部分不存在,则该指令不是数据独立时间指令。
- 对数据独立时间值使用值预测(value prediction)与”时序对正在加载的数据值不敏感”的要求不兼容。
- Arm建议,无论指令是否在数据独立时间代码序列中执行,FEAT_PAuth指令的时序都不应依赖于指针认证中使用的密钥值。
- 架构对在数据独立时间代码序列之外执行的任何指令的时序特性不做任何声明。但是,在许多情况下,这些指令很可能具有与数据无关的时序。
- 对于SVE和SME的谓词指令(predicated instructions),程序员有责任使用不会反映被操作数据值的主控谓词(Governing predicate)。
在AArch64状态下,相应的DIT位被添加到PSTATE中;在AArch32状态下,被添加到CPSR中。
在从AArch64状态捕获到AArch64状态的异常上,PSTATE.DIT被复制到SPSR_ELx.DIT。
在从AArch32状态捕获到AArch64状态的异常上,CPSR.DIT被复制到SPSR_ELx.DIT。
在从AArch64状态进行异常返回时:
- 当目标异常级别处于AArch64状态时,SPSR_ELx.DIT被复制到PSTATE.DIT
- 当目标异常级别处于AArch32状态时,SPSR_ELx.DIT被复制到CPSR.DIT
PSTATE.DIT可以在所有异常级别进行读写。
注:
- PSTATE.DIT在进入调试状态(Debug state)时保持不变。
- 不保证PSTATE.DIT在调试状态中具有任何效果。
- 建议软件确保在寄存器中持有秘密数据时不执行任何间接分支(indirect branch)。
- 建议软件确保在寄存器中持有秘密数据时,没有直接分支(direct branches)以非恒定时间代码(non-constant-time code)为目标。