Arm 臂霓虹灯至aarch64

Arm 臂霓虹灯至aarch64,arm,simd,arm64,neon,Arm,Simd,Arm64,Neon,我有ARM NEON armv7-a的代码: vst2.u8 {d1,d3}, [%1]! 我将其移植到aarch64,如下所示: st2 {v1.8b,v3.8b},[%1],#16 并得到一个错误:错误:操作数1处的寄存器列表无效--`st2{v1.8b,v3.8b},[x1],#16' 根据doc的规定,这是有效的: ST2 {Vt.<T>, Vt+2.<T>}, vaddr 编译器没有因错误消息而中断我指的是2018年最后一次更新的here 注释中的第

我有ARM NEON armv7-a的代码:

vst2.u8   {d1,d3}, [%1]!
我将其移植到aarch64,如下所示:

st2 {v1.8b,v3.8b},[%1],#16
并得到一个错误:错误:操作数1处的寄存器列表无效--`st2{v1.8b,v3.8b},[x1],#16'

根据doc的规定,这是有效的:

ST2 {Vt.<T>, Vt+2.<T>}, vaddr 
编译器没有因错误消息而中断

我指的是2018年最后一次更新的here

注释中的第一个链接只是关于aarch32指令集的。第二个链接是关于AARC64指令集的,但在pdf标题中标题为iterim,并于2011年发布。格式

ST2 { <Vt>.<T>, <Vt+2>.<T> }, vaddr
该指令可以使用三种类型的偏移量:

  • 无偏移(
    Rm==000000
    I==0
    ):

  • 寄存器偏移量(
    Rm!=111111
    I==1
    ):

    ST2{,.},[],
    
这里是关于
Q
#16
#32
。只有第一个寄存器的索引
t
保存在此处的编码中。第二个寄存器的索引始终计算为
t+1 mod 32

这就是为什么会出现错误:寄存器必须彼此跟随。没有足够的空间单独编码第二个寄存器。这两个索引寄存器已经占用了太多的空间

考虑 难道不可能对第二个寄存器进行编码吗?在
I==0
的情况下,
Rm
被设置为
00000
,但这只是常规。此寄存器可用于我们的目的,但仅在未指定立即或寄存器偏移量的情况下使用


我也明白草案中没有采用
格式的原因:它只能针对这种特殊情况进行编码。该实现将使芯片的实现更加复杂,根本不值得。

您正在查看哪个文档?ARM®A64指令集体系结构(DDI 0596)说明:
是要传输的第一个或唯一一个SIMD&FP寄存器的名称,编码在“Rt”字段中。是要传输的第二个SIMD&FP寄存器的名称,编码为“Rt”加1模32。
@Michael,我正在查看,文档
d1、d3
是32位模式下2个连续16字节
q
寄存器的高64位
v1.8b
v2.8b
是64位模式下两个连续16字节向量寄存器的低位64位。(我没有检查32位指令以查看是否可以对任意对进行编码,或者在32位模式下只有reg,reg+2)得到了它。谢谢你的澄清
ST2 { <Vt>.<T>, <Vt+2>.<T> }, vaddr
┌───┬───┬──────────┬───┬───────┬──────┬────┬───────┬───────┐
│ 0 │ Q │ 00110010 │ I │ mmmmm │ 1000 │ ss │ nnnnn │ ttttt │
└───┴───┴──────────┴───┴───────┴──────┴────┴───────┴───────┘
                           Rm          size    Rn      Rt
ST2 { <Vt>.<T>, <Vt2>.<T> }, [<Xn|SP>]
ST2 { <Vt>.<T>, <Vt2>.<T> }, [<Xn|SP>], <imm>
ST2 { <Vt>.<T>, <Vt2>.<T> }, [<Xn|SP>], <Xm>