1

私は現在、Armv6 SIMD および DSP 拡張機能を利用しようとして、C コードの一部を書き直しています (私は ARM アセンブリ言語に関する初心者です)。

これまでのところ、SMUSD と SMUADX を使用して複素数の乗算を実装することで大きな成果を上げてきました。これらの命令は、複素数の実部と虚部が 1 つの 32 ビット レジスタの 16 ビット ハーフワードに格納されていることを前提としています。

特定の複雑な乗算を実行する前に、両方の符号付きハーフワードの算術右シフトを 1 ビット実行する必要があります。

これは私の現在のコードです。これは効率的ではなく、おそらくもっと速い方法があると思います。このコードはアルゴリズムの最もタイトなループで実行され、SMUSD と SMUADX への切り替えによって得られたサイクルの一部が、この風変わりなシフト コードによって失われているため、私は懸念しています。

mov r0, r0, asr#1  @ arithmetically shift right by 1
                   @ higher half-word is ok, lower half-word is now polluted by
                   @ the higher half-word's lowest bit becoming the sign bit
                   @ of the lower half-word

tst   r0, #0x4000  @ test if the lower-halfword was negative 
                   @ (sign bit was shifted, it is now at position 14)

orrne r0, #0x8000  @ if negative, ensure the sign bit is turned on
biceq r0, #0x8000  @ if positive, ensure the sign bit is turned off

第 2 オペランドでシフト操作を行う PKHBT および PKHTB 命令を少しいじってみましたが、符号付きハーフワードでは機能しないようです。

どんな提案でも大歓迎です!

4

1 に答える 1

2

私はこれがうまくいくと思います:

MOV r1, #0
SHADD16 r0, r1, r0

SHADD16は、半分の単語を追加してから半分の結果に署名されます(これは、1のASRと同じです)。

于 2012-08-22T21:27:52.847 に答える