2

ビットバイトからメモリにバイトを設定したいのですが、指定された透過バイト値と等しくない値のバイトを設定します。

概略的にやりたいこと:

for (char *src=start;src<end;src++,dst++) 
{
    if (*src!=VALUE) {
       *dst=*src;
    }
}

つまり、Cまたはアセンブリ(またはCがアセンブリから逆変換されたもの)で、値とは異なるバイトのみを設定します。

より高速にするために、32ビットロード、srcとdst間のSEL操作、および32ビットストアの使用を検討しました。ただし、APSR.GEにあるマスクを設定する必要があります。

私が間違っていない場合、VALUEでSIMD比較(USUB8を使用)を実行すると、結果がVALUEに対して> =または<であるかどうかのみがチェックされ、それらが等しいかどうかをチェックすることはできません。(もちろん、VALUEを0または255に制限して、1日と呼ぶこともできます...)

もう1つの可能性は、srcで事前に計算されたマスクを使用してから、手動でAPSR.GEを設定することです(可能ですか?)が、1)メモリを使用します、2)3)前にデータを保持することが常に可能であるとは限りません。バイトごとのアクセスよりも高速です。

4

2 に答える 2

4

正確な構文は今のところ私を免れますが、次のようなものはどうですか?

  • 既存のイメージからRa(LDR)に4バイトをロードします
  • ソースイメージからRb(LDR)に4バイトをロードします
  • VALUEを0(EOR)に変更するための適切なマスク(〜VALUE)を使用したXOR Ra
  • 上記と同じマスクのXORRb(EOR)
  • GEフラグを設定するために0が入ったレジスタでUSUB8を実行します(USUB8)
  • SELを使用して、既存のイメージバイトとソースイメージバイトのどちらかを選択し、Rc(SEL)に書き込みます。
  • 元のバイトを復元するためのマスク付きXORRc(EOR)
  • Rcを既存のイメージに書き戻す(STR)
于 2012-09-07T21:59:31.463 に答える
2

これはもう必要ないかもしれませんが、同様のアルゴリズムを必要とする可能性のある新規参入者のために、私が提案することは次のとおりです。

持っている

  • VALUE_4:4バイトVALUE(4バイトすべてに複製されたバイト)
  • SRC:4イメージバイト
  • DST:4宛先バイト

USUB8の厳密な比較を使用すると(GEは「<0」を意味するので、GEは「<0」を意味しません):

  • USUB8(SRC、VALUE_4)=>GEビットを設定
  • DST = SEL(DST、SRC)=>値がVALUEよりも厳密に劣るSrcからバイトを選択します
  • USUB8(VALUE_4、SRC)
  • DST = SEL(DST、SRC)=>値がVALUEよりも厳密に優れているSrcからバイトを選択します

ループは、7つの操作(2つのロード、1つのストア、2つのUSUB8、2つのSEL)とループ管理で構成されます。

于 2014-12-22T07:42:08.560 に答える