A64的寄存器

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

通用寄存器

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

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

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

因为同一个寄存器分为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表示。不管以多少位去访问一个寄存器,访问的都是同一个寄存器,只是访问数据位宽不一样而已。

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

比如:

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

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

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

前面的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分类目录,贴了标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。