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技术相关的文章请关注Arm技术博客极术专栏,每日更新。