私がテストしているいくつかのARM開発ボードでは、いくつかのARMディスアセンブルがあります。それらは、-march=armv7-a -mfloat-abi=hard -mfpu=neon
を使用してNEON固有のvld1q_u32
で生成されました。我々は(/proc/cpuinfo half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
)を参照NEONとvld1.32 {d20-d21}とvld1q q10との差は、
一つ一つの特定のマシン:私たちが見る他のNEONマシン(/proc/cpuinfo : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
)で
0: b5f0 push {r4, r5, r6, r7, lr}
...
20: f964 4a8f vld1.32 {d20-d21}, [r4]
:
0: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
...
28: f964 2a8f vld1.32 {d18-d19}, [r4]
そして、我々が見るARMv8マシン(/proc/cpuinfo : fp asimd evtstrm aes pmull sha1 sha2 crc32
)上:
0: 3dc00021 ldr q1, [x1]
...
10: 3dc00c22 ldr q2, [x1,#48]
14: 3dc01023 ldr q3, [x1,#64]
私は、 Qは、同じbank of registersの単純に異なるビューです。私が明確にしていないのは、ARMv7 NEONが1Qロードではなく複数レジスタロードを実行している理由です。
私の質問は、vld1.32 {2-D}
とvld1q.32 1-Q
の違いは何ですか?あるいは、コンパイラがすべての場合に1-Qロードを生成しないのはなぜですか?