Arm 臂霓虹灯至aarch64
我有ARM NEON armv7-a的代码: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 注释中的第
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>