萌えハッカーニュースリーダー

2025/10/04 05:51 Optimizing a 6502 image decoder – part II: assembly

出典: https://www.colino.net/wordpress/en/archives/2025/10/03/optimizing-a-6502-image-decoder-part-ii-assembly/
hakase
博士

やっほー、ロボ子!今日も元気じゃな?

roboko
ロボ子

はい、博士!今日もITの知識をアップデートする準備万端です!

hakase
博士

今日はね、メモリ配置からハフマン復号まで、盛りだくさんの最適化テクニックについて話すぞ!

roboko
ロボ子

最適化、奥が深いですよね。最初のメモリ配置から見ていきましょう。バッファをページ境界に揃えるって、どういうことですか?

hakase
博士

ふむ、ページを跨ぐ時のペナルティを避けるためじゃ!アドレスのパッチ適用も、ページバイトだけで済むからの。

roboko
ロボ子

なるほど!データ型も重要なんですね。16ビット演算より8ビット演算の方が速い、と。

hakase
博士

そう!「16ビット演算は8ビット演算より2-3倍遅い」から、8ビットで済むなら8ビットを使うのが吉!

roboko
ロボ子

関数パラメータもレジスタ渡しの方が速いんですね。スタックを使うと遅くなる、と。

hakase
博士

その通り!例えば、「val = (val_from_last[last] * factor) >> 4;」の計算を、レジスタからパラメータを受け取る乗算関数をインライン展開して高速化するんじゃ。

roboko
ロボ子

インライン展開も効果的なんですね。`jsr shrax4` をインライン展開すると速くなる、と。

hakase
博士

`jsr shrax4`は12サイクルもかかるから、展開する価値あり!

roboko
ロボ子

ルックアップテーブルもよく使われるテクニックですよね。特に右シフト4 (`>> 4`) のような処理に有効なんですね。

hakase
博士

そうじゃ!「速度向上のため、コードサイズが大きくなるが、ルックアップテーブルを使用」するんじゃ!

roboko
ロボ子

スタックパラメータの回避も重要なんですね。16ビット整数を扱う関数で、cc65コンパイラがスタックを使う代わりにゼロページを使う、と。

hakase
博士

賢い!それから、「val = factor << 7」を`asl/rol`のペアを7回繰り返す代わりに、ビット操作で高速化するのもテクニックじゃ。

roboko
ロボ子

自己書き換えコードも面白いですね。頻繁に使用される値をコードに直接書き込むことで、ロード時間を削減する、と。

hakase
博士

そう!「lda factor」を「#$FF」に書き換えるんじゃ!

roboko
ロボ子

分岐予測も最適化に影響するんですね。条件分岐が予測できる場合、分岐の方向を最適化する、と。

hakase
博士

配列のインデックスが256を超える場合の処理を最適化すると、1サイクル削減できるぞ。

roboko
ロボ子

16ビットバッファの分割も、アクセスを高速化するテクニックなんですね。

hakase
博士

そう!下位バイトと上位バイトの2つの配列に分割するんじゃ。

roboko
ロボ子

ポインタのハードコードも、間接アドレッシングのオーバーヘッドを削減するために有効なんですね。

hakase
博士

データの観察も重要じゃ。「val」が255になることが多い場合、乗算をシフト演算に置き換えるんじゃ。

roboko
ロボ子

近似も使えるんですね。最終的なピクセル値を計算する際の除算を、逆数乗算/シフト法で近似する、と。

hakase
博士

除算係数が48になることが多い場合、静的なdiv48テーブルを使うんじゃ。

roboko
ロボ子

ハフマン復号の最適化も、スキップ時にはコードの検出のみを行うように特化するんですね。

hakase
博士

最後に、チェックの省略!入力データの検証を省略して、処理速度を優先するんじゃ。

roboko
ロボ子

でも、データが無効な場合、画像が乱れるかクラッシュする可能性があるんですよね?

hakase
博士

そう!でも、速さが正義なのじゃ!…って、冗談だぞ!

roboko
ロボ子

博士、お茶目さんですね!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search