0

arm ネオン コードを使用して SIMD アーキテクチャに取り組んでいます。ここでの問題は、関数の 1 つのパスで、で利用可能なすべてのレジスタを使用していることであり、 neon であるため、コンパイル中に次のエラーが発生します。

nw2.c: In function 'bit_24':
nw2.c:123: error: unable to find a register to spill in class 'GENERAL_REGS'
nw2.c:123: error: this is the insn:
(insn 33 32 34 5 c:\cs\codesourcery\sourcery_g++_lite\bin\../lib/gcc/arm-none-ea
bi/4.3.3/include/arm_neon.h:9246 (parallel [
            (set (reg:CI 178 [ D.19511 ])
                (unspec:CI [
                       (mem:CI (reg/f:SI 177 [ __a.165 ]) [0 S48 A64])
                        (reg:CI 178 [ D.19511 ])
                        (unspec:V16QI [
                                (const_int 0 [0x0])
                            ] 191)
                    ] 106))
            (set (reg/f:SI 177 [ __a.165 ])
                (plus:SI (reg/f:SI 177 [ __a.165 ])
                    (const_int 24 [0x18])))
       ]) 1593 {neon_vld3qav16qi} (nil))
 nw2.c:123: confused by earlier errors, bailing out

レジスタを最小限に抑えたいので、最初に 8x16 として宣言されたレジスタを 16x8 として使用できるかどうか疑問に思っていました。

私を助けてください

4

1 に答える 1

0

レジスターは思い通りに使用できます。

アセンブラーを作成する場合は、ロード/プロセス/ストア操作を新しい型に適用するだけです。

組み込み関数を作成する場合、それは同じです...実際には。再利用するだけですが、その時が来たら、1 つの方法でのみ使用するようにしてください。

レジスタを「見る」方法を変換することもできます。古典的なトリックは、reg に 4 文字をロードすることです-4 文字の VLD 命令はありません-しかし、int を NEON レジスタの 4-int reg (4 バイト) のレーンにロードしてからキャストすることができます。

キャストは組み込み関数でのみ意味がありますが、ASM では、そこにロードされたデータに対して意味があることがわかっている操作を適用するだけです。

于 2012-07-11T06:42:14.840 に答える