卢骏 · 2020年06月19日

A64的寄存器

A64架构,寄存器,分为通用寄存器和向量寄存器。

通用寄存器

通用寄存器,用于定点指令。

对于通用寄存器,总共有31个,R0到R30。但是寄存器分为64位和32位版本,分别用X和W表示。不管是64位还是32位去访问一个寄存器,访问的都是同一个寄存器,只是访问数据位宽不一样而已。
1.png

还有另外两个寄存器,zero寄存器和栈寄存器。zero寄存器值固定为0,编号是31号。栈寄存器保存当前的栈顶,编号也是31号寄存器。因为这两个寄存器编号都是31号,因此会根据指令的类别,从而决定该31号编号,是用zero寄存器,还是栈寄存器。
2.png
3.png

因为同一个寄存器分为32位和64位版本,如果64位访问32位,会将32位的第32位赋值给64位的低32,然后将高32位清零。

比如如下指令:

    mov w5, #0x88

    mov x6, x5

第一条指令,执行后,w5结果为88。

第二条指令,此时用的x5,64位,88赋值给x5的低32位,高32位补零。最后x6的值就为88。

比如如下指令:

    ldr x5, =0x86_00000088

    mov w6, w5

第一条指令,执行后,x5结果为0x86_00000088。

第二条指令,此时用的w5,32位,88赋值给x5的低32位,高32位清零。最后w6的值就为88。

对于X30寄存器,是link寄存器。当执行BL,BLR指令,会将下一条指令的地址,保存在X30寄存器中,当执行RET指令,会将X30寄存器中存的值,赋值给PC,实现返回。

A64中,取消了A32中的PC寄存器。因为A64,不能像A32一样,读取PC寄存器,获取到当前的PC。

向量寄存器

向量寄存器,用于浮点指令,或者SIMD指令。总共有31个,V0-V31。分为8位,16位,32bit,64位,128位版本。分别用B,H,S,D,Q表示。不管以多少位去访问一个寄存器,访问的都是同一个寄存器,只是访问数据位宽不一样而已。
4.png

A64中,提供按下标访问访问向量寄存器。
5.png

比如:

◾V0.B[1],表示访问 V0寄存器的 [15:8] bit数据。

◾V0.S[2], 表示访问V0寄存器的 [95:64] bit数据。

对V寄存器,还提供了分组方式。
6.png

前面的bits,表示一个lanes,包含多少个bit,也就是多少位为一组。后面的bits,表示分成多少个组。

因此V寄存器,是128bit。可以分成64bit(低64bit有效)或者128bit两种模式。

◾如果按照8位为一个组,那么可以分为8组(64bit)或者16组(128bit)。

◾如果按照16位为一个组,那么可以分为4组(64bit)或者8组(128bit)。

◾如果按照32位为一个组,那么可以分为2组(64bit)或者4组(128bit)。

◾如果按照64位为一个组,那么可以分为1组(64bit)或者2组(128bit)。

还可以结合下标访问,从而对寄存器的指定bit位域进行访问。

比如:

◾V0.8B[1], 将V按照8bit分组,分成8组。取第1组,也就是 [15:8] 位域数据。

◾V0.16B[1],将V按照8bit分组,分成16组。取第1组,也就是 [15:8] 位域数据。

系列其他篇

原文首发于骏的世界博客
作者:卢骏.
更多Arm技术相关的文章请关注Arm技术博客极术专栏,每日更新。
推荐阅读
关注数
23583
内容数
1033
Arm相关的技术博客,提供最新Arm技术干货,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息