countersince January 6, 2001X68000 LIBRARYEnglish
更新日: 2016 年 8 月 18 日
X68000 LIBRARY > ソフトウェアライブラリ > 特定のハードウェア用のソフトウェア > 060turbo 関連 > 060turbo.sys > 68060を斬る!!(第2回)

68060を斬る!!(第2回)

説明

MC68060 の解説記事です。月刊電脳倶楽部 117 号(1998 年 2 月号)から 139 号(1999 年 12 月号)にかけて読み物横町で不定期連載していました。転載にあたって内容の再考証は行っていません。ご了承下さい。

68060_02.txt
────────────────────────────────────

                          68060を斬る!!

                                 第2回
                                                                鎌田誠
────────────────────────────────────

  前回は 68060 の命令フェッチパイプラインと分岐予測について、それから命

令実行パイプラインについても説明しました。68060 のパイプラインについて思

い出しておきましょう。


    68060 の命令フェッチパイプライン

        (a1) 命令のアドレスを計算する
        (a2) 可変長の命令をメモリから取り出す(命令フェッチ)
        (a3) 命令の種類を調べる(アーリーデコード)
        (a4) 命令を命令バッファに入れる


    68060 の命令実行パイプライン

        (b) FIFO から固定長の命令を取り出して種類を調べる(フルデコード)
        (c) 使用するデータのアドレス(実効アドレス)を計算する
        (d) 使用する整数データを読み出す(データフェッチ)
        (d') 使用する浮動小数点数データを読み出す(データフェッチ)
        (e) 整数演算を行う
        (e') 浮動小数点演算を行う
        (f1) 結果をまとめる
        (f2) 結果を書き戻す


━───────────────────────────────────

●スーパースカラ(superscalar)

  前回、68060 の整数ユニットには (b)(c)(d)(e) の 4 段の命令実行パイプラ

インが 2 本あるということを書きましたが、このように複数のパイプラインを

持ったアーキテクチャをスーパースカラと呼びます。

  簡単に言うと、スーパースカラアーキテクチャの CPU は、連続して実行する

命令を空いているパイプラインに次々に放り込んで実行します。このとき、パ

イプラインが 1 本の場合と比較するとパイプラインが 2 本あれば効率が 2 倍

になることが期待されますが、実際にはどうしても同時には実行できない命令の

組み合わせがあるので、パイプラインが 2 本あるからといって 1 本の場合の 2

倍の速さで動作するわけではありません。

  68060 の命令実行パイプラインは、メインの pOEP(primary Operand

Execution Pipeline)と、サブの sOEP(secondary Operand Execution

Pipeline)の 2 本です。primary と secondary というふうに区別していること

からわかるように、通常は pOEP を使い、条件を満たした命令に限って sOEP が

使用されることになっています。言い換えると、pOEP はすべての命令を処理す

ることができて、sOEP は一部の整数命令を補助的に処理します。68060 の命令

実行パイプラインをロケットに例えるなら、pOEP がメインエンジンで、sOEP が

補助エンジン(ブースターっていうのかな?)といったところでしょうか。子供

の自転車になら前輪が命令フェッチパイプラインで後輪が pOEP、補助輪が sOEP

かな。

  直後に実行する命令を sOEP に入れられるかどうか調べることをディスパッチ

テスト(dispatch test)、条件を満たした命令を sOEP に入れることをスーパ

ースカラディスパッチ(superscalar dispatch)あるいは単にディスパッチと呼

びます。

  ディスパッチテストでは全部で 6 種類の条件を調べます。これらは 68060 の

内部の構造と密接に関係しているため完全に説明することは難しく、筆者も完璧

に理解しているわけではないことをあらかじめお断りしておきます。続いてディ

スパッチテストの内容を説明します。


━───────────────────────────────────

●ディスパッチテスト(1)

  まず最初に、sOEP に与える命令とそのオペランドが、命令バッファに準備で

きていることを確かめます。このとき sOEP に入れることができるのは、命令ワ

ードが 16 ビットでオペランドワードが 32 ビットまでの命令です。

  この条件から必然的に、sOEP に与える命令について命令キャッシュがヒット

する必要がでてきます。外部に 2 次キャッシュのようなめっぽう速いメモリを

付けているときはその限りではないかもしれません(命令バッファが FIFO なの

で、pOEP の命令の処理に時間がかかっていれば多少余裕がある)。


━───────────────────────────────────

●ディスパッチテスト(2)

  pOEP に入れた命令と sOEP に入れようとしている命令の種類を見て、同時に

実行できる命令の組み合わせかどうか調べます。ここでは、68060 のすべての命

令を次の 4 種類に分類して考えます。


    ・pOEP|sOEP

          pOEP と sOEP のいずれでも動作し、pOEP で動作する場合に

        は同時に sOEP に pOEP|sOEP の命令が入ることが許されてい

        る命令です。単純な転送と整数演算、論理演算、シフト・ロー

        テート命令などがこれに分類されます。


    ・pOEP-but allows-sOEP

          pOEP だけで動作するが、同時に sOEP に pOEP|sOEP の命令

        が入ることが許されている命令です。浮動小数点命令はこれに

        分類されます。


    ・pOEP-until-last

          pOEP だけで動作する複数クロックの命令で、この命令の最

        後 1 クロックに限って sOEP に pOEP|sOEP の命令が入ること

        が許されている命令です。メモリ-メモリ転送、イミディエイ

        ト、ビット操作命令などがこれに分類されます。


    ・pOEP-only

          pOEP だけで動作し、この命令の動作中は sOEP が使えなく

        なる命令です。上記以外の命令がこれに分類されます。


  この分類に従い、以下の組み合わせでなければ 2 番目の命令を sOEP に入れ

ることはできません。

          ┌───────────┬───────────┐
          │     1 番目の命令     │     2 番目の命令     │
          ├───────────┼───────────┤
          │pOEP|sOEP             │pOEP|sOEP             │
          │                      │                      │
          │pOEP-but allows-sOEP  │pOEP|sOEP             │
          │                      │                      │
          │pOEP-until-last       │pOEP|sOEP             │
          └───────────┴───────────┘

  なお、アドレッシングモードによって条件が異なる命令もありますので、細か

い分類については分類表を参照して下さい。

  この条件を考慮して、複雑な命令の後に単純な整数命令を配置するように工夫

することが大切です。


━───────────────────────────────────

●ディスパッチテスト(3)

  一部のアドレッシングモードを使用した命令は sOEP に入れることができませ

ん。具体的には、ベースディスプレースメントを伴うアドレスレジスタ間接アド

レッシング「(bd,An,Xi*SF)」または、プログラムカウンタ相対アドレッシング

「(d16,PC)」「(d8,PC,Xi*SF)」「(bd,PC,Xi*SF)」を使用している命令は sOEP

に入れることができません。

  この条件を考慮して、無闇に PC 相対アドレッシングを使うのはやめましょう。

ベースディスプレースメントは 68000 で使えないのであまり多用しているプロ

グラムはないと思いますが、プログラムを手で 68060 用に最適化するときには

なるべく使わないようにしたほうが効率がよくなります。


━───────────────────────────────────

●ディスパッチテスト(4)

  68060 のデータキャッシュは、1 クロックで 1 つのオペランドしか参照でき

ません。つまり、pOEP がメモリを参照するような命令を実行しているときは、

sOEP にメモリを参照する命令を入れることができません。つまり、いくらデー

タキャッシュがヒットしたとしても、メモリを参照する命令を 2 つ並べて書い

たときその 2 つの命令は同時に実行されません。


━───────────────────────────────────

●ディスパッチテスト(5)

  pOEP の結果で得られるレジスタの内容を次の命令のオペランドのアドレッシ

ングのベースまたはインデックスレジスタとして使用しなければならないとき、

その命令は sOEP で実行できません。1 番目の命令の結果を 2 番目の命令で必

要としているわけですから、その 2 つの命令を同時に実行できないのは当然と

言えます。

    同時に実行できない命令の例:

                ADDQ.L  #4,A0
                MOVE.L  (A0),D0


━───────────────────────────────────

●ディスパッチテスト(6)

  pOEP の結果で得られるレジスタの内容を次の命令のオペランドとして使用し

なければならないとき、その命令は sOEP で実行できません。これも当然と言え

ば当然です。(5)と分けてあるのは、アドレッシングモードとして使う場合と

データとして使う場合では CPU の内部のデータの流れが違うためです。プログ

ラムを書く上では、この違いはあまり気にしなくてもよいと思います。

    同時に実行できない命令の例:

                ASL.L   #4,D0
                ADD.L   D0,D1

★★★

  さて、ここからが重要です。実はこのディスパッチテストには例外があるので

す。68060 の内部では MOVE 命令とレジスタまわりに怒濤の細工がしてあるらし

く、次の組み合わせの命令は pOEP の結果を sOEP で使用しなければならないに
                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
も関わらず同時に実行されます(こうなってくると、同時というよりもむしろ 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
つの命令として実行されると言ったほうがわかりやすいかもしれません)。

    ・1 番目が「MOVE.L ?,Rx」で、2 番目が Rx を入力に使う命令のとき

        同時に実行できる命令の例:

                MOVE.L  (A0),D0
                ADD.L   D0,D1           →      D1+=(D0=[A0])

    ・1 番目が「?.L ?,Dx」で、2 番目が「MOVE.L Dx,<mem>」のとき

        同時に実行できる命令の例:

                ADD.L   D1,D0
                MOVE.L  D0,(A0)         →      [A0]=(D0+=D1)


━───────────────────────────────────

        質問箱

────────────────────────────────────

  引き続き質問を募集しています。


━───────────────────────────────────

        68060 関連の話題

────────────────────────────────────

● XL/Image

  gnulib や libc のコードが遅そうだったので xlim030.x を逆アセンブルして

改造して xlim060.x を作ってみたら、1 割以上速くなりました。ちゃんちゃん。


● 060turbo が少し速くなったゾ

  自分が持ち歩いている 060turbo の ISP を「AS ぶった切り EDO 専用 ISP」

に書き換えてもらったら、少し速くなりました。具体的には、AS のタイミング

を切り詰めて、ハイメモリのライン転送の所要クロック数を 6-3-3-3 から

6-2-2-2 にしたものです。書き換え前の xlim030.x のレンダリング速度と比べ

ると、xlim060.x の改造の効果も合わせて、XL/Image が最大で 2 割くらい速く

なったようです。

  ちなみに 68060 のライン転送の限界速度は 2-1-1-1 です。この 1 は 50MHz

の 1 クロックだから 20ns です。みんな、頑張れー。(意味不明)


● mpeg2play.x

  MPEG-2 プレイヤー。ソースを拾ってきてコンパイルしたら、なんとなく動い

てしまった。でも遅いのね。All C だし。060turbo でさえ本来の速度の半分も

出てないや。やっぱ、アセンブラレベルで最適化しなきゃダメみたい。


(EOF)