(57)【特許請求の範囲】
【請求項１】
命令をデコードする命令デコーダと、データを記憶する複数のレジスタと、飽和演算を行う飽和演算器を含み前記命令デコーダの出力に従って命令を実行する命令実行部とを備えた飽和演算命令を有するマイクロプロセッサにおいて、前記飽和演算器は、被飽和演算値が前記飽和演算命令で指定された任意ビット長によって表現される飽和値を越えた場合に、被飽和演算値を飽和値に飽和させる任意ビット長飽和手段を備えたことを特徴とする飽和演算命令を有するマイクロプロセッサ。
【請求項２】
任意ビット長飽和手段は、被飽和演算値が飽和値を越えているか否か判定する判定手段と、命令で指定されたビット長の飽和値を生成する飽和値生成手段と、被飽和演算値が飽和値を越えていることを前記判定手段が検知したら前記飽和値生成手段の生成値を出力する出力手段とを備えたことを特徴とする請求項１記載の飽和演算命令を有するマイクロプロセッサ。
【請求項３】
出力手段は、負数の被飽和演算値をゼロに飽和させるゼロ飽和手段を含むことを特徴とする請求項２記載の飽和演算命令を有するマイクロプロセッサ。
【請求項４】
飽和値生成手段は、サブワード単位の飽和値を生成するサブワード飽和値生成手段を含み、判定手段は、サブワード単位で被飽和演算値が飽和値を越えているか否か判定するサブワード判定手段を含むことを特徴とする請求項２または請求項３記載の飽和演算命令を有するマイクロプロセッサ。
【請求項５】
飽和値生成手段は、命令で指定されたビット長によって表現される飽和値を被飽和演算値のビット長の２進値にデコードするデコーダを含むことを特徴とする請求項２から請求項４のうちのいずれか１項に記載の飽和演算命令を有するマイクロプロセッサ。
【請求項６】
飽和値生成手段は、全ビット１のデータをシフトして飽和値を生成するシフタを含むことを特徴とする請求項２から請求項４のうちのいずれか１項に記載の飽和演算命令を有するマイクロプロセッサ。
【請求項７】
判定手段は、命令で指定されたビット長の分だけ被飽和演算値をシフトするシフタを含むことを特徴とする請求項２から請求項６のうちのいずれか１項に記載の飽和演算命令を有するマイクロプロセッサ。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明は、演算の結果オーバーフローが生じたら所定の値になるように演算結果を操作する飽和演算命令を有するマイクロプロセッサに関するものである。
【０００２】
【従来の技術】
演算回路が演算（operation ）を実行した結果オーバーフローが生ずると、演算結果が最大値になるように操作する飽和演算（saturating operation）が必要とされるアプリケーションがある。このような要請に応えるために、飽和演算命令を有するマイクロプロセッサがある。従来の飽和演算命令を有するマイクロプロセッサとして、例えば、特開平７−２１０３６８号公報、特開平７−４９７６７号公報、特開平５−３１３８５６号公報、特開平７−３３４３４６号公報、特開平４−３１５２７５号公報に示されたものがある。
【０００３】
ＭＰＥＧ２規格にもとづいて行われるビデオデコード処理のように、デコード結果として比較的少ないビット長のデータが出力されるアプリケーションでは、デコード処理の過程において、あるビット長の最大値への飽和演算を行う必要がある。例えば、結果が「１００００（符号なし）」となった場合に、４ビットの最大値「１１１１（符号なし）」に飽和させることが要求される。さらに、デコード処理の内容に応じて複数種類のビット長の各最大値への飽和演算が要求される。動画データの画素はＲＧＢの３色で表されるが、例えば、ＲＧＢそれぞれに対して４ビット、６ビットまたは８ビットが割り当てられる。ＲＧＢそれぞれに対して４ビットが割り当てられる場合には、４０９６色を表すことができる。ＲＧＢそれぞれに対して６ビットが割り当てられる場合には、約２６万色を表すことができる。ＲＧＢそれぞれに対して８ビットが割り当てられた場合には、約１６７０万色を表すことができる。すなわち、表現したい色数に応じて、ＲＧＢそれぞれに割り当てられるビット数は異なる。従って、処理内容の違いに応じて複数種類のビット長の最大値への飽和演算が要求される。
【０００４】
マルチメディア拡張命令としてインテル社が提唱するＭＭＸアーキテクチャでは新たな５７命令が提供されるが、飽和演算と他の演算を複合させた命令として、以下の命令が含まれる。
ＰＡＣＫＵＳＷＢ          ：２つのワード型から１つのバイト型を作る（符号なし）
ＰＡＣＫＳＳ［ＷＢ，ＤＷ］：［ワード型，ダブルワード型］から［バイト型，ワード型］を作る（符号付き）
ＰＡＤＤＳ［Ｂ，Ｗ］      ：［バイト型，ワード型］を加算（符号付き）
ＰＡＤＤＵＳ［Ｂ，Ｗ］    ：［バイト型，ワード型］を加算（符号なし）
ＰＳＵＢＳ［Ｂ，Ｗ］      ：［バイト型，ワード型］を減算（符号付き）
ＰＳＵＢＵＳ［Ｂ，Ｗ］    ：［バイト型，ワード型］を減算（符号なし）
【０００５】
いずれの命令も、１バイトまたは１６ビットの１ワードの値のみへの飽和演算を行うことが可能であって、任意のビット長の値への飽和演算を１命令で行うことはできない。
【０００６】
また、ヒューレットパッカード社のＰＡ−ＲＩＳＣでも、任意のビット長の値への飽和演算を実行するには数命令を要し、１命令で任意のビット長の値への飽和演算を実行することはできない。
【０００７】
【発明が解決しようとする課題】
従来の飽和演算命令を有するマイクロプロセッサは以上のように構成されているので、任意のビット長の値への飽和演算を１命令で実行することはできず、便利なマルチメディア命令を提供できないという課題があった。
【０００８】
この発明は上記のような課題を解決するためになされたもので、１命令のみで任意のビット長の値への飽和演算を行うことができる飽和演算命令を有するマイクロプロセッサを得ることを目的とする。
【０００９】
【課題を解決するための手段】
請求項１記載の発明に係る飽和演算命令を有するマイクロプロセッサは、命令で指定された任意ビット長によって表現される飽和値に被飽和演算値を飽和させる任意ビット長飽和手段を備えたものである。
【００１０】
請求項２記載の発明に係る飽和演算命令を有するマイクロプロセッサは、任意ビット長飽和手段が、被飽和演算値が飽和値を越えているか否か判定する判定手段と、命令で指定されたビット長の飽和値を生成する飽和値生成手段と、被飽和演算値が飽和値を越えている場合に飽和値生成手段の生成値を出力する出力手段とを備えたものである。
【００１１】
請求項３記載の発明に係る飽和演算命令を有するマイクロプロセッサは、負数の被飽和演算値をゼロに飽和させるゼロ飽和手段を含むものである。
【００１２】
請求項４記載の発明に係る飽和演算命令を有するマイクロプロセッサは、飽和値生成手段がサブワード単位の飽和値を生成するサブワード飽和値生成手段を含み、判定手段がサブワード単位で被飽和演算値が飽和値を越えているか否か判定するサブワード判定手段を含むものである。
【００１３】
請求項５記載の発明に係る飽和演算命令を有するマイクロプロセッサは、飽和値生成手段が命令で指定されたビット長で表現される飽和値を被飽和演算値のビット長の２進値にデコードするデコーダを含むものである。
【００１４】
請求項６記載の発明に係る飽和演算命令を有するマイクロプロセッサは、飽和値生成手段が全ビット１のデータをシフトして飽和値を生成するシフタを含むものである。
【００１５】
請求項７記載の発明に係る飽和演算命令を有するマイクロプロセッサは、判定手段が命令で指定されたビット長の分だけ被飽和演算値をビットシフトするシフタを含むものである。
【００１６】
【発明の実施の形態】
以下、この発明の実施の一形態を説明する。
実施の形態１．
図１はこの発明の実施の形態１によるマイクロプロセッサの構成を示すブロック図である。このマイクロプロセッサは、３２ビットの内部データバスを有する３２ビットマイクロプロセッサである。図において、２は命令ＲＡＭ６から６４ビット幅のＩＤバスを介して入力した命令コードをデコードする処理を行う命令デコードユニット（命令デコーダ）、３はアドレス計算を行うメモリユニット、４は論理演算やシフト演算を行う整数演算ユニット（命令実行部）、５は３２ビット×６４ワードの汎用レジスタ（レジスタ）、７はデータが格納されるデータＲＡＭである。
【００１７】
命令デコードユニット２において、８，９はそれぞれ命令コードをデコードするデコーダ、１０はプロセッサの状態を示すプロセッサ状態語（Processor Status Word 、以下、ＰＳＷと呼ぶ）である、命令デコードユニット２は、さらに、デコーダ８のデコード結果とＰＳＷ１０の内容にもとづいて制御信号１１を作成し、それをメモリユニット３に与える。また、命令デコードユニット２は、デコーダ９のデコード結果とＰＳＷ１０の内容にもとづいて制御信号１２を作成し、それを整数演算ユニット４に与える。
【００１８】
メモリユニット３において、１３はジャンプや分岐を含まない命令を実行するとＰＣ（プログラムカウンタ）値に８を加えて次に実行する命令に対するＰＣ値を算出するとともに、ジャンプや分岐を含む命令の実行時に分岐変位をＰＣ値に加算したり、演算で指定されたアドレッシングモードに応じた計算を行ってジャンプ先の命令に対するＰＣ値を計算するＰＣ制御部である。ＰＣ制御部１３は、計算したＰＣ値を３２ビット幅のＩＡバスを介して命令ＲＡＭ６に送り、命令ＲＡＭ６から命令コードを出力させる。１４はオペランドとなるデータのアクセスを制御するメモリ制御部である。メモリ制御部１４は、３２ビット幅のＤＡバスを介してアドレスデータをデータＲＡＭ７に転送し命令実行に必要なデータを６４ビット幅のＤＤバスを介してアクセスする。１５は汎用レジスタ５から３２ビット幅のＳ１バス、Ｓ２バス、Ｓ３バスを介して転送された最大３ワードのデータを用いて算術論理演算を行い演算結果を３２ビット幅のＤ１バスを介して汎用レジスタ５に転送するＡＬＵ、１６は汎用レジスタ５からＳ１バス、Ｓ２バス、Ｓ３バスを介して転送されたデータを用いてシフト演算を行い演算結果をＤ１バスを介して汎用レジスタ５に転送するシフタである。
【００１９】
メモリユニット３に対して、Ｓ１バス、Ｓ２バス、Ｓ３バス、Ｓ４バスを介して、３２ビット長のデータを一時に４ワード転送することが可能である。従って、例えば、第１のレジスタの内容と第２のレジスタの内容との和でアドレッシングされるメモリの領域に第３のレジスタの内容をストアするとともに、第３のレジスタの内容をストアしたアドレスに所定値を加算して得られる値でアドレッシングされるメモリの領域に第４のレジスタの内容をストアする２ワードストア命令を実現することができる。また、メモリユニット３は、Ｄ１バスおよびＤ３バスを介して、メモリユニット３内での２ワードの演算結果またはデータＲＡＭ７から転送された２ワードのデータを汎用レジスタ５に転送することができる。
【００２０】
整数演算ユニット４において、１７は汎用レジスタ５から３２ビット幅のＳ４バス、Ｓ５バス、Ｓ６バスを介して転送された最大３ワードのデータを用いて乗算を行い演算結果を３２ビット幅のＤ２バス、Ｄ３バスを介して汎用レジスタ５に転送する乗算器、１８は乗算の結果を累積加算または累積減算して保持するアキュムレータである。アキュムレータとして、６４ビットのものが２本ある。１９は汎用レジスタ５からＳ４バス、Ｓ５バス、Ｓ６バスを介して転送された最大３ワードのデータを用いて算術論理演算を行い演算結果をＤ２バス、Ｄ３バスを介して汎用レジスタ５に転送するＡＬＵ、２０は汎用レジスタ５からＳ４バス、Ｓ５バス、Ｓ６バスを介して転送されたデータを用いてシフト演算を行い演算結果をＤ２バス、Ｄ３バスを介して汎用レジスタ５に転送するシフタ、２１は汎用レジスタ５からＳ４バス、Ｓ５バス、Ｓ６バスを介して転送されたデータを用いて飽和演算を行い演算結果をＤ２バス、Ｄ３バスを介して汎用レジスタ５に転送する飽和演算器である。
【００２１】
このマイクロプロセッサでは、汎用レジスタ５から、最大６種類のレジスタ値を読み出すことが可能であって、読み出されたデータは、それぞれ、Ｓ１バス、Ｓ２バス、Ｓ３バス、Ｓ４バス、Ｓ５バス、Ｓ６バスに出力される。また、汎用レジスタ５には、Ｄ１バス、Ｄ２バス、Ｄ３バスを介して最大３種類のレジスタ値を同時に書き込むことが可能である。
【００２２】
図２はこのマイクロプロセッサの命令フォーマットを示す説明図である。命令フォーマットとして、（ａ）に示すような１つの命令コードで２つの演算を指示する２演算命令のフォーマット１０１と、（ｂ）に示すような１つの命令コードで１つの演算を指示する１演算命令のフォーマット１０２とがある。２演算命令のフォーマット１０１には、フィールド１０３およびフィールド１０４からなるフォーマットフィールドと、２つの演算フィールド１０６，１０７と、各演算フィールド１０６，１０７に付属する各実行条件フィールド１０５とがある。１演算命令のフォーマット１０２には、フィールド１０３およびフィールド１０４からなるフォーマットフィールドと、演算フィールドと、演算フィールドに付属する実行条件フィールド１０５とがある。演算フィールドは、フィールド１０８，１０９，１１０からなる。
【００２３】
フォーマットフィールドは、以下のような意味を示す。
0003701401.tif 000002
ここで、ＦＭは、フィールド１０３およびフィールド１０４からなる２ビットの値である。
【００２４】
ＦＭ＝００の場合、この命令は２演算命令であることを示す。そして、演算フィールド１０６で指示されたoperation_０の演算と演算フィールド１０７で指示されたoperation_１の演算とが、デコード直後のクロックサイクルで並列に実行される。operation_０の演算はメモリユニット３で実行され、operation_１の演算は整数演算ユニット４で実行される。ＦＭ＝０１の場合、この命令は２演算命令であることを示す。そして、operation_０の演算が、デコード直後のクロックサイクルで実行され、operation_１の演算が、operation_０の演算に対して、１クロックサイクル遅れて実行される。ＦＭ＝１０の場合、この命令は２演算命令であることを示す。そして、operation_１の演算が、デコード直後のクロックサイクルで実行され、operation_０の演算が、operation_１の演算に対して、１クロックサイクル遅れて実行される。ＦＭ＝１１の場合、この命令は１演算命令であることを示す。そして、フィールド１０８，１０９，１１０からなる演算フィールドで指示された１つの演算がデコード直後のクロックサイクルで実行される。
【００２５】
実行条件フィールド１０５は、以下のような意味を持つ。
0003701401.tif 000003
【００２６】
実行条件フィールド１０５は、マイクロプロセッサの実行コントロールフラグＦ０，Ｆ１の値に応じて、演算フィールド１０６，１０７のoperation_０の演算やoperation_１の演算、および演算フィールド１０８，１０９，１１０の演算が有効であるか無効であるか定める。実行コントロールフラグＦ０，Ｆ１については後で説明する。演算が有効であるとは、演算結果がレジスタ、メモリおよびフラグに反映され、その演算による動作の結果が残ることを意味する。演算が無効であるとは、演算結果がレジスタ、メモリおよびフラグに反映されず、あたかも無効演算（ＮＯＰ）が実行されたかのような動作の結果が残ることを意味する。
【００２７】
実行条件フィールド１０５の値ＣＣ＝０００のときには、実行コントロールフラグＦ０，Ｆ１の値にかかわらず常に演算は有効である。ＣＣ＝００１のときには、実行コントロールフラグＦ０＝真のときにのみ演算は有効である。実行コントロールフラグＦ１の状態はいずれでもよい。ＣＣ＝０１０のときには、実行コントロールフラグＦ０＝偽のときにのみ演算は有効である。実行コントロールフラグＦ１の状態はいずれでもよい。ＣＣ＝０１１のときには、実行コントロールフラグＦ１＝真のときにのみ演算は有効である。実行コントロールフラグＦ０の状態はいずれでもよい。ＣＣ＝１００のときには、実行コントロールフラグＦ１＝偽のときにのみ演算は有効である。実行コントロールフラグＦ０の状態はいずれでもよい。ＣＣ＝１０１のときには、実行コントロールフラグＦ０＝真かつＦ１＝真のときにのみ演算は有効である。ＣＣ＝１１０のときには、実行コントロールフラグＦ０＝真かつＦ１＝偽のときにのみ演算は有効である。ＣＣ＝１１１のときの動作は未定義であり、ユーザは、ＣＣ＝１１１となる命令を用いることはできない。
【００２８】
図３は演算フィールドの詳細な内容を示す説明図である。
フォーマット１１１〜１１７は、それぞれ２８ビットで表現される短型の演算フィールド１０６または演算フィールド１０７によるものである。フォーマット１１８，１１９は、フィールド１０８，１０９，１１０で構成される長型の演算フィールドによるものである。
【００２９】
フォーマット１１１（Ｓｈｏｒｔ  Ｍ）は、演算内容を指定するフィールド１２０、レジスタ番号を指定する２つのフィールド１２１，１２２、レジスタ番号または６ビット長の即値を指定するフィールド１２３、およびフィールド１２３がレジスタ番号を示すのか即値を示すのかを指定するフィールド１２４で構成される。図３に示すように、フィールド１２４の値Ｘが「００」、「０１」または「１１」であるときにはフィールド１２３がレジスタ番号を示していることを示し、「１０」であるときには即値を示していることを示す。
このフォーマット１１１は、レジスタ間接アドレッシングのメモリアクセス演算に用いられる。
【００３０】
フォーマット１１２（Ｓｈｏｒｔ  Ａ）は、演算内容を指定するフィールド１２０、レジスタ番号を指定する２つのフィールド１２１，１２２、レジスタ番号または６ビット長の即値を指定するフィールド１２３、およびフィールド１２３がレジスタ番号を示すのか即値を示すのかを指定するフィールド１２５で構成される。図３に示すように、フィールド１２５の値Ｘ’が「０」であるときにはフィールド１２３がレジスタ番号を示していることを示し、「１」であるときには即値を示していることを示す。
このフォーマット１１２は、算術演算、論理演算、シフト演算およびビット演算に用いられる。
【００３１】
フォーマット１１３（Ｓｈｏｒｔ  Ｂ１）は、演算内容を指定するフィールド１２０およびレジスタ番号を指定するフィールド１２６で構成される。このフォーマット１１３は、レジスタ指定によるジャンプ命令および分岐命令に用いられる。
フォーマット１１４（Ｓｈｏｒｔ  Ｂ２）は、演算内容を指定するフィールド１２０および１８ビット長のディスプレイスメントのフィールド１２７で構成される。このフォーマット１１４は、ジャンプ命令および分岐命令に用いられる。
【００３２】
フォーマット１１５（Ｓｈｏｒｔ  Ｂ３）は、演算内容を指定するフィールド１２０、レジスタ番号を指定するフィールド１２１、レジスタ番号または１２ビット長の即値を指定するフィールド１２８、フィールド１２８がレジスタ番号を示すのか即値を示すのかを指定するフィールド１２９、およびゼロ判定にもとづいてフィールド１２１にもとづく条件ジャンプまたは条件分岐を行うか否か指定するフィールド１３０で構成される。
このフォーマット１１５は、条件ジャンプ命令および条件分岐命令に使用される。
【００３３】
フォーマット１１６（Ｓｈｏｒｔ  Ｄ１）は、演算内容を指定するフィールド１２０、レジスタ番号を指定するフィールド１２１、レジスタ番号または１２ビット長の即値を指定するフィールド１２８、フィールド１２８がレジスタ番号を示すのか即値を示すのかを指定するフィールド１２９で構成される。
このフォーマット１１６は、条件ジャンプ命令、条件分岐命令およびリピート命令に使用される。
フォーマット１１７（Ｓｈｏｒｔ  Ｄ２）は、演算内容を指定するフィールド１２０、レジスタ番号または１２ビット長の即値を指定するフィールド１２８、フィールド１２８がレジスタ番号を示すのか即値を示すのかを指定するフィールド１２９、遅延命令（ディレイド命令）に関するフィールド１３１で構成される。
このフォーマット１１７は、ディレイドジャンプ命令、ディレイド分岐命令およびリピート命令に使用される。
【００３４】
フォーマット１１８（Ｌｏｎｇ  １）は、演算内容を指定するフィールド１２０、レジスタ番号を指定する２つのフィールド１２１，１２２、３２ビット長の即値を指定するフィールド１３２で構成される。
このフォーマット１１８は、複雑な算術演算、大きな即値を用いる算術演算、大きなディスプレイスメント付きレジスタ間接アドレッシングのメモリアクセス演算、大きな変位の分岐演算および絶対番地へのジャンプ命令などに使用される。
フォーマット１１９（Ｌｏｎｇ  １）は、演算内容を指定するフィールド１２０、レジスタ番号を指定する２つのフィールド１２１，１２２、３２ビット長の即値を指定するフィールド１３２、およびゼロ判定にもとづいてフィールド１３２にもとづく条件ジャンプまたは条件分岐を行うか否か指定するフィールド１３３で構成される。
このフォーマット１１９は、大きな分岐変位を持つ条件ジャンプや条件分岐命令に使用される。
【００３５】
図４はマイクロプロセッサのレジスタ構成を示す説明図である。
このマイクロプロセッサは、図４（ａ）に示すような６４本の３２ビット長の汎用レジスタ５、図４（ｂ）に示すような１２本の制御レジスタ１５０、および図４（ｃ）に示すような２本のアキュムレータ１８を持つ。Ｒ０の汎用レジスタの内容は常に０であり、そこへの書き込みは無視される。Ｒ６２の汎用レジスタは、サブルーチンからの戻り先アドレスが設定されるリンクレジスタである。Ｒ６３の汎用レジスタは、スタックポインタであり、ＰＳＷ１０のＳＭフィールドの値に応じてユーザスタックポインタ（ＳＰＵ）または割り込みスタックポインタ（ＳＰＩ）として動作する。制御レジスタ１５０には、プログラムカウンタ１５１、ＰＳＷ１０、および各種の専用レジスタが含まれる。
図３に示すフォーマット１１２による演算では、６４本の汎用レジスタ５のそれぞれを上位１６ビットと下位１６ビットとに分けてアクセスできる。また、２本のアキュムレータ１８を、上位３２ビットと下位３２ビットとに分けて別々にアクセスできる。
【００３６】
図５はＰＳＷ１０の内容を詳細に示す説明図である。
ＰＳＷ１０の上位１６ビット１７０には、スタックポインタを切り替えるためのＳＭフィールド１７１、セルフデバッグトラップ（ＳＤＢＴ）の検出を示すＥＡフィールド１７２、ＳＤＢＴの許可を指定するＤＢフィールド１７３、割り込み許可を指定するＩＥフィールド１７４、リピート動作の許可を指定するＲＰフィールド１７５、モジュローアドレッシングの許可を指定するＭＤフィールド１７６がある。下位１６ビットはフラグフィールド１８０である。フラグフィールド１８０には８個のフラグがあり、その中のＦ０フラグ１８１およびＦ１フラグ１８２は演算の有効／無効を指定する。各フラグの値は比較演算や算術演算の結果に応じて変化する。また、フラグ初期化演算で初期化したり、フラグ値書き込み演算で任意の値をフラグフィールド１８０に書き込むことによって変化する。フラグフィールド１８０の内容は、フラグ値読み出し演算によって読み出される。
【００３７】
各フラグは、以下のような意味を有する。
ＳＭ＝０    ：スタックモード０→ＳＰＩを使用
ＳＭ＝１    ：スタックモード１→ＳＰＵを使用
ＥＡ＝０    ：ＳＤＢＴを未検出
ＥＡ＝１    ：ＳＤＢＴを検出
ＤＢ＝０    ：ＳＤＢＴを非許可
ＤＢ＝１    ：ＳＤＢＴを許可
ＩＥ＝０    ：割り込み非許可
ＩＥ＝１    ：割り込み許可
ＲＰ＝０    ：リピートブロック無効
ＲＰ＝１    ：リピートブロック有効
ＭＤ＝０    ：モジュロアドレッシング無効
ＭＤ＝１    ：モジュロアドレッシング有効
Ｆ０        ：汎用フラグ（実行コントロールフラグ）
Ｆ１        ：汎用フラグ（実行コントロールフラグ）
Ｆ２        ：汎用フラグ
Ｆ３        ：汎用フラグ
Ｆ４（Ｓ）  ：飽和演算フラグ
Ｆ５（Ｖ）  ：オーバーフローフラグ
Ｆ６（ＶＡ）：累積オーバーフローフラグ
Ｆ７（Ｃ）  ：キャリー／ボローフラグ
【００３８】
以下、このマイクロプロセッサの命令一覧を示す。
0003701401.tif 000004
0003701401.tif 000005
【００３９】
0003701401.tif 000006
【００４０】
0003701401.tif 000007
【００４１】
Ａ−４．最大値／最小値命令
reserved［予約済］
【００４２】
0003701401.tif 000008
【００４３】
Ａ−６．論理演算命令
ＡＮＤ        ：logical AND ［論理積］
ＯＲ          ：logical OR  ［論理和］
ＮＯＴ        ：logical NOT ［反転］
ＸＯＲ        ：logical exclusive OR［排他的論理和］
ＡＮＤＦＧ    ：logical AND flags ［フラグの論理積］
ＯＲＦＧ      ：logical OR flags［フラグの論理和］
ＮＯＴＦＧ    ：logical NOT a flag［フラグの反転］
ＸＯＲＦＧ    ：logical exclusive OR flags［フラグの排他的論理和］
【００４４】
0003701401.tif 000009
【００４５】
Ａ−８．ビット操作命令
ＢＣＬＲ      ：Clear a bit ［ビットクリア］
ＢＮＯＴ      ：Invert a bit［ビット反転］
ＢＳＥＴ      ：Set a bit ［ビットセット］
ＢＴＳＴ      ：Test a bit［ビットテスト］
【００４６】
0003701401.tif 000010
［ディレイド分岐，ジャンプ命令］
ＤＢＲＡ
ＤＢＲＡＩ
ＤＢＳＲ
ＤＢＳＲＩ
ＤＪＭＰ
ＤＪＭＰＩ
ＤＪＳＲ
ＤＪＳＲＩ
【００４７】
0003701401.tif 000011
【００４８】
0003701401.tif 000012
0003701401.tif 000013
ここで、正数への飽和演算とは、演算対象値が負であった場合には、その値を０に変換する操作を含む飽和演算をいう。従って、正数への飽和演算ではない飽和演算は、演算対象値が正であった場合には正の最大値（正の飽和値）に変換し、演算対象値が負であった場合には負の最小値（負の飽和値）に変換する操作を行う。
【００４９】
0003701401.tif 000014
【００５０】
ＳＡＴ命令は、ワード（フルワード）を扱う命令であり、オペランドで即値またはレジスタを指定でき、任意のビット長の飽和値への飽和演算を実現する命令である。ＳＡＴＺ命令は、フルワードを扱う命令であり、演算結果が負であった場合に０へ飽和させることを指定できる命令である。ＳＡＴ２Ｈ命令は、ハーフワードを扱う命令であり、オペランドで即値を指定でき、任意のビット長の飽和値への飽和演算を実現する。ＳＡＴＺ２Ｈ命令は、ハーフワードを扱う命令であり、演算結果が負であった場合に０へ飽和させることを指定できる命令である。これらの命令は、図３に示すフォーマット１１２で実現される。なお、このマイクロプロセッサにおいて、フルワードは３２ビットで構成される。
【００５１】
以下、これらの命令のニーモニックとオペランドの表記および実際の演算処理を示す。Ｒａ，Ｒｂ，Ｒｃはそれぞれ３２ビット長のレジスタを示す。ｉｍｍ：６は６ビットの即値を示す。＊＊はべき乗の演算を示す。［ｎ，ｍ］は参照ビット範囲を示す。
【００５２】
0003701401.tif 000015
【００５３】
0003701401.tif 000016
【００５４】
0003701401.tif 000017
【００５５】
0003701401.tif 000018
【００５６】
各命令は、Ｒｂレジスタに設定されている被飽和演算値を、Ｒｃレジスタの所定領域に設定されている４ビットまたは５ビットの値または４ビットまたは５ビットの即値に応じた飽和値に飽和させようとするものである。４ビットまたは５ビットの値をｎ（＝bit_sat ）と表すと、ＳＡＴ命令またはＳＡＴ２Ｈ命令によれば、被飽和演算値が正数の場合に、被飽和演算値が２n-1 −１を越えていると２n-1 −１に変換される。また、被飽和演算値が負数の場合に、被飽和演算値が−２n-1 よりも小さいときには−２n-1 に変換される。ＳＡＴＺ命令またはＳＡＴＺ２Ｈ命令によれば、被飽和演算値が正数の場合に、被飽和演算値が２n-1 −１を越えていると２n-1 −１に変換される。また、被飽和演算値が負数の場合に、被飽和演算値は０に変換される。なお、被飽和演算値は２の補数で表現されているとする。
【００５７】
図６はこの発明の実施の形態１によるマイクロプロセッサにおける飽和演算器の構成を示すブロック図である。図において、２００はハーフワードを扱う飽和演算命令における一方の飽和演算ビット長bith_satを格納する４ビット長のレジスタ、２０１はフルワードを扱う飽和演算命令における飽和演算ビット長bit_sat またはハーフワードを扱う飽和演算命令における他方の飽和演算ビット長bitl_satを格納する５ビット長のレジスタ、２０２は飽和演算の対象となるレジスタＲｂの内容を格納する３２ビット長のレジスタである。以下、飽和演算の対象となるレジスタＲｂの内容を被飽和演算値Ｒｂと表現する。
【００５８】
２１０は現在実行しようとしている命令がハーフワード用の命令であるのか、それともフルワード用の命令であるのかを示す制御信号（E1HISFTHFW）であり、E1HISFTHFW＝１であればハーフワード命令を示し、E1HISFTHFW＝０であればフルワード命令を示す。２１１は現在実行しようとしている命令が正数への飽和演算命令（ＳＡＴＺ命令またはＳＡＴＺ２Ｈ命令）であるのか、それともそうでない飽和演算命令（ＳＡＴ命令またはＳＡＴ２Ｈ命令）であるのかを示す制御信号（E1HISATZ）であり、E1HISATZ＝１であれば現在実行しようとする命令がＳＡＴＺ命令またはＳＡＴＺ２Ｈ命令であることを示し、E1HISATZ＝０であれば現在実行しようとする命令がＳＡＴ命令またはＳＡＴ２Ｈ命令でないことを示す。
【００５９】
２１２はレジスタ２０２の最上位ビット（elrisi2[0]）を示し、被飽和演算値Ｒｂが正であるか負であるかを示す符号ビットである。このマイクロプロセッサでは、最上位ビットはビット＃０である。elrisi2[0]＝１であれば、フルワード演算の場合には、被飽和演算値Ｒｂが負であることを示し、ハーフワード演算の場合には、被飽和演算値Ｒｂの上位側のハーフワード（１６ビット）が負であることを示す。elrisi2[0]＝０であれば、フルワード演算の場合には、被飽和演算値Ｒｂが正であることを示し、ハーフワード演算の場合には、被飽和演算値Ｒｂの上位側のハーフワードが正であることを示す。
【００６０】
２１３は符号ビット（eldisatsli）であり、現在実行しようとしている命令がハーフワード命令であれば被飽和演算値Ｒｂの下位側のハーフワード（１６ビット）の符号ビットを示し、フルワード命令であれば符号ビット２１２と同一の符号ビットである。eldisatsli＝１であれば、フルワード演算の場合には、被飽和演算値Ｒｂが負であることを示し、ハーフワード演算の場合には、被飽和演算値Ｒｂの下位側のハーフワードが負であることを示す。eldisatsli＝０であれば、フルワード演算の場合には、被飽和演算値Ｒｂが正であることを示し、ハーフワード演算の場合には、被飽和演算値Ｒｂの下位側のハーフワードが正であることを示す。
【００６１】
２１４は上位側のハーフワードの飽和演算判定結果を示す結果信号であり、「１」であれば飽和していないこと、すなわち、飽和値を越えていないことを示し、「０」であれば飽和していることを示す。２１５は下位側のハーフワードの飽和演算判定結果を示す結果信号であり、「１」であれば飽和していないことを示し、「０」であれば飽和していることを示す。２１６はフルワード命令実行時の飽和演算判定結果を示す結果信号であり、「１」であれば飽和していないことを示し、「０」であれば飽和していることを示す。フルワードが飽和していないことを示すには上位１６ビットと下位１６ビットとがともに飽和していないことが必要であるから、結果信号２１６は、結果信号２１４と結果信号２１５との論理積をとったものであるＡＮＤ信号である。
【００６２】
２２０はレジスタ２００の４ビットの値をデコードして１６ビットの値eldisat16do を出力するデコーダ（飽和値生成手段、任意ビット長飽和手段、サブワード飽和値生成手段）である。デコーダ２２０の入力値と出力値とは以下のような関係になっている。
0003701401.tif 000019
ここで、4'B は４ビット値の２進表現であることを示し、16'H は１６ビット値の１６進表現であることを示す。
【００６３】
２２１はレジスタ２０１の５ビットの値をデコードして３２ビットの値eldisat32do を出力するデコーダ（飽和値生成手段、任意ビット長飽和手段）である。デコーダ２２１の入力値と出力値とは以下のような関係になっている。
0003701401.tif 000020
0003701401.tif 000021
【００６４】
２３０はデコーダ２２０が出力する１６ビットの値eldisat16do とデコーダ２２１が出力する３２ビットの値eldisat32do の上位の１６ビットeldisat32do[0:15] とのうちのいずれかを、制御信号（E1HISFTHFW）２１０に応じて選択し、１６ビットの値eldisatvhdを出力するセレクタである。E1HISFTHFW＝１の場合、すなわちハーフワード命令を実行しようとしている場合には、出力される値eldisatvhdとして１６ビットの値eldisat16do が選択され、出力される値eldisatvhdとして１６ビットの値eldisat32do[0:15] が選択される。値eldisat32do[0:15] は、３２ビットの値eldisat32do の上位側の１６ビット（ビット＃０〜＃１５）による値である。２３１は説明の都合上図示された仮想的な変換器を示す。３２ビットの値eldisat32do の下位側の１６ビット（ビット＃１６〜＃３１）による値である１６ビットの値eldisat32do[16:31]の信号名をeldisatvldに変換するものである。１６ビットの値eldisat32do[16:31]と１６ビットの値eldisatvldとは実質的に同じものであり、現実のマイクロプロセッサには、変換器２３１は存在しない。
【００６５】
２２２は１６ビットの値eldisatvhdをビット反転するインバータ、２２３は１６ビットの値eldisatvldをビット反転するインバータである。２２４は被飽和演算値Ｒｂの上位１６ビットの値elrisi2[0:15] をビット反転するインバータ、２２５は被飽和演算値Ｒｂの下位１６ビットの値elrisi2[16:31]をビット反転するインバータである。
【００６６】
２３４は１６ビットの値elrisi2[0:15] とそのビット反転値とのうちのいずれかをレジスタ２０２の最上位ビット（elrisi2[0]）に応じて選択し、１６ビットの値eldisatishを出力するセレクタ（判定手段、任意ビット長飽和手段、サブワード判定手段）である。elrisi2[0]＝０の場合には１６ビットの値elrisi2[0:15] が出力され、elrisi2[0]＝１の場合には１６ビットの値elrisi2[0:15] の反転値が出力される。２４１は制御信号（E1HISFTHFW）２１０に従って１ビットの値eldisatsliを出力するセレクタである。E1HISFTHFW＝０の場合にはレジスタ２０２の最上位ビット（elrisi2[0]）が出力され、E1HISFTHFW＝１の場合にはレジスタ２０２のビット＃１６（elrisi2[16] ）が出力される。２３５はセレクタ２４１が出力する値eldisatsliに応じて１６ビットの値eldisatislを出力するセレクタ（判定手段、任意ビット長飽和手段、サブワード判定手段）である。eldisatsli＝０の場合にはレジスタ２０２の下位１６ビットの値elrisi2[16:31]が出力され、eldisatsli＝１の場合には１６ビットの値elrisi2[16:31]の反転値が出力される。
【００６７】
２２６は１６ビットの値eldisatvhdとセレクタ２３４が出力する１６ビットの値eldisatishとの間でビット毎の論理積演算を行った後、結果の１６ビットを入力とする反転論理和（ＮＯＲ）演算を行って１ビットの値を出力する演算器（判定手段、任意ビット長飽和手段、サブワード判定手段）、２２７は１６ビットの値eldisatvldとセレクタ２３５が出力する１６ビットの値eldisatislとの間でビット毎の論理積演算を行った後、結果の１６ビットを入力とするＮＯＲ演算を行って１ビットの値を出力する演算器（判定手段、任意ビット長飽和手段、サブワード判定手段）、２２８は演算器２２６の出力と演算器２２７の出力との論理積をとる演算器（判定手段、任意ビット長飽和手段）である。
【００６８】
２４０はレジスタ２０２の最上位ビット（elrisi2[0]）とビット＃１６（elrisi2[16] ）とを入力し、制御信号（E1HISFTHFW）２１０に応じて１ビットの値eldisatsliを出力するセレクタである。セレクタ２４０は、E1HISFTHFW＝０の場合には、値eldisatsliとしてレジスタ２０２の最上位ビット（elrisi2[0]）を出力し、E1HISFTHFW＝１の場合には、値eldisatsliとしてレジスタ２０２のビット＃１６（elrisi2[16] ）を出力する。
【００６９】
２３２はセレクタ２３０からの１６ビットの値eldisatvhdとその反転値とを入力し、レジスタ２０２の最上位ビット（elrisi2[0]）の値に応じて１６ビットの値eldisatvhiを出力するセレクタである。セレクタ２３２は、elrisi2[0]＝１の場合には値eldisatvhiとして１６ビットの値eldisatvhdを出力し、elrisi2[0]＝０の場合には値eldisatvhiとして１６ビットの値eldisatvhdの反転値を出力する。２３３は仮想の変換器２３１からの１６ビットの値eldisatvldとその反転値とを入力し、セレクタ２４０から出力された値eldisatsliに応じて１６ビットの値eldisatvliを出力するセレクタである。セレクタ２３３は、eldisatsli＝１の場合には値eldisatvliとして１６ビットの値eldisatvldを出力し、eldisatsli＝０の場合には値eldisatvliとして１６ビットの値eldisatvldの反転値を出力する。
【００７０】
２４２は演算器２２６の出力と演算器２２８の出力とのうちのいずれかを制御信号（E1HISFTHFW）２１０に応じて選択し、１ビットの値eldisatshrを出力するセレクタである。セレクタ２４２は、E1HISFTHFW＝０の場合には、値eldisatshrとして演算器２２８の出力を選択し、E1HISFTHFW＝１の場合には、値eldisatshrとして演算器２２６の出力を選択する。２４３は演算器２２６の出力と演算器２２７の出力とのうちのいずれかを制御信号（E1HISFTHFW）２１０に応じて選択し、１ビットの値eldisatslrを出力するセレクタである。セレクタ２４３は、E1HISFTHFW＝０の場合には、値eldisatslrとして演算器２２８の出力を選択し、E1HISFTHFW＝１の場合には、値eldisatslrとして演算器２２７の出力を選択する。
【００７１】
２３６はセレクタ２３２の出力値とレジスタ２０２の上位１６ビットの値elrisi2[0:15] とのうちのいずれかをセレクタ２４２が出力する値eldisatshrに応じて選択し、１６ビットの値eldisatvhrを出力するセレクタ（出力手段、任意ビット長飽和手段）である。セレクタ２３６は、eldisatshr＝０の場合には値eldisatvhrとしてセレクタ２３２が出力する値eldisatvhiを選択し、eldisatshr＝１の場合には値eldisatvhr１６ビットの値elrisi2[0:15] を選択する。２３７はセレクタ２３３の出力値とレジスタ２０２の下位１６ビットの値elrisi2[16:31]とのうちのいずれかをセレクタ２４３が出力する値eldisatslrに応じて選択し、１６ビットの値eldisatvlrを出力するセレクタ（出力手段、任意ビット長飽和手段）である。セレクタ２３７は、eldisatslr＝０の場合にはセレクタ２３３が出力する値eldisatvliを選択し、eldisatslr＝１の場合には１６ビットの値elrisi2[16:31]を選択する。
【００７２】
２３８は１６ビットの「０」とセレクタ２３６の出力値とのうちのいずれかを制御信号２１１，２１２に応じて選択し、１６ビットの値eldisatvhzを出力するセレクタ（出力手段、任意ビット長飽和手段）である。セレクタ２３８は、制御信号２１１，２１２の値がともに「１」のときには値eldisatvhzとして１６ビットの「０」を選択し、それ以外のときには値eldisatvhzとしてセレクタ２３６が出力する値eldisatvhrを選択する。２３９は１６ビットの「０」とセレクタ２３７の出力値とのうちのいずれかを制御信号２１１，２１３に応じて選択し、１６ビットの値eldisatvlzを出力するセレクタ（出力手段、任意ビット長飽和手段）である。セレクタ２３９は、制御信号２１１，２１３の値がともに「１」のときには値eldisatvlzとして１６ビットの「０」を選択し、それ以外のときには値eldisatvlzとしてセレクタ２３７が出力する値eldisatvlrを選択する。
【００７３】
２５０はビット結合を行う演算器（出力手段、任意ビット長飽和手段、ゼロ飽和手段）である。演算器２５０は、セレクタ２３８が出力する１６ビットの値eldisatvhzとセレクタ２３９が出力する１６ビットの値eldisatvlzとを結合して、３２ビットの値eldisatoutを出力する。
【００７４】
次に動作について説明する。
命令が飽和演算命令であることをデコーダ９が検知すると、制御信号１２によって、Ｒｂレジスタ、Ｒｃレジスタの具体的なレジスタ名または即値、およびフルワード命令／ハーフワード命令の種別が、飽和演算器２１に知らされる。すると、Ｒｂレジスタとして指定された汎用レジスタ５中の具体的なレジスタの内容がレジスタ２０２に設定される。現在実行しようとする命令がフルワード命令である場合には、Ｒｃレジスタとして指定された汎用レジスタ５中の具体的なレジスタのビット＃２７〜＃３１の値、または６ビットの即値におけるビット＃１〜＃５が、レジスタ２０１に設定される。現在実行しようとする命令がハーフワード命令である場合には、Ｒｃレジスタとして指定された汎用レジスタ５中の具体的なレジスタのビット＃１２〜＃１５の値または６ビットの即値におけるビット＃２〜＃５がレジスタ２００に設定され、ビット＃２８〜＃３１の値６ビットの即値におけるビット＃２〜＃５がレジスタ２０１に設定される。
【００７５】
デコーダ２２０は、レジスタ２００に書き込まれた４ビットの値を入力として、１６ビットのデコード値eldisat16do を出力する。なお、この値は、負の被飽和演算値Ｒｂに対して０〜１５ビットのいずれかの範囲で飽和演算を行った結果の負の最小値（絶対値で最大値）を示している。また、デコーダ２２１は、レジスタ２０１に書き込まれた５ビットの値を入力として、３２ビットのデコード値eldisat32do を出力する。なお、この値は、負の被飽和演算値Ｒｂに対して０〜３１ビットのいずれかの範囲で飽和演算を行った結果のそれぞれの負の最小値（絶対値で最大値）を示している。
【００７６】
以下、ハーフワード命令が実行される場合について説明する。
その場合には、制御信号（E1HISFTHFW）２１０は「１」を示している。従って、セレクタ２３０は、デコーダ２２０の出力を選択する。すなわち、セレクタ２３０から、値eldisatvhdとして、＜表Ａ＞に従った１６ビットのデコード値eldisat16do が出力される。仮想の変換器２３１は、常に３２ビットのデコード値eldisat32do の下位１６ビットを、値eldisatvldとして出力する。すなわち、＜表Ｂ＞におけるそれぞれの出力値３２ビットの下位側（＜表Ｂ＞において右側）の値を出力する。なお、ハーフワード命令が実行される場合には、（表Ｂ］における入力値５ビットの最上位ビットは「０」とみなされる。従って、この場合、実質的には、セレクタ２３０から出力される値eldisatvhdと、変換器２３１の値eldisatvldとは、同一の規則によって作成されたものとなる。
セレクタ２３０から出力される値eldisatvhdは、被飽和演算値Ｒｂの上位側のハーフワードが負値である場合の飽和値として用いられ、変換器２３１の値eldisatvldは、被飽和演算値Ｒｂの下位側のハーフワードが負値である場合の飽和値として用いられる。
【００７７】
セレクタ２３４および演算器２２６は、被飽和演算値Ｒｂの上位側のハーフワードが正数の場合の最大値または負数の場合の最小値を越えているかどうか判断する。なお、「正数の場合の最大値または負数の場合の最小値」を、以下、絶対値最大値とも表現する。セレクタ２３４は、レジスタ２０２の最上位ビット（elrisi2[0]）すなわち上位側のハーフワードの符号が「０」であるときには、被飽和演算値Ｒｂの上位側のハーフワードをそのまま出力する。つまり、被飽和演算値Ｒｂの上位側のハーフワードが正数であるときには、それをそのまま出力する。レジスタ２０２の最上位ビット（elrisi2[0]）が「１」であるときには、セレクタ２３４は、上位側のハーフワードがインバータ２２４でビット反転されたものを出力する。
【００７８】
演算器２２６は、セレクタ２３０から出力された値eldisatvhdとセレクタ２３４が出力する値eldisatishとの間で、ビット毎の論理積をとる。この場合には、セレクタ２３０は、１６ビットのデコード値eldisat16do を出力している。（表Ａ］からわかるように、１６ビットのデコード値eldisat16do は、下位側から［レジスタ２００の値−１］のビット数分だけ「０」で、それ以外の上位側は「１」になっている値である。例えば、レジスタ２００の設定値＝０１００（Ｂ）の場合には、セレクタ２３０から出力された値は、
eldisatvhd＝１１１１  １１１１  １１１１  １０００（Ｂ）（−８）…（１）
である。このとき、飽和値を越えていない値は、
００００  ００００  ００００  ０１１１（Ｂ）（１０進で＋７）    …（２）
から
１１１１  １１１１  １１１１  １０００（Ｂ）（１０進で−８）
までの範囲の値である。
【００７９】
負数に関して、ビット反転して考えると、
００００  ００００  ００００  ００００（Ｂ）（１０進で０）
から
００００  ００００  ００００  ０１１１（Ｂ）（１０進で７）      …（３）
であることがわかる。
【００８０】
正数では、飽和値を越えていない値は（２）で示された値以下の値であるから、（１）で示される値と飽和値を越えていない値との間で、ビット毎の論理積がとられると、その結果は全ビット０の１６ビットの値になる。負数では、ビット反転して考えた場合の飽和値を越えていない値は（３）で示された値以下の値であるから、ビット毎の論理積がとられると、やはり、その結果は全ビット０の１６ビットの値になる。すなわち、正数と値eldisatvhdとの間でビット毎の論理積をとった場合に、全ビット０の１６ビットの値が得られたときには、その正数は飽和値を越えていないことになる。また、負数をビット反転したものと値eldisatvhdとの間でビット毎の論理積をとった場合に、全ビット０の１６ビットの値が得られたときには、その負数は飽和値を越えていないことになる。
【００８１】
１６ビットを入力としてＮＯＲをとった場合に、全ビットが０のときにのみ出力は「１」になる。すなわち、演算器２２６は論理積処理を行った後にＮＯＲ処理を行っているので、被飽和演算値Ｒｂの上位側のハーフワードが飽和値を越えていなければ、演算器２２６の出力は「１」である。従って、上位側のハーフワードの飽和演算判定結果を示す結果信号２１４は、判定結果が飽和であれば「０」であり、非飽和であれば「１」を示す。判定結果が飽和とは、飽和値を越えていることを意味する。判定結果が非飽和とは、飽和値を越えていないことを意味する。
【００８２】
セレクタ２３５は、レジスタ２０２のビット＃１６（elrisi2[16] ）すなわち下位側のハーフワードの符号が「０」であるときには、被飽和演算値Ｒｂの下位側のハーフワードをそのまま出力する。つまり、被飽和演算値Ｒｂの下位側のハーフワードが正数であるときには、それをそのまま出力する。elrisi2[16] が「１」であるときには、セレクタ２３５は、下位側のハーフワードがインバータ２２５でビット反転されたものを出力する。このとき、制御信号（E1HISFTHFW）２１０は「１」を示しているので、セレクタ２４１は、値eldisatsliとしてelrisi2[16] を出力している。
【００８３】
上述したように、ハーフワード演算では、仮想の変換器２３１が出力する値eldisatvldは、１６ビットのデコード値eldisat16do に相当している。よって、演算器２２７は、演算器２２６と同様に作用し、下位側のハーフワードが飽和していなければ「１」を出力し、飽和していれば「０」を出力する。すなわち、下位側のハーフワードの飽和演算判定結果を示す結果信号２１５は、判定結果が飽和であれば「０」であり、非飽和であれば「１」を示す。
【００８４】
この場合には、制御信号（E1HISFTHFW）２１０は「１」を示しているので、セレクタ２４２は、結果信号２１４を、値eldisatshrとしてセレクタ２３６に与える。セレクタ２３６は、eldisatshr＝１の場合すなわち判定結果が被飽和の場合には、被飽和演算値Ｒｂの上位側のハーフワード（elrisi2[0:15] ）を選択する。eldisatshr＝０の場合すなわち判定結果が飽和の場合には、セレクタ２３２が出力する値を選択する。
【００８５】
セレクタ２３２は、レジスタ２０２の最上位ビット（elrisi2[0]）すなわち上位側のハーフワードの符号が「１＝負」であるときには、セレクタ２３０が出力する値、この場合には１６ビットのデコード値eldisat16do をそのまま出力する。デコード値eldisat16do は、既に説明したように、下位側から［レジスタ２００の値−１］のビット数分だけ「０」で、それ以外の上位側は「１」になっている値である。換言すれば、レジスタ２００に設定されている４ビットの値をｎとすると、値eldisat16do は−２n-1 になっている。すなわち、飽和演算を行った結果の負の絶対値最大の値になっている。レジスタ２０２の最上位ビット（elrisi2[0]）すなわち上位側のハーフワードの符号が「０＝正」であるときには、セレクタ２３２は、セレクタ２３０が出力する値をビット反転した値を出力する。この値は、２n-1 −１であり飽和演算を行った結果の正の絶対値最大の値になっている。
【００８６】
以上のようにして、セレクタ２３６から、被飽和演算値Ｒｂの上位側のハーフワードが飽和していないときには、上位側のハーフワードがそのまま出力され、飽和しているときには、飽和演算を行った結果の絶対値最大の値が出力される。
【００８７】
制御信号（E1HISFTHFW）２１０が「１」を示しているので、セレクタ２４３は、結果信号２１５を値eldisatslrとしてセレクタ２３７に与える。セレクタ２３７は、eldisatslr＝１の場合すなわち判定結果が非飽和の場合には、被飽和演算値Ｒｂの下位側のハーフワード（elrisi2[0:15] ）を選択する。eldisatshr＝０の場合すなわち判定結果が飽和の場合には、セレクタ２３３が出力する値を選択する。
【００８８】
セレクタ２３３は、この場合にはセレクタ２４０からレジスタ２０２のビット＃１６（elrisi2[16] ）すなわち下位側のハーフワードの符号を受け、それが「１＝負」であるときには、仮想の変換器２３１が出力する値、この場合には１６ビットのデコード値eldisat16do に相当する値をそのまま出力する。すなわち、飽和演算を行った結果の負の絶対値最大の値を出力する。レジスタ２０２のビット＃１６（elrisi2[16] ）すなわち下位側のハーフワードの符号が「０＝正」であるときには、セレクタ２３３は、セレクタ２３１が出力する値をビット反転した値を出力する。すなわち、飽和演算を行った結果の正の絶対値最大の値を出力する。
【００８９】
以上のようにして、セレクタ２３７から、被飽和演算値Ｒｂの下位側のハーフワードが飽和していないときには、下位側のハーフワードがそのまま出力され、飽和しているときには、飽和演算を行った結果の絶対値最大の値が出力される。
【００９０】
現在実行している命令がＳＡＴＺ２Ｈ命令である場合には、被飽和演算値Ｒｂのそれぞれのハーフワードが負値のときには、０に飽和させなければならない。よって、セレクタ２３８は、レジスタ２０２の最上位ビット（elrisi2[0]）すなわち上位側のハーフワードの符号が「１＝負」である場合に、制御信号２１１がE1HISATZ＝１を示しているとき、すなわち、現在実行している命令がＳＡＴＺ２Ｈ命令であることを示しているときには、全ビット「０」の１６ビットの値を出力する。E1HISATZ＝０のときには、セレクタ２３８は、セレクタ２３６から出力された値をそのまま出力する。同様に、セレクタ２３９は、レジスタ２０２のビット＃１６（elrisi2[16] ）すなわち下位側のハーフワードの符号が「１＝負」である場合に、制御信号２１１がE1HISATZ＝１を示しているとき、すなわち、現在実行している命令がＳＡＴＺ２Ｈ命令であることを示しているときには、全ビット「０」の１６ビットの値を出力する。E1HISATZ＝０のときには、セレクタ２３９は、セレクタ２３７から出力された値をそのまま出力する。
【００９１】
演算器２５０は、セレクタ２３８が出力した値eldisatvhzを上位側の１６ビットとし、セレクタ２３９が出力した値eldisatvlzを下位側の１６ビットとして、１ワードの値eldisatoutを飽和演算の結果として出力する。この結果、２つのハーフワードのそれぞれについて飽和演算を行った結果が、１ワードに格納されて出力される。
【００９２】
以下、フルワード命令が実行される場合について説明する。
その場合には、制御信号（E1HISFTHFW）２１０は「０」を示している。従って、セレクタ２３０は、デコーダ２２１が出力した値eldisat32do の上位側１６ビットを値eldisatvhdとして選択する。仮想の変換器２３１が出力する値eldisatvldは、（表Ｂ］に示された出力値３２ビットのうちの下位側の１６ビットである。
【００９３】
この場合、セレクタ２３４，２３５および演算器２２６，２２７，２２８は、１ワードの被飽和演算値Ｒｂが絶対値最大値を越えているかどうか判断する。セレクタ２３４は、レジスタ２０２の最上位ビット（elrisi2[0]）すなわち被飽和演算値Ｒｂの符号が「０」であるときには、被飽和演算値Ｒｂの上位側の１６ビットをそのまま出力する。つまり、被飽和演算値Ｒｂが正数であるときには、上位側の１６ビットをそのまま出力する。レジスタ２０２の最上位ビット（elrisi2[0]）が「１」であるときには、セレクタ２３４は、上位側の１６ビットがインバータ２２４でビット反転されたものを出力する。
【００９４】
フルワード演算の場合には、レジスタ２０２の最上位ビット（elrisi2[0]）は１ワード全体における符号ビットである。この場合には、制御信号（E1HISFTHFW）２１０は「０」を示しているので、セレクタ２４１から出力される値eldisatsliは、レジスタ２０２の最上位ビット（elrisi2[0]）である。従って、セレクタ２３５も、レジスタ２０２の最上位ビット（elrisi2[0]）を入力する。セレクタ２３５は、レジスタ２０２の最上位ビット（elrisi2[0]）すなわち被飽和演算値Ｒｂの符号が「０」であるときには、被飽和演算値Ｒｂの下位側の１６ビットをそのまま出力する。つまり、被飽和演算値Ｒｂが正数であるときには、下位側の１６ビットをそのまま出力する。レジスタ２０２の最上位ビット（elrisi2[0]）が「１」であるときには、セレクタ２３５は、下位側の１６ビットがインバータ２２４でビット反転されたものを出力する。
【００９５】
演算器２２６は、セレクタ２３０から出力された値eldisatvhdとセレクタ２３４が出力する値eldisatishとの間で、ビット毎の論理積をとる。演算器２２７は、仮想の変換器２３１から出力された値eldisatvldとセレクタ２３５が出力する値eldisatislとの間で、ビット毎の論理積をとる。この場合には、セレクタ２３０は、３２ビットのデコード値eldisat32do の上位側の１６ビットを出力している。また、仮想の変換器２３１は、３２ビットのデコード値eldisat32do の下位側の１６ビットを出力している。（表Ｂ］からわかるように、３２ビットのデコード値eldisat32do は、下位側から［レジスタ２００の値−１］のビット数分だけ「０」で、それ以外の上位側は「１」になっている値である。例えば、レジスタ２０１の設定値＝０１００（Ｂ）の場合には、セレクタ２３０から出力された値は、
eldisatvhd＝１１１１  １１１１  １１１１  １１１１（Ｂ）        …（４）
であり、仮想の変換器２３１から出力された値は、
eldisatvld＝１１１１  １１１１  １１１１  １０００（Ｂ）        …（５）
である。このとき、飽和値を越えていない３２ビットの値は、
００００  ００００  ００００  ００００
００００  ００００  ００００  ０１１１（Ｂ）（１０進で＋７）    …（６）
から
１１１１  １１１１  １１１１  １１１１
１１１１  １１１１  １１１１  １０００（Ｂ）（１０進で−８）    …（７）
までの範囲の値である。
【００９６】
負数に関して、ビット反転して考えると、
００００  ００００  ００００  ００００
００００  ００００  ００００  ００００（Ｂ）（１０進で０）
から
００００  ００００  ００００  ００００
００００  ００００  ００００  ０１１１（Ｂ）（１０進で７）      …（８）
であることがわかる。
【００９７】
正数では、飽和値を越えていない値は（６）で示された３２ビットの値以下の値であるから、（４），（５）で示される３２ビットの値と飽和値を越えていない値との間で、ビット毎の論理積がとられると、その結果は全ビット０の３２ビットの値になる。負数では、ビット反転して考えた場合の飽和値を越えていない値は（８）で示された３２ビットの値以下の値であるから、ビット毎の論理積がとられると、やはり、その結果は全ビット０の３２ビットの値になる。
【００９８】
すなわち、正数の被飽和演算値Ｒｂの上位１６ビットである値eldisatishと（４）で示される値の間でビット毎の論理積をとった場合に、全ビット０の１６ビットの値が得られ、かつ、被飽和演算値Ｒｂの下位１６ビットである値eldisatislと（５）で示される値の間でビット毎の論理積をとった場合に、全ビット０の１６ビットの値が得られたときには、その正数は飽和値を越えていないことになる。また、負数の被飽和演算値Ｒｂの上位１６ビットをビット反転したものと値eldisatvhdとの間でビット毎の論理積をとった場合に、全ビット０の１６ビットの値が得られ、かつ、負数の被飽和演算値Ｒｂの下位１６ビットをビット反転したものと値eldisatvldとの間でビット毎の論理積をとった場合に、全ビット０の１６ビットの値が得られたときには、その負数は飽和値を越えていないことになる。
【００９９】
演算器２２６，２２７は、それぞれ論理積処理を行った後にＮＯＲ処理を行っているので、被飽和演算値Ｒｂが飽和値を越えていなければ、演算器２２６，２２７の出力はともに「１」である。従って、演算器２２６，２２７の出力の論理積をとる演算器２２８は、被飽和演算値Ｒｂが飽和値を越えていなければ、「１」である。よって、フルワード演算の場合の飽和演算判定結果を示す結果信号２１６は、判定結果が飽和であれば「０」であり、非飽和であれば「１」を示す。
【０１００】
この場合には、制御信号（E1HISFTHFW）２１０は「０」を示しているので、セレクタ２４２は、結果信号２１６を値eldisatshrとしてセレクタ２３６に与える。同様に、セレクタ２４３は、結果信号２１６を値eldisatslrとしてセレクタ２３７に与える。セレクタ２３６は、eldisatshr＝１の場合すなわち判定結果が非飽和の場合には、被飽和演算値Ｒｂの上位１６ビットを選択し、eldisatshr＝０の場合すなわち判定結果が飽和の場合には、セレクタ２３２が出力する値を選択する。同様に、セレクタ２３７は、eldisatslr＝１の場合すなわち判定結果が非飽和の場合には、被飽和演算値Ｒｂの下位１６ビットを選択し、eldisatslr＝０の場合すなわち判定結果が飽和の場合には、セレクタ２３３が出力する値を選択する。
【０１０１】
セレクタ２３２は、レジスタ２０２の最上位ビット（elrisi2[0]）すなわち被飽和演算値Ｒｂの符号が「１＝負」であるときには、セレクタ２３０が出力する値、この場合には３２ビットのデコード値eldisat32do の上位１６ビットをそのまま出力する。デコード値eldisat32do は、既に説明したように、下位側から［レジスタ２００の値−１］のビット数分だけ「０」で、それ以外の上位側は「１」になっている値である。換言すれば、レジスタ２００に設定されている４ビットの値をｎとすると、値eldisat32do は−２n-1 になっている。すなわち、飽和演算を行った結果の負の絶対値最大の値になっている。従って、この場合には、負の絶対値最大の値の上位１６ビットが、セレクタ２３２から出力される。
同様に、セレクタ２３３は、レジスタ２０２の最上位ビット（elrisi2[0]）すなわち被飽和演算値Ｒｂの符号が「１＝負」であるときには、負の絶対値最大の値の下位１６ビットを出力する。なお、制御信号（E1HISFTHFW）２１０は「０」を示しているので、セレクタ２４０は、レジスタ２０２の最上位ビット（elrisi2[0]）すなわち被飽和演算値Ｒｂの符号をセレクタ２３３に与えている。
【０１０２】
レジスタ２０２の最上位ビット（elrisi2[0]）すなわち被飽和演算値Ｒｂの符号が「０＝正」であるときには、セレクタ２３２は、セレクタ２３０が出力する値をビット反転した値を出力する。この値は、２n-1 −１を３２ビットで表現した値の上位１６ビットであり、飽和演算を行った結果の正の絶対値最大の値の上位１６ビットになっている。また、セレクタ２３３は、セレクタ２３１が出力する値をビット反転した値を出力する。この値は、２n-1 −１を３２ビットで表現した値の下位１６ビットであり、飽和演算を行った結果の正の絶対値最大の値の下位１６ビットになっている。
【０１０３】
以上のようにして、フルワードの被飽和演算値Ｒｂが飽和値を越えていないときには、セレクタ２３６から、被飽和演算値Ｒｂの上位側の１６ビットがそのまま出力される。飽和値を越えているときには、飽和演算を行った結果の絶対値最大の上位側の１６ビットの値が出力される。また、被飽和演算値Ｒｂが飽和値を越えていないときには、セレクタ２３７から、被飽和演算値Ｒｂの下位側の１６ビットがそのまま出力される。飽和値を越えているときには、飽和演算を行った結果の絶対値最大の下位側の１６ビットの値が出力される。
【０１０４】
現在実行している命令がＳＡＴＺ命令である場合には、被飽和演算値Ｒｂが負値のときには、０に飽和させなければならない。よって、セレクタ２３８は、レジスタ２０２の最上位ビット（elrisi2[0]）すなわち被飽和演算値Ｒｂの符号が「１＝負」である場合に、制御信号２１１がE1HISATZ＝１を示しているとき、すなわち、現在実行している命令がＳＡＴＺ命令であることを示しているときには、全ビット「０」の１６ビットの値を出力する。E1HISATZ＝０のときには、セレクタ２３８は、セレクタ２３６から出力された値をそのまま出力する。同様に、セレクタ２３９は、レジスタ２０２の最上位ビット（elrisi2[0]）すなわち被飽和演算値Ｒｂの符号が「１＝負」である場合に、制御信号２１１がE1HISATZ＝１を示しているとき、すなわち、現在実行している命令がＳＡＴＺ命令であることを示しているときには、全ビット「０」の１６ビットの値を出力する。E1HISATZ＝０のときには、セレクタ２３９は、セレクタ２３７から出力された値をそのまま出力する。
【０１０５】
演算器２５０は、セレクタ２３８が出力した値eldisatvhzを上位側の１６ビットとし、セレクタ２３９が出力した値eldisatvlzを下位側の１６ビットとして、１ワードの値eldisatoutを飽和演算の結果として出力する。
【０１０６】
以上のように、この実施の形態１によれば、データを任意のビット長の値に飽和させる飽和演算を１命令で実行することが可能になる。従って、ＭＰＥＧ２ビデオデコード処理のように、複数種類のビット長の値に飽和させる飽和演算が要求されるアプリケーションの処理を、従来の場合に比べて、少ない命令コード数およびクロックサイクルで実行できる。また、飽和演算をサブワード単位で実行することができる。さらに、被飽和演算値が負値の場合に０に飽和させることもでき、アプリケーション処理をより容易に行える環境を提供できる。
【０１０７】
実施の形態２．
図７はこの発明の実施の形態２によるマイクロプロセッサの飽和演算器を示すブロック図である。図において、３００は符号なしのシフト数にもとづいて算術右シフト演算を行う３２ビットのシフタ（判定手段、任意ビット長飽和手段、サブワード判定手段）、３０１はシフタ３００が出力する値eldisftoutの上位の各１６ビットの全てが「１」または「０」である場合に、上位側飽和演算判定の結果信号２１４として飽和していないことを示す「０」を出力する演算器（判定手段、任意ビット長飽和手段、サブワード判定手段）、３０２はシフタが出力する値eldisftoutの下位の各１６ビットの全てが「１」または「０」である場合に、下位側飽和演算判定の結果信号２１５として飽和していないことを示す「０」を出力する演算器（判定手段、任意ビット長飽和手段、サブワード判定手段）である。
その他のものは、図６に示したものと同じものである。
【０１０８】
次に動作について説明する。
命令においてＲｂレジスタとして指定された汎用レジスタ５中の具体的なレジスタの内容がレジスタ２０２に設定される。現在実行しようとする命令がフルワード命令である場合には、Ｒｃレジスタとして指定された汎用レジスタ５中の具体的なレジスタのビット＃２７〜＃３１の値、または６ビットの即値におけるビット＃１〜＃５がレジスタ２０１に設定される。現在実行しようとする命令がハーフワード命令である場合には、Ｒｃレジスタとして指定された汎用レジスタ５中の具体的なレジスタのビット＃１２〜＃１５の値または６ビットの即値におけるビット＃２〜＃５がレジスタ２００に設定され、ビット＃２８〜＃３１の値または６ビットの即値におけるビット＃２〜＃５がレジスタ２０１に設定される。
【０１０９】
デコーダ２２０は、実施の形態１の場合と同様に、レジスタ２００に書き込まれた４ビットの値を入力として、１６ビットのデコード値eldisat16do を出力する。この値は、負の被飽和演算値Ｒｂに対して０〜１５ビットのいずれかの範囲で飽和演算を行った結果の負の絶対値最大の値を示している。また、デコーダ２２１は、レジスタ２０１に書き込まれた５ビットの値を入力として、３２ビットのデコード値eldisat32do を出力する。この値は、負の被飽和演算値Ｒｂに対して０〜３１ビットのいずれかの範囲で飽和演算を行った結果の負の絶対値最大の値を示している。
【０１１０】
以下、ハーフワード命令が実行される場合について説明する。
その場合には、制御信号（E1HISFTHFW）２１０は「１」を示している。E1HISFTHFW＝１のときには、シフタ３００は、レジスタ２０２から２つのハーフワードを入力し、レジスタ２００から４ビットの値を入力するとともにレジスタ２０１から５ビットの値を入力する。シフタ３００は、レジスタ２００，２０１から入力された各値を符号なしの値として扱う。また、シフタ３００は、１６ビット×２段のシフタとして動作する。
【０１１１】
レジスタ２００に設定されている４ビットの値は、飽和演算ビット長bith_satである。シフタ３００は、上位側のハーフワードを、レジスタ２００からの４ビットの値が示すビット数分だけ算術右シフトする。シフト結果は、飽和演算において許される範囲内の値に関するビットが全てシフトアウトされたものである。すなわち、上位側のハーフワードが飽和値を越えていず、かつ、正数であったときには、シフトの結果、１６ビット全てが「０」になる。上位側のハーフワードが飽和値を越えていず、かつ、負数であったときには、シフトの結果、１６ビット全てが「１」になる。また、上位側のハーフワードが飽和値を越えていたときには、１６ビット中に「０」または「１」のビットが残る。
【０１１２】
同様に、下位側のハーフワードを、レジスタ２０１からの５ビットのうち下位４ビットの値が示すビット数分だけ算術右シフトする。下位側のハーフワードが飽和値を越えていず、かつ、正数であったときには、シフトの結果、１６ビット全てが「０」になる。下位側のハーフワードが飽和値を越えていず、かつ、負数であったときには、シフトの結果、１６ビット全てが「１」になる。下位側のハーフワードが飽和値を越えていたときには、１６ビット中に「０」または「１」のビットが残る。
【０１１３】
例えば、レジスタ２００の設定値＝０１００（Ｂ）の場合に、飽和値を越えていない値は、
００００  ００００  ００００  ０１１１（Ｂ）（１０進で＋７）
から
１１１１  １１１１  １１１１  １０００（Ｂ）（１０進で−８）
までの範囲の値である。
従って、飽和値を越えていない値を４ビット分だけ算術右シフトすると、その値が正数であったときには、シフトの結果、全ビット「０」になる。その値が負数であったときには、シフトの結果、全ビット「１」になる。
【０１１４】
シフタ３００は、上位側のハーフワードのシフト結果を上位１６ビットとし下位側のハーフワードのシフト結果を下位１６ビットとした値eldisftoutを出力する。演算器３０１は、シフタ３００からの値eldisftoutの上位１６ビットについて、全てのビットが「１」または「０」であるかどうか判定する。例えば、全てのビットを入力とする論理積をとるとともに、全てのビットを入力とするＮＯＲをとる。そして、論理積の結果とＮＯＲの結果との論理和をとる。すると、全てのビットが「１」または「０」である場合、すなわち、上位側のハーフワードが飽和値を越えていない場合には、論理和の結果が「１」になる。演算器３０１は、論理和の結果を結果信号２１４として出力する。
【０１１５】
演算器３０２は、シフタ３００からの値eldisftoutの下位１６ビットについて、全てのビットが「１」または「０」であるかどうか判定する。例えば、全てのビットを入力とする論理積をとるとともに、全てのビットを入力とするＮＯＲをとる。そして、論理積の結果とＮＯＲの結果との論理和をとる。すると、全てのビットが「１」または「０」である場合には、論理和の結果が「１」になる。演算器３０２は、論理和の結果を結果信号２１５として出力する。
【０１１６】
以降の動作は、実施の形態１の場合と同じである。従って、演算器２５０から、セレクタ２３８が出力した値eldisatvhzを上位側の１６ビットのハーフワードとし、セレクタ２３９が出力した値eldisatvlzを下位側の１６ビットのハーフワードとする１ワードの値eldisatoutが飽和演算の結果として出力される。
【０１１７】
以下、フルワード命令が実行される場合について説明する。
その場合には、制御信号（E1HISFTHFW）２１０は「０」を示している。E1HISFTHFW＝０のときには、シフタ３００は、レジスタ２０２からフルワードの被飽和演算値Ｒｂを入力し、レジスタ２０１から５ビットの値を入力する。シフタ３００は、レジスタ２０１から入力された値を符号なしの値として扱う。また、シフタ３００は、３２ビット×１段のシフタとして動作する。
【０１１８】
レジスタ２０１に設定されている５ビットの値は、飽和演算ビット長bit_sat である。シフタ３００は、被飽和演算値Ｒｂを、レジスタ２０１からの５ビットの値が示すビット数分だけ算術右シフトする。すると、被飽和演算値Ｒｂが飽和値を越えていず、かつ、正数であったときには、シフトの結果、３２ビット全てが「０」になる。被飽和演算値Ｒｂが飽和値を越えていず、かつ、負数であったときには、シフトの結果、３２ビット全てが「１」になる。また、被飽和演算値Ｒｂが飽和値を越えていたときには、３２ビット中に「０」または「１」のビットが残る。
【０１１９】
シフタ３００は、シフト結果を値eldisftoutとして出力する。演算器３０１，３０２は、それぞれ、シフタ３００からの値eldisftoutの上位１６ビットまたは下位１６ビットについて、全てのビットが「１」または「０」であるかどうか判定する。全てのビットが「１」または「０」である場合、すなわち、被飽和演算値Ｒｂが飽和値を越えていない場合には、演算器３０１，３０２の出力がともに「１」になる。被飽和演算値Ｒｂが飽和値を越えていた場合には、演算器３０１，３０２のいずれか一方または双方が「０」になる。演算器３０１，３０２は、それぞれ、判定結果を結果信号２１４，２１５として出力する。演算器２２８は、結果信号２１４と結果信号２１５との論理積をとり、その結果を結果信号２１６として出力する。結果信号２１６は、結果信号２１４，２１５がともに「１」であったときに、すなわち、被飽和演算値Ｒｂが飽和値を越えていないときに「１」を示す。
【０１２０】
以降の動作は、実施の形態１の場合と同じである。従って、演算器２５０から、セレクタ２３８が出力した値eldisatvhzを上位側の１６ビットとし、セレクタ２３９が出力した値eldisatvlzを下位側の１６ビットとする１ワードの値eldisatoutが飽和演算の結果として出力される。
【０１２１】
この実施の形態２によっても、データを任意のビット長の値に飽和させる飽和演算を１命令で実行することが可能になる。従って、ＭＰＥＧ２ビデオデコード処理のように、複数種類のビット長の値に飽和させる飽和演算が要求されるアプリケーションの処理を、従来の場合に比べて、少ない命令コード数およびクロックサイクルで実行できる。また、飽和演算をサブワード単位で実行することができる。さらに、被飽和演算値が負値の場合に０に飽和させることもでき、アプリケーション処理をより容易に行える環境を提供できる。
【０１２２】
実施の形態３．
図８はこの発明の実施の形態３によるマイクロプロセッサの飽和演算器を示すブロック図である。図において、３１０は実施の形態１におけるデコーダ２２０に代えて設けられたシフタ（飽和値生成手段、任意ビット長飽和手段、サブワード飽和値生成手段）、３１１は実施の形態１におけるデコーダ２２１に代えて設けられたシフタ（飽和値生成手段、任意ビット長飽和手段）である。その他のものは図６に示されたものと同じものである。
【０１２３】
次に動作について説明する。
シフタ３１０は、全ビット「１」の１６ビットの値「１１１１  １１１１  １１１１  １１１１（Ｂ）」を被シフト値として、（レジスタ２００の４ビットの値−１）ビットだけ左シフトを行う１６ビットシフタである。ここで、レジスタ２００の４ビットの値は、符号なし値として扱われる。シフタ３１１は、全ビット「１」の３２ビットの値「１１１１  １１１１  １１１１  １１１１  １１１１  １１１１  １１１１  １１１１（Ｂ）」を被シフト値として、（レジスタ２０１の５ビットの値−１）ビットだけ左シフトを行う３２ビットシフタである。ここで、レジスタ２０１の５ビットの値は、符号なし値として扱われる。
【０１２４】
図６に示されたデコーダ２２０は、飽和演算ビット長bith_satを格納する４ビット長のレジスタ２００の値をデコードして１６ビットのデコード値を出力しているが、それらのデコード値は、（表Ａ］からわかるように、１６ビットの値「１１１１  １１１１  １１１１  １１１１（Ｂ）」を被シフト値として、（レジスタ２００の４ビットの値−１）ビットだけ左シフトした値である。また、デコーダ２２１は、飽和演算ビット長bit_sat を格納する５ビット長のレジスタ２０１の値をデコードして３２ビットのデコード値を出力しているが、それらのデコード値は、（表Ｂ］からわかるように、３２ビットの値「１１１１  １１１１  １１１１  １１１１  １１１１  １１１１  １１１１  １１１１（Ｂ）」を被シフト値として、（レジスタ２０１の５ビットの値−１）ビットだけ左シフトした値である。
【０１２５】
すなわち、シフタ３１０，３１１によるシフト結果は、デコーダ２２０，２２１が出力する値eldisat16do ，eldisat32do と同じになっている。従って、図８に示された飽和演算器は、図６に示された飽和演算器と同じ動作を行う。
なお、ここでは実施の形態１におけるデコーダ２２０，２２１に代えてシフタ３１０，３１１が設けられた例を示したが、図７に示された実施の形態２におけるデコーダ２２０，２２１に代えてシフタ３１０，３１１を設けてもよい。
【０１２６】
この実施の形態３によっても、データを任意のビット長の値に飽和させる飽和演算を１命令で実行することが可能になる。従って、ＭＰＥＧ２ビデオデコード処理のように、複数種類のビット長の値に飽和させる飽和演算が要求されるアプリケーションの処理を、従来の場合に比べて、少ない命令コード数およびクロックサイクルで実行できる。また、飽和演算をサブワード単位で実行することができる。さらに、被飽和演算値が負値の場合に０に飽和させることもでき、アプリケーション処理をより容易に行える環境を提供できる。
【０１２７】
【発明の効果】
以上のように、請求項１記載の発明によれば、飽和演算命令を有するマイクロプロセッサを、命令で指定された任意ビット長で表現される飽和値に被飽和演算値を飽和させる任意ビット長飽和手段を備えるように構成したので、データを任意のビット長の値に飽和させる飽和演算を１命令で実行することが可能になり、少ない命令コード数およびクロックサイクルで飽和演算を実行できる効果がある。
【０１２８】
請求項２記載の発明によれば、飽和演算命令を有するマイクロプロセッサを、命令で指定されたビット長の飽和値を生成する飽和値生成手段と、被飽和演算値が飽和値を越えている場合に飽和値生成手段の生成値を出力する出力手段とを備えるように構成したので、データを任意のビット長の値に飽和させる飽和演算を１命令で実行することができる効果がある。
【０１２９】
請求項３記載の発明によれば、飽和演算命令を有するマイクロプロセッサを、負数の被飽和演算値をゼロに飽和させるゼロ飽和手段を含むように構成したので、アプリケーション処理をより容易に行える環境を提供できる効果がある。
【０１３０】
請求項４記載の発明によれば、飽和演算命令を有するマイクロプロセッサを、飽和値生成手段がサブワード単位の飽和値を生成するとともにサブワード単位で被飽和演算値が飽和値を越えているか否か判定するように構成したので、飽和演算をサブワード単位で実行することができるようになって、アプリケーション処理をより容易に行える環境を提供できる効果がある。
【０１３１】
請求項５記載の発明によれば、飽和演算命令を有するマイクロプロセッサを、飽和値生成手段が命令で指定されたビット長で表現される飽和値を被飽和演算値のビット長の２進値にデコードするデコーダを含むように構成したので、任意のビット長の値への飽和演算およびサブワード飽和演算を１命令で実行できるようになり、アプリケーション処理をより容易に行える効果がある。
【０１３２】
請求項６記載の発明によれば、飽和演算命令を有するマイクロプロセッサを、全ビット１のデータをシフトして飽和値を生成するシフタを含むように構成したので、より簡易な構成で任意のビット長の値への飽和演算およびサブワード飽和演算を１命令で実行できる効果がある。
【０１３３】
請求項７記載の発明によれば、飽和演算命令を有するマイクロプロセッサを、判定手段が命令で指定されたビット長の分だけ被飽和演算値をビットシフトするシフタを含むように構成したので、さらに簡易な構成で任意のビット長の値への飽和演算およびサブワード飽和演算を１命令で実行できる効果がある。
【図面の簡単な説明】
【図１】  この発明の実施の形態１によるマイクロプロセッサの構成を示すブロック図である。
【図２】  マイクロプロセッサの命令フォーマットを示す説明図である。
【図３】  演算フィールドの詳細な内容を示す説明図である。
【図４】  マイクロプロセッサのレジスタ構成を示す説明図である。
【図５】  ＰＳＷの内容を詳細に示す説明図である。
【図６】  この発明の実施の形態１によるマイクロプロセッサの飽和演算器を示すブロック図である。
【図７】  この発明の実施の形態２によるマイクロプロセッサの飽和演算器を示すブロック図である。
【図８】  この発明の実施の形態３によるマイクロプロセッサの飽和演算器を示すブロック図である。
【符号の説明】
２  命令デコードユニット（命令デコーダ）、４  整数演算ユニット（命令実行部）、５  汎用レジスタ（レジスタ）、２１  飽和演算器、２２０  デコーダ（飽和値生成手段、任意ビット長飽和手段、サブワード飽和値生成手段）、２２１  デコーダ（飽和値生成手段、任意ビット長飽和手段）、２２６，２２７  演算器（判定手段、任意ビット長飽和手段、サブワード判定手段）、２２８  演算器（判定手段、任意ビット長飽和手段）、２３４，２３５  セレクタ（判定手段、任意ビット長飽和手段、サブワード判定手段）、２３６，２３７，２３８，２３９  セレクタ（出力手段、任意ビット長飽和手段）、２５０  演算器（出力手段、任意ビット長飽和手段、ゼロ飽和手段）、３００  シフタ（判定手段、任意ビット長飽和手段、サブワード判定手段）、３０１，３０２  演算器（判定手段、任意ビット長飽和手段、サブワード判定手段）、３１０  シフタ（飽和値生成手段、任意ビット長飽和手段、サブワード飽和値生成手段）、３１１  シフタ（飽和値生成手段、任意ビット長飽和手段）。
【図１】
0003701401.tif 000022
【図２】
0003701401.tif 000023
【図３】
0003701401.tif 000024
【図４】
0003701401.tif 000025
【図５】
0003701401.tif 000026
【図６】
0003701401.tif 000027
【図７】
0003701401.tif 000028
【図８】
0003701401.tif 000029