(57)【要約】部分的なビットの入替えインストラクションが、マイクロプロセッサ又はマイクロコントローラにおいて提供される。部分的なビットの入れ替えは、ディスティネーション指示子、前の部分的な値のソース、ディスティネーション・サブセット指示子、及び制御指示子のうちの１つ以上によって指定される。マイクロプロセッサ又はマイクロコントローラ内のアレイ・ユニット（３０３０）は、２つの並列の乗算器（Ｍａｒｒａｙ４１００及びＭＰａｒｒａｙ４２００）、並びに入替ロジック（４３００）を含む。第１のアレイであるＭａｒｒａｙ（４１００）は、算術乗算を実行する。Ｍａｒｒａｙ（４１００）は、Ａｃｃ１（３０３１）、Ａｃｃ２（３０３２）、Ｍ（３０３３）及びｓｅｌ（３０３４）を入力として用いて、ＲｅｓｕｌｔＣ及びＲｅｓｕｌｔＳを出力として生成する。第２のアレイであるＭＰａｒｒａｙ４２００は、２進の多項式乗算を実行する。入替ロジック（４３００）は、ＲＴｈｏｌｄ（３０１２）内の値に基づいて、ＲＳｈｏｌｄの下位ビット上で、様々な入れ替えを実行するために使用される。
2004524621.tif 000002
【特許請求の範囲】
【請求項１】
インストラクション・セット・アーキテクチャ内で、部分的なビットの入れ替えを実行するためのインストラクションであって、インストラクション・セット・アーキテクチャの一部であるインストラクションにおいて、
部分的入替のインストラクションとしてインストラクションを識別するオペレーション・コードと、
入替オペレーションの仕様であって、
ディスティネーション・レジスタを識別するディスティネーション指示子と、
部分的な値のソース指示子と、
ディスティネーション・レジスタの１つ以上のディスティネーション・ビットを識別するディスティネーション・サブセット指示子と、
ディスティネーション・サブセット指示子によって識別される１つ以上のディスティネーション・ビットの各々に関するソースを識別する制御指示子と
を含む入替オペレーション仕様と
を含み、
インストラクションが、入替オペレーション仕様によって定義される部分的なビットの入れ替えを実行することによって処理される
ことを特徴とするインストラクション。
【請求項２】
請求項１記載のインストラクションにおいて、ディスティネーション指示子がディスティネーション・レジスタを絶対的に識別することを特徴とするインストラクション。
【請求項３】
請求項２記載のインストラクションにおいて、ディスティネーション・レジスタが乗算ユニット・アキュムレータを含むことを特徴とするインストラクション。
【請求項４】
請求項１記載のインストラクションにおいて、ディスティネーション指示子が明示的に汎用レジスタを指定することを特徴とするインストラクション。
【請求項５】
請求項１記載のインストラクションにおいて、部分的な値のソース指示子が部分的な値のソースレジスタを絶対的に識別することを特徴とするインストラクション。
【請求項６】
請求項５記載のインストラクションにおいて、部分的な値のソース・レジスタが乗算ユニット・アキュムレータを含むことを特徴とするインストラクション。
【請求項７】
請求項１記載のインストラクションにおいて、部分的な値のソース指示子が明示的に汎用レジスタを指定することを特徴とするインストラクション。
【請求項８】
請求項１記載のインストラクションにおいて、ディスティネーション指示子及び部分的な値のソース指示子が各々、同じレジスタを識別することを特徴とするインストラクション。
【請求項９】
請求項８記載のインストラクションにおいて、識別されたレジスタが汎用レジスタを含むことを特徴とするインストラクション。
【請求項１０】
請求項８記載のインストラクションにおいて、識別されたレジスタが乗算ユニット・アキュムレータを含むことを特徴とするインストラクション。
【請求項１１】
請求項１記載のインストラクションにおいて、ディスティネーション・サブセット指示子が、ディスティネーション・レジスタ内のビットの連続するブロックを識別することを特徴とするインストラクション。
【請求項１２】
請求項１１記載のインストラクションにおいて、ビットの連続するブロックが、ディスティネーション・レジスタの最下位ビットを含むことを特徴とするインストラクション。
【請求項１３】
請求項１２記載のインストラクションにおいて、ビットの連続するブロックが１２個以下のビットを含むことを特徴とするインストラクション。
【請求項１４】
請求項１記載のインストラクションにおいて、制御サブセット指示子が１つ以上のソース・ビット識別子を含むことを特徴とするインストラクション。
【請求項１５】
請求項１４記載のインストラクションにおいて、制御サブセット指示子がさらに、
入替データを受け取るためにビットを選定するマスクと、
入替データを受け取るためにマスクによって選定されていないビットに割り当てられるデフォルト値を識別するデフォルト・ビットと
を含むことを特徴とするインストラクション。
【請求項１６】
請求項１４記載のインストラクションにおいて、１つ以上のソース・ビット識別子の各々が、インストラクション内のフィールドであることを特徴とするインストラクション。
【請求項１７】
請求項１４記載のインストラクションにおいて、１つ以上のソース・ビット識別子の各々が制御レジスタに格納され、制御レジスタが制御指示子によって識別されることを特徴とするインストラクション。
【請求項１８】
請求項１記載のインストラクションにおいて、インストラクション・セットがＲＩＳＣインストラクション・セットを含むことを特徴とするインストラクション。
【請求項１９】
インストラクションを用いて部分的なビットの入れ替えを実行するための方法において、
データ・ストアからオペレーションを実行するためのインストラクションを取り出すステップと、
１つ以上のレジスタを読み取るステップと、
インストラクションによって指定されるオペレーションを実行するステップと
を含み、
インストラクションは、
部分的入替えのインストラクションとしてインストラクションを識別するオペレーション・コードと、
入替オペレーションの仕様であって、
ディスティネーション・レジスタを識別するディスティネーション指示子と、
前の部分的値のソース指示子と、
ディスティネーション・レジスタの１つ以上のディスティネーション・ビットを識別するディスティネーション・サブセット指示子と、
ディスティネーション・サブセット指示子によって識別される１つ以上のディスティネーション・ビットの各々に対するソースを識別する制御指示子と
を含む入替オペレーション仕様と
を備え、インストラクションが、入替オペレーション仕様によって定義される部分的なビットの入替えを実行することによって処理されることを特徴とする方法。
【請求項２０】
請求項１９記載の方法において、ディスティネーション指示子が暗黙的にディスティネーション・レジスタを識別することを特徴とする方法。
【請求項２１】
請求項２０記載の方法において、ディスティネーション・レジスタが乗算ユニット・アキュムレータを含むことを特徴とする方法。
【請求項２２】
請求項１９記載の方法において、ディスティネーション指示子が明示的に汎用レジスタを指定することを特徴とする方法。
【請求項２３】
請求項１９記載の方法において、前の部分的な値のソース指示子が、暗黙的に部分的な値のソース・レジスタを識別することを特徴とする方法。
【請求項２４】
請求項２３記載の方法において、部分的な値のソース・レジスタが乗算ユニット・アキュムレータを含むことを特徴とする方法。
【請求項２５】
請求項１９記載の方法において、前の部分的な値のソース指示子が明示的に汎用レジスタを指定することを特徴とする方法。
【請求項２６】
請求項１９記載の方法において、ディスティネーション指示子及び前の部分的な値のソース指示子はそれぞれ、同じレジスタを識別することを特徴とする方法。
【請求項２７】
請求項２６記載の方法において、識別されたレジスタが汎用レジスタであることを特徴とする方法。
【請求項２８】
請求項２６記載の方法において、識別されたレジスタが乗算ユニット・アキュムレータを含むことを特徴とする方法。
【請求項２９】
請求項１９記載の方法において、ディスティネーション・サブセット指示子が、ディスティネーション・レジスタ内のビットの連続するブロックを識別することを特徴とする方法。
【請求項３０】
請求項２９記載の方法において、ビットの連続するブロックが、ディスティネーション・レジスタの最下位ビットを含むことを特徴とする方法。
【請求項３１】
請求項３０記載の方法において、ビットの連続するブロックが１２個以下のビットを含むことを特徴とする方法。
【請求項３２】
請求項１９記載の方法において、制御サブセット指示子が１つ以上のソース・ビット識別子を含むことを特徴とする方法。
【請求項３３】
請求項３２記載の方法において、制御サブセット指示子がさらに、
入替データを受け取るためにビットを選定するマスクと、
入替データを受け取るためにマスクによって選定されていないビットに割り当てられるデフォルト値を識別するデフォルト・ビットと
を含むことを特徴とする方法。
【請求項３４】
請求項３２記載の方法において、１つ以上のソース・ビット識別子の各々が、インストラクション内のフィールドであることを特徴とする方法。
【請求項３５】
請求項３２記載の方法において、１つ以上のソース・ビット識別子の各々が制御レジスタに格納され、該制御レジスタが制御指示子によって識別されることを特徴とする方法。
【請求項３６】
請求項１９記載の方法において、インストラクションがインストラクション・セットの一部であり、該インストラクション・セットがＲＩＳＣインストラクション・セットを含むことを特徴とする方法。
【請求項３７】
ソフトウェアで具現化されたマイクロプロセッサ・コアを含むコンピュータ読み取り可能な記憶媒体において、マイクロプロセッサ・コアが部分的なビットの入替えを実行するためのインストラクションを含み、該インストラクションが、
部分的入替えのインストラクションとしてインストラクションを識別するオペレーション・コードと、
入替オペレーションの仕様であって、
ディスティネーション・レジスタを識別するディスティネーション指示子と、
前の部分的な値のソース指示子と、
ディスティネーション・レジスタの１つ以上のディスティネーション・ビットを識別するディスティネーション・サブセット指示子と、
ディスティネーション・サブセット指示子によって識別される１つ以上のディスティネーション・ビットの各々に対するソースを識別する制御指示子と
を含む入替オペレーション仕様と
を含み、
インストラクションが、入替オペレーション仕様によって定義される部分的なビットの入替えを実行することによって処理されることを特徴とする記憶媒体。
【請求項３８】
請求項３７記載のコンピュータ読み取り可能な記憶媒体において、ディスティネーション指示子が暗黙的にディスティネーション・レジスタを識別することを特徴とする記憶媒体。
【請求項３９】
請求項３８記載のコンピュータ読み取り可能な記憶媒体において、ディスティネーション・レジスタが乗算ユニット・アキュムレータを含むことを特徴とする記憶媒体。
【請求項４０】
請求項３７記載のコンピュータ読み取り可能な記憶媒体において、ディスティネーション・指示子が明示的に汎用レジスタを指定することを特徴とする記憶媒体。
【請求項４１】
請求項３７記載のコンピュータ読み取り可能な記憶媒体において、前の部分的な値のソース指示子が、暗黙的に部分的な値のソースレジスタを識別することを特徴とする記憶媒体。
【請求項４２】
請求項４１記載のコンピュータ読み取り可能な記憶媒体において、部分的な値のソースレジスタが乗算ユニット・アキュムレータを含むことを特徴とする記憶媒体。
【請求項４３】
請求項３７記載のコンピュータ読み取り可能な記憶媒体において、前の部分的な値のソース指示子が明示的に汎用レジスタを指定することを特徴とする記憶媒体。
【請求項４４】
請求項３７記載のコンピュータ読み取り可能な記憶媒体において、ディスティネーション指示子及び前の部分的な値のソース指示子がそれぞれ、同じレジスタを識別することを特徴とする記憶媒体。
【請求項４５】
請求項４４記載のコンピュータ読み取り可能な記憶媒体において、識別されたレジスタが汎用レジスタを含むことを特徴とする記憶媒体。
【請求項４６】
請求項４４記載のコンピュータ読み取り可能な記憶媒体において、識別されたレジスタが乗算ユニット・アキュムレータを含むことを特徴とする記憶媒体。
【請求項４７】
請求項３７記載のコンピュータ読み取り可能な記憶媒体において、ディスティネーション・サブセット指示子が、ディスティネーション・レジスタ内のビットの連続するブロックを識別することを特徴とする記憶媒体。
【請求項４８】
請求項４７記載のコンピュータ読み取り可能な記憶媒体において、ビットの連続するブロックが、ディスティネーション・レジスタの最下位ビットを含むことを特徴とする記憶媒体。
【請求項４９】
請求項４８記載のコンピュータ読み取り可能な記憶媒体において、ビットの連続するブロックが１２個以下のビットを含むことを特徴とする記憶媒体。
【請求項５０】
請求項３７記載のコンピュータ読み取り可能な記憶媒体において、制御サブセット指示子が１つ以上のソース・ビット識別子を含むことを特徴とする記憶媒体。
【請求項５１】
請求項５０記載のコンピュータ読み取り可能な記憶媒体において、制御サブセット指示子がさらに、
入替データを受け取るためにビットを選定するマスクと、
入替データを受け取るためにマスクによって選定されていないビットに割り当てられるデフォルト値を識別するデフォルト・ビットと
を含むことを特徴とする記憶媒体。
【請求項５２】
請求項５０記載のコンピュータ読み取り可能な記憶媒体において、１つ以上のソース・ビット識別子の各々が、インストラクション内のフィールドであることを特徴とする記憶媒体。
【請求項５３】
請求項５０記載のコンピュータ読み取り可能な記憶媒体において、１つ以上のソース・ビット識別子の各々が制御レジスタに格納され、該制御レジスタが制御指示子によって識別されることを特徴とする記憶媒体。
【請求項５４】
請求項３７記載のコンピュータ読み取り可能な記憶媒体において、インストラクションがインストラクション・セットの一部で、インストラクション・セットがＲＩＳＣインストラクション・セットを含むことを特徴とする記憶媒体。
【請求項５５】
第１の汎用レジスタ、第２の汎用レジスタ、及び拡張精度アキュムレータを保持するマイクロプロセッサ内で、部分的入替えを実行するための方法において、
所定数のオープン・ビットの位置を生成するために拡張精度アキュムレータの内容をシフトするステップと、
第１の汎用レジスタ内に保持されている情報をオープン・ビットの位置に格納するために、ビットを選定するステップと
第２の汎用レジスタから取り出されるビットをオープン・ビットの位置に格納するステップであって、上記のシフト、選定、及び格納が、単一のインストラクションに応じて生じるようにしたステップと
を含むことを特徴とする方法。
【請求項５６】
請求項５５記載の方法において、単一のインストラクションが第１及び第２の汎用レジスタを指定することを特徴とする方法。
【請求項５７】
請求項５５記載の方法において、所定数のオープン・ビットの位置が、拡張精度アキュムレータの６つの最下位ビットであることを特徴とする方法。
【請求項５８】
マイクロプロセッサ内で、部分的なビットの入れ替えを実行するためのインストラクションであって、インストラクション・セット・アーキテクチャの一部である、インストラクションにおいて、
部分的入れ替えのインストラクションとしてインストラクションを識別するオペレーション・コードと、
入替オペレーションの仕様であって、
ディスティネーション・レジスタを識別するディスティネーション指示子と、
前の部分的な値のソース指示子と、
ディスティネーション・レジスタの１つ以上のディスティネーション・ビットを識別するディスティネーション・サブセット指示子と、
ディスティネーション・サブセット指示子によって識別される１つ以上のディスティネーション・ビットの各々に対するソースを識別する制御指示子と
からなる入替オペレーション仕様と
を含み、入替オペレーション仕様によって定義される部分的なビットの入替えを実行することによって処理されることを特徴とするインストラクション。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マイクロプロセッサにおいて部分的ビット入替を実行するための技術に関する。
【背景技術】
【０００２】
産業傾向がより大きくより複雑なインストラクション・セットに傾いていくにつれ、縮小インストラクション・セットコンピュータ（ＲＩＳＣ）アーキテクチャが開発された。インストラクション・セット設計の単純化によって、ＲＩＳＣアーキテクチャは、パイプライン化（ｐｉｐｅｌｉｎｉｎｇ）及びキャッシング（ｃａｃｈｉｎｇ）等の技術の使用を容易にして、その結果、システム性能を増大させている。
ＲＩＳＣアーキテクチャは、通常、インストラクション形式に少しのバリエーションしか持たない固定長インストラクション（例えば１６ビット、３２ビット又は６４ビット）を持つ。インストラクション・セットアーキテクチャ（ＩＳＡ）の各インストラクションは、常に同じ記憶位置にソースレジスタを持つ。例えば、３２ビットのＩＳＡは、常にビット１６−２０及び２１−２５に指定されたソースレジスタを持つ。こうすることで、指定されたレジスタが、いかなる複雑なインストラクションを解読することもなく、すべてのインストラクションに対して取り出されることが可能になる。
【発明の開示】
【発明が解決しようとする課題】
【０００３】
暗号化システム（「暗号システム」）は、トランザクションを保護し、通信を暗号化し、ユーザを認証し、かつ情報を守るためにますます使用されている。
デジタル・エンクリプション・スタンダード（ＤＥＳ）のような多くの秘密鍵暗号方式は、計算が比較的単純で、かつデータのブロック上で一連のＸＯＲ、ローテーション及び入替えを実行するハードウェア・ソリューションを縮小することが可能である。
【０００４】
一観点によれば、部分的ビット入替を実行するためのインストラクションがインストラクション・セット・アーキテクチャに提供される。該インストラクションは、部分的入替のインストラクションとしてインストラクションを識別するためのオペレーション・コードと、入替オペレーション仕様とを含んでいる。入替オペレーション仕様は、ディスティネーション・レジスタを識別するディスティネーション指示子と、
前の部分的な値のソース指示子と、ディスティネーション・サブセット指定子と、制御指定子とを含んでいる。ディスティネーション・サブセット指定子は、ディスティネーション・レジスタの１または複数のディスティネーション・ビットを識別し、制御指定子は、識別されたディスティネーション・ビットの各々に関するソースを識別する。インストラクションは、入替オペレーション仕様によって定義される部分的なビットの入れ替えを実行することによって処理される。
【０００５】
実施形態においては、ディスティネーション指示子がディスティネーション・レジスタを絶対的または明示的に識別する。ディスティネーション・レジスタは、マイクロプロセッサの乗算／除算ユニット内のアキュムレータ、もしくは、汎用レジスタとして構成される。同様に、部分的な値のソース指示子は、部分的な値のソースレジスタを絶対的または明示的に識別するよう構成される。前の部分的な値のソース・レジスタは、アキュムレータ及び／又は汎用レジスタとして構成される。さらに、ディスティネーション・レジスタ及び前の部分的な値のソース・レジスタは、同一のレジスタとして構成されてもよい。
【０００６】
いくつかの実施形態においては、ディスティネーション・サブセット指定子は、ディスティネーション・レジスタ内のビットの連続するブロックを識別する。該ビットの連続するブロックは、ディスティネーション・レジスタの最下位ビットを含んでいる。種々の実施形態において、ビットの連続するブロックには１〜６又はそれ以上のビットが含まれている。
制御サブセット指示子は、１又は複数のソース・ビット識別子を含み、また、マスク及びデフォルト・ビットを含んでいる。さらに、制御サブセット指示子は、インストラクション内にフィールドとして記憶され、又は、汎用レジスタ内に記憶される。
実施形態においては、部分的入替のインストラクション・セットをＲＩＳＣインストラクション・セット内に提供する。
１以上の実施例の詳細を、添附図面及び以下において説明する。他の機能及び利点は、その説明及び図面、並びに特許請求の範囲から明白になるであろう。
【発明を実施するための最良の形態】
【０００７】
デジタル暗号化基準（ＤＥＳ）（及び、ＤＥＳに置き換えられる改良型の暗号化基準（ＡＥＳ）のいくつかの候補）等の暗号化オペレーションは、データ値のビット入替をある程度実行している。これらのオペレーションは、汎用のマイクロプロセッサのインストラクション・セットアーキテクチャに完全にはマッピングしないが、ハードウエア内に有効に具現化されている。しかしながら、National Institute of Standards and Technologyは、新しいＡＥＳ基準を作成している段階である。したがって、将来どのようなアルゴリズムが使用されるのか、明確ではない。少なくともこの点から、ブロック暗号等の暗号化アルゴリズムの実行を増大するために、ビット入替のサポート手段を有するマイクロプロセッサの提供が望まれている。
【０００８】
図１を参照して、多項式乗算を実現するために使用される典型的なマイクロプロセッサのアーキテクチャは、インストラクションがクロック・サイクル毎に発行され、かつ例えば４クロック・サイクルのような固定時間の中で実行される５段パイプラインを含む。各インストラクションの実行は、インストラクションフェッチ（ＩＦ）ステージ１００１、レジスタ読み取り（ＲＤ）ステージ１００２、算術／論理ユニット（ＡＬＵ）ステージ１００３、メモリ（ＭＥＭ）ステージ１００４、及びライトバック（書き戻し）（ＷＢ）ステージ１００５の５ステージに分割される。ＩＦステージ１００１では、指定されたインストラクションが、インストラクションキャッシュから取り出される。取り出されたインストラクションの一部が、インストラクションを実行するのに使用されるソースレジスタを指定するために使用される。読み取りレジスタ（ＲＤ）ステージ１００２では、システムが、指定されたソース・レジスタの内容を取り出す。これらの取り出された値は、ＡＬＵステージ１００３内の算術演算あるいは論理演算を実行するために使用される。ＭＥＭステージ１００４では、実行インストラクションが、データキャッシュ内のメモリを読み出し／書き込む。最後に、ＷＢステージ１００５では、インストラクションの実行によって得られた値が、レジスタにライトバックされる。
【０００９】
浮動小数点計算及び整数の乗算／除算のようないくつかの演算は、必ずしも単一クロック・サイクルで実行できるとは限らないので、いくつかのインストラクションはただインストラクションの実行を始めるためだけのものである。十分なクロック・サイクルが経過した後、別のインストラクションが結果を取り出すために使用される。例えば、整数乗算インストラクションが５つのクロック・サイクルを取る場合、１つのインストラクションが乗算計算を開始し、乗算が完成した後、別のインストラクションがその乗算の結果をレジスタに取り込む。結果が要求される時までに乗算が完了していない場合、結果が利用可能となるまで、パイプラインは時間を引き延ばす。
【００１０】
図２は、典型的なＲＩＳＣアーキテクチャを例示している。プロセッサ・コア２０００（又は「マイクロプロセッサ・コア」とも呼ばれる）は、実行ユニット２０１０、乗算／除算ユニット（ＭＤＵ）２０２０、システム制御コプロセッサ（ＣＰＯ）２０３０、メモリ管理ユニット２０４０、キャッシュ・コントローラ２０５０、及びバス・インターフェース・ユニット（ＢＩＵ）２０６０を含む。図２において、ＭＤＵ２０２０は、乗算／除算の結合ユニットであるが、乗算ユニットと除算ユニットとが別々のユニットである実施形態であってもよい。
【００１１】
実行ユニット２０１０は、プロセッサ・コア２０００内のインストラクションを実行するための主要なメカニズムである。実行ユニット２０１０は、レジスタ・ファイル２０１１及び算術論理ユニット（ＡＬＵ）２０１２を含む。１つの実施例では、レジスタ・ファイル２０１１が、例えば、スカラ整数演算及びアドレス計算に使用することができる３２個の３２ビット汎用レジスタを含む。２つの読み取りポート及び１つの書き込みポートを含むレジスタ・ファイル２０１１は、パイプライン内の演算待ち時間を最小限にするために完全にバイパスされる。ＡＬＵ２０１２は、加算、減算及びシフトのような論理と算術の両方の演算をサポートする。
【００１２】
ＭＤＵ２０２０は、３つのレジスタ（ＡＣＸ２０２１、ＨＩ２０２２、及びＬＯ２０２３）を含み、これらレジスタは種々のオペレーションに使用される。一実施形態においては、これら３つのレジスタは、一体として７２ビット値のものとして使用される。一実施形態においては、ＬＯレジスタ２０２３及びＨＩレジスタ２０２２はそれぞれ３２ビット幅であり、ＭＤＵ２０２０専用の出力レジスタとして機能する。一実施形態においては、ＡＣＸレジスタ２０２１は、ＨＩレジスタ及びＬＯレジスタによって提供される以上の完全精度の８ビットを提供する。この正確なビット数は実施形態に依存するものであるが、好適な最小サイズは２ビットである。３２ビットのデータ経路を有するプロセッサに関しては、ＡＣＸレジスタの好適な最大サイズは３２ビットである。これに対して、６４ビットのデータ経路を有するプロセッサに関しては、ＡＣＸレジスタの好適な最大サイズは６４ビットである。このため、３２ビット幅のＨＩレジスタ及びＬＯレジスタを備えたプロセッサにおいては、ＡＣＸ／ＨＩ／ＬＯの組み合わせは、連続する６４ビット以上の値を保持することができる。
ＭＤＵ２０２０は、以下に説明されるＤＩＶ、ＤＩＶＵ、ＭＡＤＤ、ＭＡＤＤＵ、ＭＦＨＩ、ＭＦＬＯ、ＭＳＵＢ、ＭＳＵＢＵ、ＭＴＨＩ、ＭＴＬＯ、ＭＵＬ、ＭＵＬＴ、ＭＵＬＴＵ、ＭＦＬＨＸＵ、ＭＴＬＨＸ、ＭＡＤＤＰ、ＭＵＬＴＰ、及びＰＰＥＲＭのようなインストラクションの幾つか又は全てを含む様々なオペレーションを実行するために使用される。
【００１３】
インストラクションＭＵＬ、ＭＵＬＴ及びＭＵＬＴＵは、２つの３２ビットの数を互いに乗算するために使用される。その結果は、ＭＵＬに対しては指定されたレジスタに、ＭＵＬＴ及びＭＵＬＴＵに対してはＨＩ／ＬＯレジスタに格納される。例えば、インストラクション「ＭＵＬ＄７、＄６、＄５」は、レジスタ＄６及び＄５の内容を互いに乗算し、その結果をレジスタ＄７に格納する。インストラクション「ＭＵＬＴ＄６、＄５」は、レジスタ＄６及び＄５の内容を互いに乗算し、その結果をＨＩ／ＬＯレジスタに格納する。ＭＵＬＴＵインストラクションは、ＭＵＬＴと同じ演算を実行するが、ＭＵＬＴＵは正負符号なしのオペランドに適応され、ＭＵＬＴは正負符号付きオペランドに適応される。さらに、ＭＵＬＴＵインストラクションは、ＡＣＸレジスタをすべてゼロにクリアする。
【００１４】
インストラクションＤＩＶ及びＤＩＶＵは、除算演算を実行し、その結果をＡＣＸ／ＨＩ／ＬＯレジスタに格納する。例えば、「ＤＩＶ＄６、＄５」は、レジスタ＄６の内容をレジスタ＄５の内容で除算し、その結果をＡＣＸ／ＨＩ／ＬＯレジスタに格納する。ＤＩＶＵインストラクションは、その同じ演算を、正負符号なしのオペランド上で実行する。
【００１５】
インストラクションＭＳＵＢ、ＭＳＵＢＵ、ＭＡＤＤ、及びＭＡＤＤＵは、２つのレジスタの内容を乗算し、次に、ＡＣＸ／ＨＩ／ＬＯレジスタの内容を加算するか、減算するために使用される。例えば、「ＭＳＵＢ＄６、＄５」は、レジスタ＄６及び＄５の内容を互いに乗算し、その結果からＡＣＸ／ＨＩ／ＬＯレジスタの内容を減算し、次に、その値をＡＣＸ／ＨＩ／ＬＯレジスタに格納する。ＭＡＤＤインストラクションは、同様に２つのレジスタの内容を乗算し、その結果をＡＣＸ／ＨＩ／ＬＯレジスタに加算し、その結果をＡＣＸ／ＨＩ／ＬＯレジスタに格納する。ＭＳＵＢＵ及びＭＡＤＤＵは、正負符号なしのオペランド上で、同じ演算を実行する。いくつかの実施例では、ＡＣＸレジスタがいくつかの演算で使用されず、そのような演算に付随するＡＣＸレジスタの内容は定義されない。
【００１６】
ＭＦＨＩ、ＭＦＬＯ、ＭＴＨＩ、ＭＴＬＯ、ＭＦＬＨＸＵ、及びＭＴＬＨＸインストラクションは、ＡＣＸ／ＨＩ／ＬＯレジスタと汎用レジスタとの間で、データを移動するために使用される。第１のインストラクションＭＦＨＩは、ＨＩレジスタの内容を汎用レジスタに取り込む。例えば、「ＭＦＨＩ＄５」は、ＨＩレジスタの内容をレジスタ＄５に取り込む。同様に、ＭＦＬＯは、ＬＯレジスタの内容を汎用レジスタに取り込む。反対に、インストラクションＭＴＨＩ及びＭＴＬＯは、汎用レジスタの内容をＨＩ又はＬＯのレジスタに取り込むために使用される。例えば、「ＭＴＨＩ＄５」は、レジスタ＄５の内容をＨＩレジスタに取り込む。
【００１７】
１つの実施例では、ＡＣＸレジスタの内容は、ダイレクトにアクセス可能ではない。ＡＣＸレジスタに間接的にアクセスするために、ＡＣＸ／ＨＩ／ＬＯレジスタに格納された値は、左又は右へシフトされる。例えば、「ＭＦＬＨＸＵ＄５」は、ＬＯレジスタの内容をレジスタ＄５に取り込んで、ＡＣＸ、ＨＩ及びＬＯレジスタの内容を１レジスタ位置だけ右へシフトさせる。従って、そのオペレーションが実行された後は、ＡＣＸレジスタはゼロで、ＨＩレジスタはＡＣＸレジスタの前の内容を保持し、ＬＯレジスタはＨＩレジスタの前の内容を保持し、＄５レジスタはＬＯレジスタの前の内容を保持する。８ビットのＡＣＸレジスタの内容が３２ビットのレジスタに取り込まれるので、８ビットの値は、ＨＩレジスタを取り込む前に、３２ビットにゼロ拡張される。
【００１８】
ＭＴＬＨＸは逆の演算を実行する。例えば、「ＭＴＬＨＸ＄５」は、ＨＩレジスタの前の内容をＡＣＸレジスタに取り込み、ＬＯレジスタの前の内容をＨＩレジスタに取り込み、＄５レジスタの内容をＬＯレジスタに取り込む。
【００１９】
ＰＰＥＲＭ演算は、レジスタ中で指定されるような入替えを実行し、その結果をＡＣＸ／ＨＩ／ＬＯレジスタに格納する。例えば、「ＰＰＥＲＭ＄５、＄６」は、ＡＣＸ／ＨＩ／ＬＯレジスタを６ビット左にシフトさせる。それから、レジスタ＄６によって指定されるように、下位６ビットがレジスタ＄５から選定される。ＡＣＸ／ＨＩ／ＬＯレジスタの下位ビットを満たすために、レジスタ＄５のどのビットが使用されるかを選定するために、レジスタ＄６の３２ビットの内容が用いられる。レジスタ＄５には３２ビットがあるので、３２ビットのうちの特定の１つを指定するためには５ビットが必要とされる。例えば、「０１１０１」は、数１３に対する２進数である。従って、これらの５つのビットは、ビット１３を指定する。同様に、「０００００」は０に対する２進数で、「１１１１１」は３１に対する２進数である。従って、３２ビットはすべて、５ビットの指定子（スペシファイア）を用いて指定され、６ビットは３０ビット（すなわち６つの５ビット指定子）を用いて指定される。
【００２０】
レジスタ＄６は、以下のようにＡＣＸ／ＨＩ／ＬＯの下位ビットを満たすために使用される＄５のビットを指定する。つまり、ビット０−４はビット０のソースを指定するために使用され、ビット５−９はビット１を指定するために使用され、ビット１０−１４はビット２を指定するために使用され、ビット１５−１９はビット３を指定するために使用され、ビット２０−２４はビット４を指定するために使用され、そしてビット２５−２９はビット５を指定するために使用される。残りのビット３０−３１は未使用である。従って、説明されたようなし指定子を使用して、＄５レジスタからの指定されたビットでＬＯレジスタの最下位の６ビットを満たすためのインストラクションが実行される。
【００２１】
最後に、ＭＵＬＴＰは２進の多項式乗算を実行するために使用され、ＭＡＤＤＰは２進の多項式乗算を実行してその結果をＡＣＸ／ＨＩ／ＬＯレジスタに加算するために使用される。これらの演算はＭＵＬＴ及びＭＡＤＤに類似しているが、２進の多項式オペランド上で作動する。
【００２２】
ＭＵＬＴＰ及びＭＡＤＤＰの多項式のオペランドは、３２ビットのレジスタ内にコード化され、このとき、各ビットは多項式の係数を表す。例えば、多項式「ｘ４＋ｘ＋１」は、ｘ３及びｘ２の係数が「０」で、残りの係数が「１」であるので、「１００１１」としてコード化される。ＭＵＬＴＰインストラクションは、２つのオペランド上で２進の多項式乗算を実行する。例えば、
（ｘ４＋ｘ＋１）（ｘ＋１）＝ｘ５＋ｘ４＋ｘ２＋２ｘ＋１
多項式をモジュロ２で減じると、ｘ５＋Ｘ４＋ｘ２＋１を生じる。多項式が上記の２進の表現でコード化される場合、同じ乗算が、（１００１１）（１１）＝１１０１０１として表わされる。
【００２３】
ＭＡＤＤＰインストラクションは、ＭＵＬＴＰのように乗算を実行して、その結果をＡＣＸ／ＨＩ／ＬＯレジスタに加算する。多項式加算はビットＸＯＲを使用して実行される。例えば、２進の多項式加算（ｘ４＋ｘ＋１）＋（Ｘ＋１）は、ｘ４＋２ｘ＋２となる。係数をモジュロ２で減じると、「１００００」として表わされるｘ４となる。
【００２４】
図３を参照すると、ＭＤＵ２０２０は、２つの３２ビットのオペランドＲＳ及びＲＴを受け取る。これらのオペランドを使用して、ＭＤＵ２０２０は要求された演算を実行し、レジスタＡＣＸ２０２１、ＨＩ２０２２、及びＬＯ２０２３に結果を格納する。これらの演算を実行するために使用される主要なデータ経路は、図３で示される。ＲＳｈｏｌｄ（ＲＳホールド）レジスタ３０１０及びＲＴｈｏｌｄ（ＲＴホールド）レジスタ３０１２は、ＲＳ及びＲＴのオペランドを保持するために使用される。マルチプレクサ３０２０、３０２２及び３０２４は、ＲＳ及びＲＴオペランドをダイレクトに使用するべきか、ＲＳｈｏｌｄレジスタ３０１０及びＲＴｈｏｌｄレジスタ３０１２に格納された値を使用するべきであるかどうかを選定するために使用される。なお、マルチプレクサ３０２２は、ＲＴの下位及び上位ビット、又はＲＴｈｏｌｄレジスタ３０１２に格納された値、の間の選定を行うために使用される。
【００２５】
ＲＴｈｏｌｄレジスタ３０１２は、マルチプレクサ３０２２に接続される。マルチプレクサ３０２２は、ＲＴｈｏｌｄ３０１２の上位ビット、ＲＴｈｏｌｄ３０１２の下位ビット、ＲＴオペランドの上位ビット、又はＲＴオペランドの下位ビットを選定することにより１６ビットの結果を生じる。マルチプレクサ３０２２からの出力は、ブース・レコーダ（ｂｏｏｔｈ  ｒｅｃｏｄｅｒ）３０４０によって処理され、レジスタＲＴＢ３０４２に格納される。ブース・レコーディング（ｂｏｏｔｈ  ｒｅｃｏｄｉｎｇ）は、マルチプライヤアレイが、正負符号付きオペランドと正負符号なしオペランドを同様に処理することを可能にする技術である。レジスタＲＩＢ３０４２の出力は、アレイ・ユニット３０３０への入力ＳＥＬ３０３４になる。
【００２６】
アレイ・ユニット３０３０は、図４に関連して以下に説明されるような算術乗算及び２進の多項式乗算を実行するために使用される。アレイ・ユニット３０３０は、入力として、ＡＣＣ１  ３０３１、ＡＣＣ２  ３０３２、Ｍ３０３３、ＳＥＬ３０３４、及びＲＴｈｏｌｄ３０１２を得る。入力ＡＣＣ１  ３０３１及びＡＣＣ２  ３０３２は、乗算を実行し、その結果の値を、累計された結果に加算又は減算を実行する演算用に使用される累計された結果である。入力ＳＥＬ３０３４（レジスタＲＴＢ３０４２によって決定される）、及びＭ３０３３（レジスタＲＳｈｏｌｄ  ３０１０によって決定される）は、算術演算のためのオペランドを形成する。入力ＲＴｈｏｌｄ３０１２（あるいはＲＴｈｏｌｄ３０１２の上位又は下位ビット）及びＭ３０３３（ＲＳｈｏｌｄ３０１０によって決定される）は、多項式演算及び入替え用のオペランドを形成する。これらの入力の組合せは、詳細に下に説明されるような様々な計算を実行するために使用される。
【００２７】
アレイ・ユニット３０３０はまた、２つの出力であるＲｅｓｕｌｔＣ  ３０３５及びＲｅｓｕｌｔＳ３０３６を含む。算術演算を実行する際に、桁上げ保留（キャリー・セーブ）加算器（ＣＳＡ）が乗算アレイを構築するために使用される。桁上げ保留加算器は、２つの出力を生成するために合計と桁上を別々に計算する。従って、ＲｅｓｕｌｔＣ  ３０３５及びＲｅｓｕｌｔＳ  ３０３６は、それぞれ、ＣＳＡマルチプライヤアレイの桁上出力及び合計出力を表す。１つの実施例では、ＡＣＣ１  ３０３１、ＡＣＣ２  ３０３２、ＲｅｓｕｌｔＣ  ３０３５、及びＲｅｓｕｌｔＳ  ３０３６が、各々７２ビット長で、残りの入力は多くても３２ビット長である。入力ＡＣＣ１  ３０３１及びＡＣＣ２  ３０３２は、マルチプレクサ３０３７及び３０３８を用いて選定される。
【００２８】
マルチプレクサ３０５０及び３０５２は、レジスタＣＰＡＡ  ３０５４及びＣＰＡＢ３０５６への入力としての値を選定するために使用される。例えば、マルチプレクサ３０５０は、ＲｅｓｕｌｔＣ  ３０３５、ＣＰＡ  ３０５８の出力、又はマルチプレクサ３０２０（つまりオペランドＲＳ若しくはＲＳｈｏｌｄ３０１０）の出力、を選定するために使用される。同様に、マルチプレクサ３０５２は、ＲｅｓｕｌｔＳ３０３６、値ゼロ、及びマルチプレクサ３０２４（つまり、オペランドＲＴ、若しくはＣＰＡＡ  ３０５４及びＣＰＡＢ  ３０５６の出力）の出力の間を選定するために使用される。これらのレジスタは、桁上げ伝搬（キャリー・プロパゲイト）加算器（ＣＰＡ）３０５８への入力を格納する。ＣＰＡ３０５８は、乗算演算（乗算）を完了し、また以下に説明されるような反復除算演算（除算）を実行するために使用される。
【００２９】
レジスタＲＤＭ３０６０は、ＣＰＡ３０５８の結果出力を格納する。最後に、マルチプレクサ３０７０及び３０７２は、どの値が、レジスタＡＣＸ、ＨＩ及びＬＯに取り込まれるべき結果を形成するかを選定する。マルチプレクサ３０７０は、ＡＣＸ／ＨＩ／ＬＯレジスタか、ＲＤＭ３０６０か、又は、ＣＰＡ３０５８の結果かを選定するために使用される。マルチプレクサ３０７２は、マルチプレクサ３０７０によって選定された結果の様々な入替えを、代わりに取り込むために使用される。マルチプレクサ３０７２は、（連結されると７２ビット値を形成する）次のような値の選定を可能にすることによって、ＡＣＸ／ＨＩ／ＬＯレジスタの様々なロテーション及び取り込みを実行するために使用される。次のような値とは、（１）マルチプレクサ３０７０の７２ビット出力であるａｈｌ、（２）マルチプレクサ３０７０の上位８ビット、ＲＳｈｏｌｄ３０１０の内容、及びマルチプレクサ３０７０の下位３２ビットであるａｒｌ、（３）マルチプレクサ３０７０の上位４０ビット及びＲＳｈｏｌｄ３０１０の内容であるａｈｒ、（４）マルチプレクサ３０７０の下位４０ビット及びＲＳｈｏｌｄ３０１０の内容であるｈｌｒ、（５）マルチプレクサ３０７０（３２個の先行ゼロを備えた）の上位４０ビットである０ａｈ、である。
【００３０】
いくつかのオペレーション（演算）により、結果用のレジスタＡＣＸ、ＨＩ及びＬＯに記憶された値が上書きされる。このため、別の結果レジスタ３０８０を用いて、該レジスタにアキュムレータＡＣＸ無しで、上位及び下位結果を格納する。
【００３１】
以下に説明されるデータ経路は、６つの主要部分、すなわち（１）入力のレジスタリング及び選定、（２）ブース・レコーディング、（３）マルチプライヤアレイ及び入替えロジック、（４）桁上げ伝搬加算器、（５）結果のレジスタリング及び選定、及び（６）結果を示すための別個の３２ビット出力レジスタ、を含む。
【００３２】
入力のレジスタリング及び選定は、ＲＳ及びＲＴオペランドを保持するためにＲＳｈｏｌｄ及びＲＴｈｏｌｄレジスタを用いて実行される。マルチプレクサは、これらのオペランドをダイレクトに使用するべきか、登録されたバージョンを使用するべきであるかどうかを選定する。ブース・レコーディングは、マルチプライヤアレイ及び入替えロジックに入力を提供するために、一度にＲＴオペランドの半分で実行される。
【００３３】
ブース・レコーディングは、マルチプライヤ・アレイが正負符号付き及び正負符号なしのオペランドを、同じものとして処理することを可能にする技術である。この技術は、次の最も高い２のべき乗からの減算としてオペランドを「レコード（ｒｅｃｏｄｅ）」する。例えば、７は、以下のようにブース・レコードされる。
８−１＝１０００２−０００１２＝１００１
ただし、１は−１を表すものとする。Ｈｅｎｎｅｓｓｙ及びＰａｔｔｅｒｓｏｎは、その全体が参考文献としてここに組み込まれるが、Ｍｏｒｇａｎ  Ｋａｕｆｍａｎｎ出版社（１９９６年）の「ＣｏｍｐｕｔｅｒＡｒｃｈｉｔｅｃｔｕｒｅ：  Ａ  Ｑｕａｎｔｉｔａｔｉｖｅ  Ａｐｐｒｏａｃｈ（コンピュータ・アーキテクチャの定量的アプローチ）」の付録Ａの中で、ブース・レコーディングについて説明している。
【００３４】
アレイ・ユニット３０３０のうちの１つのアレイは、算術乗算を実行し、またアレイ・ユニット３０３０の１つのアレイは、２進の多項式乗算を実行する。１つの実施例では、両方のアレイが３２ビット掛ける１６ビット（３２ｘ１６）で、ＲＴオペランドのサイズに依存して、一回又は二回、使用される（つまり、ＲＴが１６ビット長である場合は、適切なアレイが一回使用され、３２ビット長である場合は二回使用される）。ＣＰＡは乗算を完了するため、そして反復除算を実行するために使用される。他の実施例は、除算の実行用に、より高速のメカニズムを含む。
【００３５】
算術乗算アレイは、ここに組み込まれたＭｏｒｇａｎ  Ｋａｕｆｍａｎｎ出版社（１９９６年）の「ＣｏｍｐｕｔｅｒＡｒｃｈｉｔｅｃｔｕｒｅ：  Ａ  Ｑｕａｎｔｉｔａｔｉｖｅ  Ａｐｐｒｏａｃｈ（コンピュータ・アーキテクチャの定量的アプローチ）」の中で、Ｈｅｎｎｅｓｓｙ及びＰａｔｔｅｒｓｏｎによって記載された技術のうちの任意のものを用いて実現される。例えば、Ｈｅｎｎｅｓｓｙ及びＰａｔｔｅｒｓｏｎによる付録Ａは、演算マルチプライヤを加速するためのいくつかの方法を記載している。記載された技術のうちのいかなるものも、以下に説明される多項式乗算の拡張のための基本原理として使用可能である。
【００３６】
図４を参照すると、アレイ・ユニット３０３０は、並列の２つのマルチプライヤ（Ｍａｒｒａｙ４１００及びＭＰａｒｒａｙ４２００）、及び入替えロジック４３００を含む。第１のアレイであるＭａｒｒａｙ４１００は、図５を参照して下に説明されるような算術乗算を実行する。Ｍａｒｒａｙ４１００は、上に説明されたような入力、つまりＡＣＣ１  ３０３１、ＡＣＣ２  ３０３２、Ｍ３０３３、及びＳＥＬ３０３４を使用する。その出力は、ＲｅｓｕｌｔＣ３０３５及びＲｅｓｕｌｔＳ３０３６を含む。第２のアレイであるＭＰａｒｒａｙ４２００は、図６を参照して以下に説明されるような２進の多項式乗算を実行する。ＭＰａｒｒａｙ４２００は、上に説明されたような入力、つまりＲＴｈｏｌｄ３０１２の下位ビット又はＲＳｈｏｌｄ３０１２の上位ビット、ＲＳｈｏｌｄ３０１０、及びＡＣＣ１  ３０３１を使用する。ＭＰａｒｒａｙ４２００の出力はＲｅｓｕｌｔＣ３０３６である。最後に、入替えロジック４３００は、ＲＴｈｏｌｄ３０１２に格納された値に基づいて、ＲＳｈｏｌｄ３０１０の下位ビット上で、様々な入替えを実行するために使用される。
【００３７】
マルチプレクサ４３１０は、Ｍａｒｒａｙ４１００の出力ＲｅｓｕｌｔＳとゼロとの間で選択を行って、ＲｅｓｕｌｔＳ３０３６を提供する。マルチプレクサ４３１５及び４３２０は、Ｍａｒｒａｙ４１００によって生成されたＲｅｓｕｌｔＣ、ＡＣＣＩの２５ビットとＭＰａｒｒａｙ４２００によって生成された４７ビットのＲｅｓｕｌｔの組み合わせ、及び、入替ロジック４３００によって生成された結果の間で選択を行って、ＲｅｓｕｌｔＣ３０３５を提供する。
【００３８】
図５を参照して、Ｍａｒｒａｙ４１００は、２つの７２ビット幅のオペランドＡＣＣ１及びＡＣＣ２の加算をサポートするよう修正された、３２ビット掛ける１６ビットのウォーレス・ツリー（Ｗａｌｌａｃｅ  ｔｒｅｅ）マルチプライヤアレイである。ＡＣＣ１及びＡＣＣ２のオペランドは、７２ビット値の桁上げ保留表示を保持する。乗算を遂行するためにすでに（つまり桁上げ選択加算器（ＣＳＡ）による）加算が実行されているので、乗算の中間結果に加算されるようにするための追加の加算器が、すべてのＡＣＣ１及びＡＣＣ２に含まれる。Ｍａｒｒａｙ４１００は、桁上げ保留表示で７２ビット幅の結果を生成する。３２ｘ１６ビットが１つのサイクル当たり処理されるので、３２ｘ３２ビットの乗算には、アレイを通る２つの経路が必要である。
【００３９】
Ｍａｒｒａｙ４１００は、桁上げ保留加算器のアレイから構築されたウォーレス・ツリーとして実現される。これらのアレイの幅は変化する。この設計は、データ経路のスタイルを使用するのではなく、自動化された桁及び経路を使用して実現される。前のアレイ・パスからの累積加算値がアレイに遅れて入力されるので、累積加算値はレジスタからダイレクトに来る必要はない。ブース・レコーディングは、乗算をより効率的に処理するために、重なり合う三重項の方法を使用することにより実行される。ブース・レコーディングの出力は、−２、−１、０、１、又は２を乗じたオペランドＭを、４の各累乗に対して加算すべきかどうかを伝える。最上レベルのＣＳＡ入力上のマルチプレクサは、対応するＭの倍数を選定するために使用される。
【００４０】
Ｍａｒｒａｙ４１００は、ブース・レコーディングからの８つの積に加えて、特別な１つの部分積を累計する。後者は、マルチプレクサからの「０」及び「ｌｘ」の選択を用いて、３２ビットの正負符号なしの計算に対して使用される。ウォーレス・ツリー内では、２の補数結果を正確に累計するために、オペランドが正負符号拡張される。
【００４１】
図６を参照すると、対応する正負符号なしの算術演算と同様に、２進の多項式に基づいた乗算演算が処理される。１つの実施例では、ＭＰａｒｒａｙ４２００は、例えばＡＣＣ１というオペランド上で、排他的論理和（ＸＯＲ）を用いて加算も実行する３２ｘ１６ビット・アレイである。Ｍａｒｒａｙ４１００と同様に、３２ｘ１６ビットが１つのサイクル当たり処理されるので、３２ｘ３２ビットの乗算には、アレイを通る２つの経路が必要である。第１のサイクルでは、ＡＣＣ１はゼロ（ＭＵＬＴＰ演算に対して）又は前の結果（ＭＡＤＤＰ演算に対して）である。第２のサイクルでは、ＡＣＣ１は、第１のサイクルからの出力の上位ビットである。
【００４２】
ＭＰａｒｒａｙ４２００は、２つのオペランド（例えば、ＯｐＡ及びＯｐＢ）を乗算するが、このとき、ＯｐＡとＯｐＢの１ビットとの論理積（ＡＮＤ）を得ることにより形成される各行毎に１つのアレイを用いる。例えば、第１行は、ＯｐＡとＯｐＢのビット０との論理積である。行２は、ＯｐＡとＯｐＢのビット１との論理積である。各々の連続する行の結果は、左側に１ビットシフトされる。最後の結果は、各列の排他的論理和（ＸＯＲ）を得ることにより形成される。２進の多項式演算で加算を実行するためにビットＸＯＲが使用されるので、アキュムレータ行が、ＭＡＤＤＰのようなインストラクションをサポートするアレイＭＰａｒｒａｙ４２００に加えられる。
【００４３】
再び図１を参照する。ＭＤＵ２０２０は、パイプラインの実行ステージ１００３の第１のサイクルで計算をスタートさせる。インストラクションがパイプライン内のメモリ・ステージ１００４を通過する前に計算が完了する場合、その結果はその点で保持される。インストラクションがパイプライン内のメモリ・ステージ１００４を通過する時に演算が完了すれば、そのインストラクションがコミットされ、その結果はＡＣＸ／ＨＩ／ＬＯレジスタにダイレクトに書き込まれる。
ＭＤＵ２０２０は、環境のパイプラインから切り離されている、つまり、環境によって失速（ｓｔａｌｌ）することがない。それは、ＭＤＵ２０２０がパイプラインの失速中でもその演算を継続するということである。このようにして、多重サイクルＭＤＵ演算は、システムの失速及び（又は）他の非ＭＤＵインストラクションによって、部分的にマスクされることができる。
【００４４】
図７Ａは、３２ｘ１６ビット乗算用のＭＤＵ２０２０を通るパイプラインの流れを示す。ＲＳ及びＲＴは遅れて到着するので、第１のサイクルがブース・レコーディングに対して使用される。第２のサイクルは、アレイが実行されるところであり、第３サイクルは、ＣＰＡ３０５８が演算を完了するところである。結果はＭＦｘｘインストラクションによる読み取りに対して常にアクセス可能なので、３２ｘ１６乗算は失速することなく実行される。汎用レジスタ（ＧＰＲ）にその結果をダイレクトに戻す３２ｘ１６ＭＵＬは、１つのサイクルの間に失速する可能性がある。
【００４５】
図７Ｂを参照する。３２ｘ３２ビット乗算に対しては、アレイが２度使用され、それは３２ｘ１６ビット乗算にさらに１つのクロック・サイクルを追加する。第１のアレイ・パスがオペランドＲＴの第１の部分に対して完了しつつある時、ブース・レコーディングがオペランドの第２の部分上で実行される。従って、ブース・レコードされたＲＴの部分は、第１のパスが完了するとすぐに、アレイを通して第２のパスを始めることができる。その後、乗算結果はＣＰＡ３０５８を用いて計算される。
【００４６】
図７Ｃを参照する。単純な非回復型（ｎｏｎ−ｒｅｓｔｏｒｉｎｇ）除算アルゴリズムが正のオペランドに対して使用される。もし必要ならば、第１のサイクルはＲＳを負にするために使用される。タイミングの理由により、ＲＳが正であっても、このサイクルは実行される。次いで、３２、２５、１８、又は１０のサイクルの繰返しの加算／減算の演算が実行される。その実際の数は、正のＲＳオペランド上の先行ゼロの総数に基づく。剰余が負だったならば、最終の剰余の調整が必要となる。タイミングの理由のために、剰余調整が必要でなくても、このサイクルは実行される。最後に、商及び（又は）剰余の上で必要ならば、正負符号の調整が実行される。両方のオペランドが正の場合、このサイクルはスキップされる。
【００４７】
１つの実施例では、ターゲットのアプリケーションが高速の除算を要求する。除算の性能を増大させるために、多くの技術が使用される。例えばＳｗｅｅｎｅｙ、Ｒｏｂｅｒｔｓｏｎ、及びＴｏｃｈｅｒ（ＳＲＴ）アルゴリズム、又はそのいくつかのバリエーションが使用される。
【００４８】
図８を参照する。乗算演算は有限状態マシーンを用いて実現される。乗算はＩＤＬＥ状態８０１０で始まる。始動信号がアサートされるまで、マルチプライヤは停止状態にとどまる。その後、マルチプライヤは、オペランドＲＴが３２ビットか、又は１６ビットの値を保持しているかどうかに応じて、ＡＲＲ１状態８０２０又はＡＲＲ２Ａ状態８０３０のいずれかに移動する。１６ビットの値がＲＴに格納される場合、システムは、第１のアレイ・パスが実行される状態ＡＲＲ２Ａ  ８０３０に移動する。その後、マルチプライヤは、第２のアレイ・パスが実行される状態ＡＲＲ２Ｂ  ８０４０に移動する。１６ビットの値がオペランドＲＴに格納される場合、乗算は、状態ＡＲＲ１  ８０２０で、アレイ・ユニットを通る。
【００４９】
この実施例では、マルチプライヤがパイプライン化される。１つの乗算は、アレイ・ユニットに流され、別のものはＣＰＡに流される。従って、実行すべき追加の乗算が無い場合、マルチプライヤは、ＡＲＲｌ  ８０２０又はＡＲＲ２Ｂ  ８０４０から、状態ＣＰＡ８０５０へ移動するか、あるいは、第２の乗算を始める。もし追加の乗算が必要でない場合、マルチプライヤはＣＰＡ８０５０を通り、それからＩＤＬＥ８０１０に戻るか、又は上に説明されるような新しい乗算を始める。
【００５０】
第１の乗算がＣＰＡを通る準備ができた時に、第２の乗算が実行される準備ができたならば、マルチプライヤはＣＰＡ１  ８０６０（３２ｘｌ６乗算用の）又はＣＰＡ２Ａ  ８０７０（３２ｘ３２乗算用の）のいずれかに移動する。状態ＣＰＡ１  ８０６０では、第１の乗算がＣＰＡを通り、第２の乗算がアレイ・ユニットを通る。その後、マルチプライヤは第２の乗算を終了させるために状態ＣＰＡ８０５０に移動する。
【００５１】
第２の乗算が３２ビットの乗算である場合、状態ＣＰＡ２Ａ  ５０７０では、第１の乗算がＣＰＡを通り、第２の乗算がアレイ・ユニットを通る。その後、マルチプライヤは、３２ｘ３２の乗算を完了するために状態ＡＲＲ２Ｂ  ８０４０に移動する。このパイプラインのアプローチは、２サイクルの待ち時間で、すべてのクロック・サイクル毎に３２ｘ１６の乗算が行われることを可能にする。また、３２ｘ３２の乗算は、３サイクルの待ち時間で、クロック・サイクルの１つおきに得られる。
【００５２】
図９を参照する。反復除算演算が有限状態マシーンを用いて実現される。１つの実施例では、ＭＤＵがＩＤＬＥ状態９０１０で始まる。除算演算を始めるための信号が受信されると、ＭＤＵは、演算が正負符号付きである場合はＤＩＶ１  ９０２０へ移動するか、又は演算が正負符号なしである場合はＤＩＶ１Ｕ  ９０３０へ移動する。状態ＤＩＶ１  ９０２０及びＥＲＬＹ  ９０４０は、正負符号を必要に応じて調整して、除算用の正負符号付きオペランドを準備するために使用される。状態ＤＩＶ１Ｕ  ９０３０及びＥＲＬＹＵ  ９０５０は、正負符号なしの除算演算を準備するために使用される。状態ＥＲＬＹ  ９０４０及びＥＲＬＹＵ  ９０５０では、必要な除算の反復数を調整するために、オペランドＲＳにおいて先行ゼロが検知される。
【００５３】
反復除算が状態ＤＩＶ９０６０及びＤＩＶＵ９０７０で実行される。除算は、一連の反復する加算／減算及びシフトを用いて実行される。最後に、剰余は、状態ＲＥＭ９０８０及びＲＥＭＵ９０９０で完成される。オペランドのどちらかが負である場合、正負符号の調整が状態ＳＧＮ９１００で実行される。
【００５４】
再び図４を参照する。１つの実施例において、入替えロジック４３００が、上に説明されたＰＰＥＲＭインストラクションをサポートするために使用される。入替えロジック４３００は、ＲＴｈｏｌｄ３０１２の値に基づいて、ＲＳｈｏｌｄ３０１０の３２ビットのうちのいずれをも選定するために、使用される６つのシングル・ビット３２：１セレクタから成る。このロジックは、データ経路モジュールの中でダイレクトに実現される。
【００５５】
例えば、入替ロジック４３００は、インストラクション「ＰＰＥＲＭ＄５、＄６」を実行するために使用される。入替ロジック４３００は、どのビットをＲSｈｏｌｄ３０１０からの出力として含むべきであるかを識別するために、ＲＴｈｏｌｄ  ３０１２によって決定される６つの５ビット・セレクタを使用する。例えば、レジスタ＄５が下位ビット「０１０１０１」を保持している場合、セレクタ「０００１０」（レジスタ＄６の下位ビットに対応する）は、「１」を保持しているビット２（つまり右から３番目のビット）を選定することになる。ＲＴｈｏｌｄ３０１２が下位ビット「０００１００００１１」（レジスタ＄６の下位１０ビットに対応する）を保持している場合、ビット２（「１」を保持している）及びビット３（「０」を保持している）が選定され、「１０」をもたらす。入替えロジック４３００は、この方法を使用して、６つのビットを生成するために、ＲＴｈｏｌｄ３０１２に基づいてＲＳｈｏｌｄ３０１０からビットを選定する。その結果生じる６つのビットは、結果を形成するためにＡＣＣ１の下位６６ビットに連結される。これは、ＡＣＣ１の下位６６ビットを効果的に左側へ６ビットシフトし、下位６ビットを入替えロジック４３００の出力と置き換える。
【００５６】
上に説明されたＰＰＥＲＭインストラクションは、ハードウェア内でのビットの入れ替え支援を提供するために使用される１つの技術である。厳密に数学的な意味では、ビットの入れ替えは、１対１の写像として、レジスタ又はメモリ位置内の順序付けられた１グループのビットを任意に順序付けし直すことから成る。ここで説明されるような入れ替えは、１対多数の写像及び１対１の写像も可能である、より一般的な操作である。十分なハードウェアが使用される場合、いかなる入れ替えも、単一のクロック・サイクルにおいて実行可能である。しかしながら、固定された入れ替え以外であれば、どうしても、入れ替えが実行される前に、かなりの量の状態（ｓｔａｔｅ）が設定されなければならない。例えば、ビットが、３２ビット値から、拡張された４８ビット値に置き換えられる場合、４８個のディスティネーション・ビットの各々が、対応するソース・ビットを指し示すための５ビットのデータを必要とする。こうして、２４０ビットの状態が、そのオペレーションを完全に指示するために必要となる。
【００５７】
入れ替えを指定するのに必要な状態の量は、入れ替えられるディスティネーション・ビットの数を減少させることにより減少する。部分的な入れ替えオペレーションは、増大しないインストラクション・セットと共に使用されるシフト及びマスクのアルゴリズムに比べて増大される性能を提供しつつ、複数のクロック・サイクルに渡って完了される広範囲な入れ替えを可能にする。（１）入れ替えるディスティネーション・ビットのサブセット、（２）入れ替えるディスティネーション・ビットのサブセット内の各ビットのソースについての記述、（３）前の部分的な値、及び（４）ディスティネーション・レジスタ、といった入力を用いる、部分的な入替えインストラクションが提供される。
【００５８】
ディスティネーション・ビットは、様々な程度の経済性に応じて、いくつかの方法で指定される。例えば、ディスティネーション・ビットは、各ディスティネーション・ビット毎に、その位置を指定するための少なくとも５−ビットの値を用いる、自由形式のフォーマットで指定される。また、ディスティネーション・ビットは、１つのインストラクション当たり少なくとも５ビットを要求して、明示的に制御されたビットからスタートする１つの連続するグループとして指定される。さらに、ディスティネーション・ビットは、標準的なインストラクションシーケンスとして実行される完全な入替え操作でもって、暗黙的に制御されたビットからスタートする連続するグループとして指定される。
【００５９】
ＰＰＥＲＭインストラクションは、マイクロプロセッサの乗算又は乗算／除算ユニットにおいて、部分的なビットの入替えのハードウェア実施例を提供する。上に説明されたＰＰＥＲＭインストラクションに加えて、部分的なビットの入替えのいくつかの代案となる実施例が望ましい。
【００６０】
図１０Ａを参照する。４つのオペランドを用いる部分的入替オペレーションが指定される。ｒｄオペランドは結果を格納するためのディスティネーション・レジスタを指定する。ｒｓオペランドは、部分的な入れ替えを実行するための、ソース・ビットとして使用される入力ワードを指定する。ｒｔオペランドは、前の部分的な値を格納するレジスタを識別する。最後に、ｒｕオペランドは、実行されることになっている部分的な入替えを指定するための制御入力として使用される。
【００６１】
図１０Ｂを参照する。オペランドｒｕによって指定される制御レジスタは、ソース・ビットを指定するための４つの５ビット値と、４つのディスティネーション・ビットのうちのどれを入れ替えるべきであるかを指定するマスクと、デフォルト・ビットと、ディスティネーション・ニブルとを用いて、実現される。ディスティネーション・ニブルは、結果として入れ替えられるビットを配置するために、ディスティネーション・レジスタ内の特定の４ビット・フィールドを指定するために使用される。例えば、ディスティネーション・ニブルが０である場合、ディスティネーション・レジスタの下位４ビットが置き換えられる。
【００６２】
４つのソース・ビットの識別子は、ディスティネーション・レジスタ（ｒｄによって指定される）内の対応するビットを置き換えるために、入力ワード（ｒｓによって指定される）のうちのどのビットが使用されるかを指定する。これらのソース・ビット識別子は、ディスティネーション・ニブルによって指定されたように、配置されるべき４ビット・フィールドを形成する。例えば、ソース・ビット０が「０００１０」である場合、ｒｓのビット２が４ビット・フィールドの下位ビットである。ｒｓが「１０１０」を保持している場合、「０」（ビット２は右から３番目のビットである）が、ディスティネーション・ニブルの下位ビットを形成する。
【００６３】
マスクは、対応するソース・ビットを入れ替えるべきかどうかを指定するために使用される。例えば、「００１１１」というマスクは、ソース・ビット０、１、及び２によって指定される入れ替えを単に実行する。対応するマスク・ビットが０である場合、デフォルト・ビットがディスティネーション・ニブルの中で使用される。この例において、ソース・ビット３に対応するマスク・ビットが「０」であるので、デフォルト・ビットの値がディスティネーション・ニブルの上位ビットに対して使用される。マスク及びデフォルト・ビットの使用は、所要の結果値が複数のソース・ワードから集められたビットの入れ替えである場合に有用である。ここで、デフォルト・ビットは、ゼロ、１、又はマスクによる入替え用に選択されなかったディスティネーション・ビットの値は変更せずに残すことにするという指示である。オペレーション用に選定されなかったディスティネーション・レジスタのすべてのニブルの値は、オペランドｒｔによって指定された前の部分的な値からコピーされる。
【００６４】
図１１Ａを参照する。部分的な入れ替えの別の実施例では、より少数のレジスタしか、部分的入替インストラクションを指定するのに使用されない。この実施例では、ディスティネーション・オペランドｒｄ及びソース・オペランドｒｓが指定される。上で説明されたような、制御レジスタを使用する代わりに、２つのソース・ビット指示子が、そのインストラクションの中に含まれる。このインストラクション・フォーマットを用いることで、インストラクションは、入れ替えを行う上で、より少数のビットしか指定しない。しかしながら、インストラクションの繰返し割合は、より高い。
【００６５】
このインストラクション・フォーマットの中に、使用されるマスク又はスタートの指示子があるので、前の部分的入替のソースレジスタが暗黙的にディスティネーション・レジスタであり、インストラクションは、ソースからの２つの追加のビットでマージするよりもむしろ、前の値の上で２つのビットによって、暗黙的なシフトあるいはローテイト（ｒｏｔａｔｅ）を実行する。その値が現在のソース（ｒｓ）レジスタから導き出せない値のビットに対するマスクがない場合、明示的なシフト／ローテイトのインストラクションを用いて、また、シングルビットの部分的入替えインストラクションを用いて、処理がなされる。
【００６６】
図１１Ｂを参照する。シングルビットの部分的入替インストラクションは、図１１Ａに関して説明した２つのビットのフォーマットに類似するフォーマットを含む。この実施例では、選定されたソース・ビットと下位ビットを置き換えるよりもむしろ、シングル・ビットがインストラクション・フィールド内で指定され、暗黙的な１つのビットのシフトが実行される。
【００６７】
図１２Ａを参照する。部分的入替はまた、乗算／除算ユニットのアキュムレータを使用して実行される。例えば、図１２Ａで示されるインストラクション・フォーマットは、ソース・レジスタ・オペランドｒｓ、制御ワード・オペランドｒｔ、及びディスティネーション・クイブル（５ビット・フィールド識別子）を含む。ＭＤＵ２０３０のＨＩ／ＬＯレジスタが、ソース・データ・レジスタ及び前の部分的な値のソースとして暗黙的に使用される。
【００６８】
図１２Ｂを参照する。制御ワードが、図１０Ｂに関して上で説明したように、デフォルト・ビット、マスク、及びソース・ビットを保持する。しかしながら、この実施例では、ディスティネーション・クイブル（ニブルに対立するものとして）が、制御ワード内に追加のソース・ビット識別子用のスペースを残しながら、インストラクションの中で指定される。このフォーマットにおけるインストラクションは、ＨＩ／ＬＯレジスタ・ペアで作動し、拡張入替（例えば３２ビットの値が４８ビットの値に拡張される）をより効率的にするために使用される。
【００６９】
図１３Ａを参照する。部分的入替はまた、乗算器あるいは乗算／除算ユニットのアキュムレータを使用して、マスク無しで、実行される。例えば、図１３Ａで示されるインストラクション・フォーマットは、ソース・レジスタ・オペランドｒｓ及び制御ワード・オペランドｒｔを含む。ＭＤＵ２０３０のＨＩ／ＬＯレジスタが、前の部分的な値のソースとして暗黙的に使用される。図１３Ｂを参照すると、制御ワードは、図１０Ｂに関して上述したような６つのソース・ビットの記述を保持している。
【００７０】
部分的入替の別の実施例は、１つ以上の制御ワード・オペランドを使用することによって、指定されたビットの数を増大させる。例えば、１つの実施例は、２つの制御ワードが指定されること以外は、図１０Ａで説明したようなインストラクションの符号化、及び図１０Ｂで説明したような制御ワードの符号化を使用する。この実施例は、前の部分的な値のソースの代わりに、第２の制御ワード・オペランドを指定するためにオペランドｒｔを使用するが、別のレジスタ、例えばＨＩ／ＬＯレジスタとして暗黙的に指定される。追加の実施例は、（ｉ）図１３Ｂに説明したような２つの制御ワード・オペランドを提供するために、図１３Ａのインストラクションの符号化を変更することによって、１２ビットの入れ替え、及び（ｉｉ）図１２Ｂに関して説明したような２つの制御ワード・オペランドを使用する１０ビットの入れ替えを可能とする。
【００７１】
ハードウェア（例えば、マイクロプロセッサあるいはマイクロコントローラ内の）を使用するマルチプライヤの実施例に加えて、ソフトウェア（つまりコンピュータ読み取り可能なプログラムコード）を格納するように設定された、例えば、コンピュータが使用可能な（例えば、読み取り可能な）記憶媒体内に配列されたソフトウェアにおいても、マルチプライヤが具現化される。そのプログラム・コードは、ここに開示されたシステム及び技術の機能又は構成を、あるいはその両方を可能にする。例えば、これは、汎用プログラミング言語（例えばＣ、Ｃ＋＋）、Ｖｅｒｉｌｏｇ−ＨＤＬ、ＶＨＤＬ、ＡＨＤＬ（ＡｌｔｅｒａＨＤＬ）などを含むハードウェア記述言語（ＨＤＬ）、又は他の利用可能なプログラミング及び／又は回路（つまり回路図）キャプチャのツールの使用を通して達成されることができる。プログラム・コードは、半導体、磁気ディスク、光ディスク（例えばＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＷ）、及びコンピュータ使用可能な（例えば、読み取り可能な）伝送記憶媒体（例えば、搬送波、あるいはデジタル、オプティカル又はアナログ・ベースの記憶媒体を含む他の記憶媒体）において具現化されるコンピュータ・データ信号のようなものを含む任意のよく知られたコンピュータ使用可能な記憶媒体内に配列されることができる。従って、コードは、インターネット及びイントラネットを含む通信ネットワーク上で伝送されることができる。
【００７２】
上に説明したシステム及び技術によって、達成される機能、及び／又は提供される構造が、プログラム・コードで実現されるコア（例えばマイクロプロセッサ・コア）内で表されることができ、またＩＣの製品の一部としてハードウェアに変換されることが、理解されるべきである。また、そのシステム及び技術は、ハードウェア及びソフトウェアの組合せとして実現されてもよい。従って、他の実施例も、特許請求の範囲内である。
【図面の簡単な説明】
【００７３】
【図１】ＲＩＳＣアーキテクチャで使用される典型的な５ステージのパイプラインのブロック図である。
【図２】実行ユニット及び乗算／除算ユニットを含むプロセッサ・コアのブロック図である。
【図３】２進の多項式算術をサポートする乗算ユニットの１つの実施例内のデータ経路のダイアグラムである。
【図４】一実施例中で算術及び２進の多項式の乗算をサポートするマルチプライヤアレイのブロック図である。
【図５】図４で示した実施例の中で使用される算術マルチプライヤアレイのブロック図である。
【図６】図４で示した実施例の中で使用される２進の多項式マルチプライヤアレイのブロック図である。
【図７Ａ】一実施例において、１６ビット乗算による３２ビットの演算を示すタイミング図である。
【図７Ｂ】一実施例において、３２ビット乗算による３２ビットの演算を示すタイミング図である。
【図７Ｃ】一実施例において、除算の演算を示すタイミング図である。
【図８】乗算インストラクションを実行するためのステップを実現する有限状態マシーンの図である。
【図９】除算インストラクションを実行するためのステップを実現する有限状態マシーンの図である。
【図１０Ａ】４つのオペランドを有する一例の部分的入替インストラクションのインストラクションの符号化の図である。
【図１０Ｂ】図１０Ａに示すような部分的入替インストラクションにタイするオペランドとして使用するための例示的な制御ワード符号化フォーマットの図である。
【図１１Ａ】制御ワードオペランドを使用しない例示的な部分的入替インストラクションのインストラクション符号化の図である。
【図１１Ｂ】制御ワードオペランドを使用しない例示的な部分的入替インストラクションのインストラクション符号化の図である。
【図１２Ａ】乗算／除算ユニットのレジスタを暗黙的に使用する例示的な部分的入替インストラクションのインストラクション符号化の図である。
【図１２Ｂ】図１２Ａに示したような部分的入替インストラクションに対するオペランドとして使用する制御ワード符号化フォーマットの図である。
【図１３Ａ】乗算／除算ユニットのレジスタを暗黙的に使用する他の部分的入替インストラクションのインストラクション符号化の図である。
【図１３Ｂ】図１３Ａに示したような部分的入替インストラクションに対するオペランドとして使用する制御ワード符号化フォーマットの図である。
【図１】
2004524621.tif 000003
【図２】
2004524621.tif 000004
【図３】
2004524621.tif 000005
【図７Ａ】
2004524621.tif 000006
【図７Ｂ】
2004524621.tif 000007
【図７Ｃ】
2004524621.tif 000008
【図１０Ｂ】
2004524621.tif 000009
【図１１Ａ】
2004524621.tif 000010
【図１１Ｂ】
2004524621.tif 000011
【図１２Ａ】
2004524621.tif 000012
【図１２Ｂ】
2004524621.tif 000013
【図１３Ｂ】
2004524621.tif 000014
【国際公開パンフレット】
2004524621.tif 000015
2004524621.tif 000016
2004524621.tif 000017
2004524621.tif 000018
2004524621.tif 000019
2004524621.tif 000020
2004524621.tif 000021
2004524621.tif 000022
2004524621.tif 000023
2004524621.tif 000024
2004524621.tif 000025
2004524621.tif 000026
2004524621.tif 000027
2004524621.tif 000028
2004524621.tif 000029
2004524621.tif 000030
2004524621.tif 000031
2004524621.tif 000032
2004524621.tif 000033
2004524621.tif 000034
2004524621.tif 000035
2004524621.tif 000036
2004524621.tif 000037
2004524621.tif 000038
2004524621.tif 000039
2004524621.tif 000040
2004524621.tif 000041
2004524621.tif 000042
2004524621.tif 000043
2004524621.tif 000044
2004524621.tif 000045
2004524621.tif 000046
2004524621.tif 000047
2004524621.tif 000048
2004524621.tif 000049
2004524621.tif 000050
2004524621.tif 000051
2004524621.tif 000052
2004524621.tif 000053
2004524621.tif 000054
2004524621.tif 000055
【国際公開パンフレット（コレクトバージョン）】
2004524621.tif 000056
2004524621.tif 000057
2004524621.tif 000058
2004524621.tif 000059
2004524621.tif 000060
2004524621.tif 000061
2004524621.tif 000062
2004524621.tif 000063
2004524621.tif 000064
2004524621.tif 000065
2004524621.tif 000066
2004524621.tif 000067
2004524621.tif 000068
2004524621.tif 000069
2004524621.tif 000070
2004524621.tif 000071
2004524621.tif 000072
2004524621.tif 000073
2004524621.tif 000074
2004524621.tif 000075
2004524621.tif 000076
2004524621.tif 000077
2004524621.tif 000078
2004524621.tif 000079
2004524621.tif 000080
2004524621.tif 000081
2004524621.tif 000082
2004524621.tif 000083
2004524621.tif 000084
2004524621.tif 000085
2004524621.tif 000086
2004524621.tif 000087
2004524621.tif 000088
2004524621.tif 000089
2004524621.tif 000090
2004524621.tif 000091
2004524621.tif 000092
2004524621.tif 000093
2004524621.tif 000094
2004524621.tif 000095
2004524621.tif 000096
【国際調査報告】
2004524621.tif 000097
2004524621.tif 000098