2017-08-30 30 views
1

私がテストしているいくつかの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ロードを生成しないのはなぜですか?

答えて

1

ここでの違いは、32ビットARM(別名AArch32)とAArch64の間にあります。

2つのDレジスタが1つのQレジスタでエイリアシングされるという事実は、32ビットモードでは真ですが、64ビットモードでは真ではありません。 AArch64ではdXqXの前半であり、q(X/2)はAArch32と同じではなく、qレジスタの上半分をアドレス指定するためのdレジスタ名はありません。

あなたは、AArch32で、命令vld1.32 {q0}, [r0]を組み立てる場合は、vld1.32 {d0-d1}, [r0]を組み立てる場合は、あなたが得るとして、それは(親指モードで)同じオペコードf920 0a8fに変わります。したがって、逆アセンブラは、どの形式を表示用に使用するかを選択することが基本です(逆アセンブラのガイドラインがあるかもしれませんが、Dレジスタ形式を使用する方が望ましいと言います)。

AArch64では、同じ方法で別名が付けられていないため、2つの形式が区別されるため、Qレジスタへの128ビットの読み込みを要求すると、それが得られ、それについてはあいまいさはありません。