(57)【要約】【課題】  ＶＬＣ処理を処理する専用のハードウェア回路はソフトウェアで実装するのに比べてコストが高くつく。【解決手段】  原稿画像の複数のデータ要素を記憶し；第１のビット列のうちで前記複数のデータ要素の０のデータ要素群に関連付けられた第１のビットの組の各ビットに第１の値を割り当て、前記第１のビット列のうち前記複数のデータ要素の０でないデータ要素群に関連付けられた第２のビットの組の各ビットに前記第１の値とは異なる第２の値を割り当て；前記第１のビット列のなかで前記第１の値が連続する個数である第１の数を数え；前記複数のデータ要素のうち少なくとも１つの有効ビット数を求め；前記第１の数と前記有効ビット数とを符号化テーブルを用いてコードに変換し；前記コードを圧縮画像データのビット列に接続する画像データ圧縮方法。【選択図】図３０
2009273107.tif 000002
【特許請求の範囲】
【請求項１】
原稿画像の複数のデータ要素を記憶し；
第１のビット列のうちで前記複数のデータ要素の０のデータ要素群に関連付けられた第１のビットの組の各ビットに第１の値を割り当て、前記第１のビット列のうち前記複数のデータ要素の０でないデータ要素群に関連付けられた第２のビットの組の各ビットに前記第１の値とは異なる第２の値を割り当て；
前記第１のビット列のなかで前記第１の値が連続する個数である第１の数を数え；
前記複数のデータ要素のうち少なくとも１つの有効ビット数を求め；
前記第１の数と前記有効ビット数とを符号化テーブルを用いてコードに変換し；
前記コードを圧縮画像データのビット列に接続する、画像データ圧縮方法。
【請求項２】
前記第１の数は、前記第１のビット列のなかで前記第１の値がＭＳＢ側から連続する個数である、請求項１の画像データ圧縮方法。
【請求項３】
前記複数のデータ要素の逆加数群を求め；
前記複数のデータ要素のそれぞれが０より大きいか否かを判定した結果を表わす第２のビット列を求め；
前記第２のビット列に応じて前記複数のデータ要素と前記複数のデータ要素の逆加数群とから正の値を第３のビット列へ集めて前記有効ビット数を求める、請求項１の画像データ圧縮方法。
【請求項４】
前記複数のデータ要素のそれぞれから１を差し引かれた値である代替値群を求め；
前記複数のデータ要素のそれぞれが０より大きいか否かを判定した結果を表わす第２のビット列を求め；
前記第２のビット列に応じて前記複数のデータ要素と前記代替値群とから正の値を配列へ配置し、
前記配列のうちの１つの値を、前記圧縮画像データのビット列へ前記コードに続けて接続する、請求項１の画像データ圧縮方法。
【請求項５】
前記複数のデータ要素の逆加数群と、前記複数のデータ要素のそれぞれから１を差し引かれた値である代替値群とを求め；
前記逆加数群と前記代替値群とを求めるのと同時並行して、前記複数のデータ要素のそれぞれが０より大きいか否かを判定した結果を表わす第２のビット列を求める、請求項１の画像データ圧縮方法。
【請求項６】
前記第１のビット列から前記第１の数だけビットシフトされた値を求め；
前記シフトされた値のなかで前記第１の値が連続する個数である第２の数を数える、請求項１の画像データ圧縮方法。
【請求項７】
前記ビットシフトされた値は、前記第１のビット列から前記第１の数だけ左へビットシフトされた値である、請求項６の画像データ圧縮方法。
【請求項８】
ＬＳＢが前記第１の値である第１の多ビットデータを前記複数のデータ要素の０のデータ要素群に関連付け、ＬＳＢが前記第２の値である第２の多ビットデータを前記複数のデータ要素の０でないデータ要素群に関連付け；
前記複数のデータ要素のＬＳＢを前記第１のビット列へ集める、請求項１の画像データ圧縮方法。
【請求項９】
前記複数のデータ要素のうち少なくとも１つの有効ビット数を求めるのと同時並行して、前記複数のデータ要素のＬＳＢを前記第１のビット列へ集める、請求項８の画像データ圧縮方法。
【請求項１０】
前記逆加数群と前記代替値群とを求めるのと同時並行して、前記第１の多ビットデータを前記複数のデータ要素の０のデータ要素群に関連付け、前記第２の多ビットデータを前記複数のデータ要素の０でないデータ要素群に関連付ける、請求項８の画像データ圧縮方法。
【請求項１１】
前記複数のデータ要素のそれぞれが０より大きいか否かを判定した結果を表わす第２のビット列を求め；
前記複数のデータ要素のＬＳＢを前記第１のビット列へ集めるのと同時並行して、前記第２のビット列に応じて前記複数のデータ要素と前記複数のデータ要素の逆加数群とから正の値を第３のビット列へ集めて前記有効ビット数を求める、請求項１の画像データ圧縮方法。
【請求項１２】
原稿画像の複数のデータ要素を記憶する第１のレジスタと；
前記複数のデータ要素の０のデータ要素群に関連付けられ各ビットに第１の値を割り当てられた第１のビットの組と、前記複数のデータ要素の０でないデータ要素群に関連付けられ各ビットに前記第１の値とは異なる第２の値を割り当てられた第２のビットの組と、を有する第１のビット列を、記憶する第２のレジスタと；
前記第２のレジスタのなかで前記第１の値が連続する個数である第１の数を数え、前記複数のデータ要素のうち少なくとも１つの有効ビット数を求め、前記第１の数と前記有効ビット数とをコードに変換するＡＬＵと；
前記コードを圧縮画像データのビット列の一部として記憶するメモリアクセス部と；
を備える画像処理装置。
【請求項１３】
前記第１のビット列から前記第１の数だけビットシフトされた値を記憶する第３のレジスタを備え、
前記ＡＬＵは、前記第３のレジスタのなかで前記第１の値が連続する個数である第２の数を数える、請求項１２の画像処理装置。
【請求項１４】
前記複数のデータ要素の逆加数群を記憶する第３のレジスタと；
前記複数のデータ要素のそれぞれが０より大きいか否かを判定した結果を表わす第２のビット列を記憶する第４のレジスタと；
前記第２のビット列に応じて前記複数のデータ要素と前記複数のデータ要素の逆加数群とから集められた正の値を記憶する第５のレジスタと；を備え、
前記ＡＬＵは、前記第５のレジスタに記憶された前記正の値群から前記有効ビット数を求める、請求項１２の画像処理装置。
【請求項１５】
前記複数のデータ要素のそれぞれから１を差し引かれた値である代替値群を記憶する第３のレジスタと；
前記複数のデータ要素のそれぞれが０より大きいか否かを判定した結果を表わす第２のビット列を記憶する第４のレジスタと；
前記第２のビット列に応じて前記複数のデータ要素と前記代替値群とから集められた正の値群を記憶する第５のレジスタと；を備え、
メモリアクセス部は、前記第５のレジスタに記憶された値のうちの１つの値を、前記圧縮画像データのビット列へ前記コードに続けて接続する、請求項１２の画像処理装置。
【請求項１６】
前記複数のデータ要素の逆加数群を記憶する第３のレジスタと；
前記複数のデータ要素のそれぞれから１を差し引かれた値である代替値群を記憶する第４のレジスタと；
第１のＡＬＵが前記逆加数群と前記代替値群とを求めるのと同時並行して、前記複数のデータ要素のそれぞれが０より大きいか否かを判定した結果を表わす第２のビット列を求める第２のＡＬＵと；
を備える請求項１２の画像処理装置。
【請求項１７】
ＬＳＢが前記第１の値であり前記複数のデータ要素の０のデータ要素群に関連付けられた第１の多ビットデータと、ＬＳＢが前記第２の値であり前記複数のデータ要素の０でないデータ要素群に関連付けられた第２の多ビットデータと、を記憶する第３のレジスタ；を備え、
前記第２のレジスタは、前記第１のビットの組および前記第２のビットの組として、前記第３のレジスタのなかの単位ビット列毎のＬＳＢを集めたビット列を記憶する、請求項１２の画像処理装置。
【請求項１８】
前記第１のＡＬＵが前記複数のデータ要素のうち少なくとも１つの有効ビット数を求めるのと同時並行して、前記集合ビット列を第２のレジスタへ割り当てる第２のＡＬＵを備える、請求項１３の画像処理装置。
【請求項１９】
前記複数のデータ要素の逆加数群を記憶する第４のレジスタと；
前記複数のデータ要素のそれぞれから１を差し引かれた値である代替値群を記憶する第５のレジスタと；
前記第１のＡＬＵが前記第１の多ビットデータを前記複数のデータ要素の０のデータ要素群に関連付け前記第２の多ビットデータを前記複数のデータ要素の０でないデータ要素群に関連付けるのと同時並行して、前記逆加数群と前記代替値群とを求める第２のＡＬＵと；を備える、請求項１７の画像処理装置。
【請求項２０】
前記複数のデータ要素のそれぞれが０より大きいか否かを判定した結果を記憶する第４のレジスタと；
前記第１のＡＬＵが前記複数のデータ要素のＬＳＢを前記第２のレジスタへ集めるのと同時並行して、前記第４のレジスタに応じて前記複数のデータ要素と前記複数のデータ要素の逆加数群とから正の値を集める第２のＡＬＵと、を備え、
前記第１のＡＬＵは前記正の値群に応じて前記有効ビット数を求める、請求項１７の画像処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、画像データ圧縮方法および画像処理装置に関する。
【背景技術】
【０００２】
ＪＰＥＧとＭＰＥＧのような画像データ圧縮方法は、並列アルゴリズムで実装するのに適した処理を含む。例えば、色空間変換処理、ＤＣＴ（Ｄｉｓｃｒｅｔｅ  ｃｏｓｉｎｅ  ｔｒａｎｓｆｏｒｍ：離散コサイン変換）処理、ｉＤＣＴ（ｉｎｖｅｒｓｅ  ＤＣＴ：逆ＤＣＴ）処理および量子化処理は、並列アルゴリズムで実装するのに適する。特許文献１および特許文献２は、並列アルゴリズムで実装するのに適した処理を、ＳＩＭＤ（Ｓｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｍｕｌｔｉ  Ｄａｔａ）命令およびそのＳＩＭＤ命令を実行することができるプロセッサについて述べている。しかし、画像データ圧縮方法は並列アルゴリズムで実装するのに適さない処理も含む。例えば、ＶＬＣ（Ｖａｒｉａｂｌｅ  Ｌｅｎｇｔｈ  Ｃｏｄｉｎｇ：可変長符号化処理）は並列アルゴリズムで実装するのに適さない。特許文献１および特許文献２ではＶＬＣ処理をソフトウェアでなく専用のハードウェア回路によって処理するとしている。
【特許文献１】特開２０００−６９４７８号公報
【特許文献２】特開２００１−３０９３８６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
しかし、そのような専用のハードウェア回路はソフトウェアで実装するのに比べてコストが高くつく。
【課題を解決するための手段】
【０００４】
本発明の画像データ圧縮方法は、原稿画像の複数のデータ要素を記憶し；第１のビット列のうちで前記複数のデータ要素の０のデータ要素群に関連付けられた第１のビットの組の各ビットに第１の値を割り当て、前記第１のビット列のうち前記複数のデータ要素の０でないデータ要素群に関連付けられた第２のビットの組の各ビットに前記第１の値とは異なる第２の値を割り当て；前記第１のビット列のなかで前記第１の値が連続する個数である第１の数を数え；前記複数のデータ要素のうち少なくとも１つの有効ビット数を求め；前記第１の数と前記有効ビット数とを符号化テーブルを用いてコードに変換し；前記コードを圧縮画像データのビット列に接続するものである。
【０００５】
また、本発明の画像処理装置は、原稿画像の複数のデータ要素を記憶する第１のレジスタと；前記複数のデータ要素の０のデータ要素群に関連付けられ各ビットに第１の値を割り当てられた第１のビットの組と、前記複数のデータ要素の０でないデータ要素群に関連付けられ各ビットに前記第１の値とは異なる第２の値を割り当てられた第２のビットの組と、を有する第１のビット列を、記憶する第２のレジスタと；前記第２のレジスタのなかで前記第１の値が連続する個数である第１の数を数え、前記複数のデータ要素のうち少なくとも１つの有効ビット数を求め、前記第１の数と前記有効ビット数とをコードに変換するＡＬＵと；前記コードを圧縮画像データのビット列の一部として記憶するメモリアクセス部と；を備えるものである。
【発明の効果】
【０００６】
ＶＬＣを並列アルゴリズムで実装するのに適した部分をソフトウェアで実装することができる。
【発明を実施するための最良の形態】
【０００７】
以下、図面を参照して本発明の一実施の形態について説明する。本発明によれば、ＶＬＣ（可変長符号化処理）は、高速に画像データ圧縮処理を行うための並列アルゴリズムでの実装に適するよう組みかえることができる。
【０００８】
（１−１）ＪＰＥＧ圧縮の概要
図１は、ＪＰＥＧ圧縮法のフローチャートの一例である。ＪＰＥＧ圧縮法は例えば以下のように整理できる。
【０００９】
色空間変換（動作５０２）：
Ｒ（赤）、Ｇ（緑）およびＢ（青）の各色成分の値を表す画像データを、Ｙ（輝度成分）、Ｃｂ（青の差分成分）およびＣｒ（赤の差分成分）の各色成分の値を表わす別の画像データに変換する。以下、Ｒ、Ｇ、Ｂの各色成分をまとめてＲＧＢ成分と呼ぶ。ＲＧＢ成分の各値を示す画像データを、オリジナルのＲＧＢ画像データと呼ぶ。Ｙ、Ｃｂ、Ｃｒの各色成分をまとめてＹＣｂＣｒ成分と呼ぶ。ＹＣｂＣｒ成分の各値を示す画像データをＹＣｂＣｒ画像データと呼ぶ。
【００１０】
サンプリング（動作５０４）：
新たなＹＣｂＣｒ成分をＹＣｂＣｒ画像データから、改めて新たなＹＣｂＣｒ成分をサンプリングする。ＹＣｂＣｒ画像データの複数の画素から１個の新たなＹ成分をサンプリングしてもよい。例えば図２に示すように、新しいＹ成分２×２画素分６０２、６０４、６０６および６０８を、ＹＣｂＣｒ画像データ６００の１６ｘ１６画素から生成してもよい。新たなＹ成分の元となるＹＣｂＣｒ画像データの画素の正確な数は任意であり、毎度異なってもよい。さらに、新たなＣｂ成分や新たなＣｒ成分は新たなＹ成分と個数が異なってもよい。例えば、４：２：２サブサンプリング比においては、新たなＹ成分４個と、新たなＣｂ成分および新たなＣｒ成分それぞれ２個ずつとが、１６ｘ１６画素分のＹＣｂＣｒ画像データからサンプリングされる。また図２に示すように、４：１：１サブサンプリング比においては、新たなＹ成分４個と、新たなＣｂ成分および新たなＣｒ成分それぞれ１個ずつとが、１６ｘ１６画素分のＹＣｂＣｒ画像データからサンプリングされる。新たなＹＣｂＣｒ成分はそれぞれ８ｘ８個ずつ整理される。
【００１１】
ＤＣＴ（動作５０６）：
各成分について８ｘ８個単位でＤＣＴ処理が施される。図３は、４：１：１サブサンプリング比において生成された成分を示す図である。それぞれ８ｘ８個単位の新たなＣｂ成分６３０と新たなＣｒ成分６３２は、８ｘ８個単位の新たなＹ成分のまとまり４個６２２，６２４，６２６，６２８に対応する。各単位６２２乃至６３２はそれぞれ、同じく８ｘ８個単位のＭＣＵ（Ｍｉｎｉｍｕｍ  Ｃｏｄｅｄ  Ｕｎｉｔ）６４２乃至６５２へと変換される。図４は、新たなＹ成分のＭＣＵの一例である。各ＭＣＵは８ｘ８個の成分を含む。一般に、ＭＣＵ６６０のＤＣ（直流）成分６６２は、ＭＣＵ６６０を示すマトリクスの最左上位置に描かれる。他の６３個のＡＣ（交流）成分６６４は、それらの対応する周波数や方向の順に最左上位置から描かれる。図４では、左の文字が、Ｙ、ＣｂあるいはＣｒといった成分の種類を示す。中央の数字は水平方向の周波数０〜７を示す。また、右の数字は垂直方向の周波数０〜７を示す。
【００１２】
量子化（動作５０８）：
各ＭＣＵは重み係数で量子化される。重み係数はＭＣＵの成分に対応する８ｘ８成分を含む。
【００１３】
色空間変換（動作５０２）、サンプリング（動作５０４）、ＤＣＴ（動作５０６）および量子化（動作５０８）をまとめて前処理５１６と呼ぶ。前処理５１６としては、画像データに依存せず並列アルゴリズムで実装するのに適した種々様々な変形例を採用してよい。
【００１４】
一方、ＶＬＣ  ５１８は、以下に説明する、画像データへの依存を避けるのが難しいとされていた処理を含む。
【００１５】
ジグザグスキャン（動作５１０）：
２次元マトリクスとして表されていた量子化された各ＭＣＵの成分は、ジグザグスキャンによって１次元マトリクスへ移される。図５は、新たなＹ成分２次元ＭＣＵ６６０および１次元ＭＣＵ６６６の一例である。２次元ＭＣＵ６６０に含まれる成分は、最左上位置から最右下位置へ続く太線６６８で示される順でスキャンされ、１次元ＭＣＵ６６６へスキャンされた順に並べられる。１次元ＭＣＵ６６６のなかで、最初の成分はＤＣ成分、６４番めの成分は最も高い周波数のＡＣ成分である。
【００１６】
ランレングス符号化（動作５１２）：
１次元ＭＣＵ６６６の中で連続する０のデータの数が、有効ビット数として数えられる。つまり、１次元ＭＣＵ６６６はランレングス符号化によりエンコードされる。有効ビット数と、連続する０のデータにつづく０でないデータが抽出される。
【００１７】
ハフマン符号化（動作５１４）：
ハフマン符号化は、ＤＣ成分の０のデータの有効ビット数は独立してハフマン符号化される。ＤＣ成分のうちで０のデータの直後の０でないデータは、独立してハフマン符号化されたＤＣ成分の０のデータの後ろに接続される。ＡＣ成分の０のデータの有効ビット数は、０でないデータの有効ビット数と共に、ハフマン符号化される。１次元ＭＣＵの中では、０でないデータは、０のデータの直後にある。０でないデータはハフマン符号化された有効ビット数の後に接続される。
【００１８】
０のデータが１６個以上連続する場合は、１６の代わりにＺＲＬ（Ｚｅｒｏ  Ｒｕｎ  Ｌｅｎｇｔｈ）コードをハフマン符号化する。ハフマン符号化されたＺＲＬコードは、ハフマン符号化された有効ビット数と０でないデータとを接続したもの代わりに使われる。余りの０のデータの個数、つまり１６個以上連続する０のデータの個数から１６を引いた値は、０のデータの有効ビット数は、０でないデータの有効ビット数と共に、ハフマン符号化される。ハフマン符号化された有効ビット数と０でないデータとは、ハフマン符号化される前の成分の周波数の順に一次元的に接続されて、符号化データとなる。符号化データの最後のデータが０でない場合、ハフマンコード化されたＥＯＢ（Ｅｎｄ  Ｏｆ  Ｂｌｏｃｋ）コードが、符号化データの最後に接続される。ＪＰＥＧ圧縮法は例えば以上のように整理できる。以下、ＶＬＣ５１８の実装の一例を図６を用いて説明する。
【００１９】
（１−２）ＶＬＣの一例
図６はＶＬＣの一例を示すフローチャートである。動作７０２で、輝度成分ＹのＭＣＵの総数が変数Ｍに与えられ、変数Ｎが０に初期化される。動作７０４で、Ｎ個めの輝度成分ＹのＭＣＵであるＭＣＵ［Ｎ］がハフマン符号化される。動作７０６で、変数Ｎが１繰り上げられる。変数Ｍと変数Ｎとの関係が判定される。変数Ｎが変数Ｍ未満であれば、輝度成分ＹのＭＣＵのハフマン符号化が続けられる。つまり、変数Ｎが変数Ｍを超えるまで、動作７０６で１繰り上げられた変数Ｎを用いて動作７０４が再々実行される（動作７０８のＮＯ）。変数Ｎが変数Ｍを超えたら、すべての輝度成分ＹのＭＣＵがハフマン符号化されたということなので、動作７０４の繰り返し実行が終了される（動作７０８のＹｅｓ）。以下、動作７０２から動作７０８までをまとめて、Ｙハフマン符号化７３０と呼ぶ。
【００２０】
動作７１２で、青の差分成分ＣｂのＭＣＵの総数が変数Ｍに与えられ、変数Ｎが０に初期化される。動作７１４で、Ｎ個めの青の差分成分ＣｂのＭＣＵであるＭＣＵ［Ｎ］がハフマン符号化される。動作７１６で、変数Ｎが１繰り上げられる。変数Ｍと変数Ｎとの関係が判定される。変数Ｎが変数Ｍ未満であれば、青の差分成分ＣｂのＭＣＵのハフマン符号化が続けられる。つまり、変数Ｎが変数Ｍを超えるまで、動作７１６で１繰り上げられた変数Ｎを用いて動作７１４が再々実行される（動作７１８のＮＯ）。変数Ｎが変数Ｍを超えたら、すべての青の差分成分ＣｂのＭＣＵがハフマン符号化されたということなので、動作７１４の繰り返し実行が終了される（動作７１８のＹｅｓ）。以下、動作７１２から動作７１８までをまとめて、Ｃｂハフマン符号化７３２と呼ぶ。
【００２１】
動作７２２で、赤の差分成分ＣｒのＭＣＵの総数が変数Ｍに与えられ、変数Ｎが０に初期化される。動作７２４で、Ｎ個めの赤の差分成分ＣｒのＭＣＵであるＭＣＵ［Ｎ］がハフマン符号化される。動作７２６で、変数Ｎが１繰り上げられる。変数Ｍと変数Ｎとの関係が判定される。変数Ｎが変数Ｍ未満であれば、赤の差分成分ＣｒのＭＣＵのハフマン符号化が続けられる。つまり、変数Ｎが変数Ｍを超えるまで、動作７２６で１繰り上げられた変数Ｎを用いて動作７２４が再々実行される（動作７２８のＮＯ）。変数Ｎが変数Ｍを超えたら、すべての赤の差分成分ＣｒのＭＣＵがハフマン符号化されたということなので、動作７２４の繰り返し実行が終了される（動作７２８のＹｅｓ）。以下、動作７２２から動作７２８までをまとめて、Ｃｒハフマン符号化７３４と呼ぶ。
【００２２】
全ての成分の全てのＭＣＵがそれぞれハフマン符号化されたらＶＬＣ５１８が完了する。Ｙハフマン符号化７３０とＣｂハフマン符号化７３２とＣｒハフマン符号化７３４とは相互依存性がない。従って、Ｙハフマン符号化７３０とＣｂハフマン符号化７３２とＣｒハフマン符号化７３４とはそれぞれ独立したプロセスで処理され得る。例えば、プロセッサ上でプロセスＡとしてＹハフマン符号化７３０が処理され、プロセスＡと並行して存在するプロセスＢとしてＣｂハフマン符号化７３２がプロセッサ上で時分割処理あるいは並列処理され、プロセスＡやプロセスＢと並行して存在するプロセスＣとしてＣｒハフマン符号化７３４がプロセッサ上で時分割処理あるいは並列処理されてもよい。
【００２３】
Ｙハフマン符号化７３０とＣｂハフマン符号化７３２とＣｒハフマン符号化７３４とを処理するプロセッサシステムがプロセッサＡ、プロセッサＢ、プロセッサＣというようにマルチプロセッサを有するものであるなら、例えば、プロセッサＡ上でプロセスＡとしてＹハフマン符号化７３０が処理され、プロセスＡと並行して存在するプロセスＢとしてＣｂハフマン符号化７３２がプロセッサＢ上で時分割処理あるいは並列処理され、プロセスＡやプロセスＢと並行して存在するプロセスＣとしてＣｒハフマン符号化７３４がプロセッサＣ上で時分割処理あるいは並列処理されてもよい。ここで、マルチプロセッサとは、例えば複数のプロセッサを有するシステムや、複数のコアやコプロセス構成を有するプロセッサを含むシステムや、その他同様のシステムである。
【００２４】
また、Ｙハフマン符号化７３０とＣｂハフマン符号化７３２とＣｒハフマン符号化７３４とはそれぞれ独立したタスクとして処理されてもよい。例えば、タスクＡとしてＹハフマン符号化７３０が処理され、タスクＡと並行して存在するタスクＢとしてＣｂハフマン符号化７３２が時分割処理あるいは並列処理され、タスクＡやタスクＢと並行して存在するタスクＣとしてＣｒハフマン符号化７３４が時分割処理あるいは並列処理されるといった、マルチタスク処理と呼ばれるシステムで処理されてもよい。
【００２５】
さらに、Ｙハフマン符号化７３０とＣｂハフマン符号化７３２とＣｒハフマン符号化７３４とは、プロセスとタスクのバランスを均すべく複数のプロセスや複数のタスクへと分配されてもよい。例えば、４：１：１サブサンプリング比が動作５０４で適用されたら、輝度成分ＹのＭＣＵ全てのうち半分をプロセッサＡあるいはタスクＡに割り当て、青の差分成分ＣｂのＭＣＵ全てと輝度成分ＹのＭＣＵ全てのうち１／４をプロセッサＢあるいはタスクＢに割り当て、赤の差分成分Ｃｒと輝度成分ＹのＭＣＵ全てのうち１／４をプロセッサＣあるいはタスクＣに割り当ててもよい。ＶＬＣ５１８は例えば以上のように実装してもよい。以下、動作７０４，７１４，７２４と置換可能であるハフマン符号化の第１の実装形態について、図７乃至図１１を用いて説明する。
【００２６】
（１−３）ハフマン符号化の第１の実装形態
図７はハフマン符号化の第１の実装形態に係るフローチャートの一部である。動作８０２で、ＭＣＵ［Ｎ］のＤＣ成分とＭＣＵ［Ｎ−１］のＤＣ成分との差が求められる。変数Ｎが０であれば、ＭＣＵ［Ｎ−１］の値として０が用いられる。動作８０４で、ＭＣＵ［Ｎ］のＤＣ成分とＭＣＵ［Ｎ−１］のＤＣ成分との差が、変数ｔｅｍｐと変数ｔｅｍｐ２とに代入される。動作８０６で、変数ｔｅｍｐが０と比較される。変数ｔｅｍｐが０より小さければ（動作８０６のＹｅｓ）、動作８０８で、変数ｔｅｍｐを０から引いた値が改めて変数ｔｅｍｐに代入されかつ変数ｔｅｍｐ２の値が１繰り下げられる。変数ｔｅｍｐが０より小さくなければ（動作８０６のＮｏ）、動作８０８は実行されない。作８１０で、変数ｎｂｉｔに０が代入される。動作８１２で、変数ｔｅｍｐが０と比較される。変数ｔｅｍｐが０より大きければ（動作８１２のＹｅｓ）、動作８１４で変数ｔｅｍｐは１ビット右へシフトされ、変数ｎｂｉｔが１繰り上げられ、動作８１２が再び実行される。変数ｔｅｍｐが０より小さくなければ（動作８０６のＮｏ）、動作８１２から動作８１４を含むループ処理が終了する。つまり、変数ｔｅｍｐが０に達するまで、変数ｎｂｉｔが１ずつ繰り上げられながら変数ｔｅｍｐの値は右シフトされてゆく。従って変数ｎｂｉｔの値は、ＭＣＵ［Ｎ］のＤＣ成分とＭＣＵ［Ｎ−１］のＤＣ成分との差の有効桁数を示すことになる。
【００２７】
動作８１２のＮｏのほうへ進んだ時点では、例えばＭＣＵ［Ｎ］のＤＣ成分とＭＣＵ［Ｎ−１］のＤＣ成分との差が１０であれば変数ｔｅｍｐの値は１０、変数ｔｅｍｐ２の値は１０、変数ｎｂｉｔの値は４、変数ｔｅｍｐ２の有効桁は２進数で１０１０となる。また、例えばＭＣＵ［Ｎ］のＤＣ成分とＭＣＵ［Ｎ−１］のＤＣ成分との差が３２であれば変数ｔｅｍｐの値は３２、変数ｔｅｍｐ２の値は３２、変数ｎｂｉｔの値は５、変数ｔｅｍｐ２の有効桁は２進数で１００００となる。また、例えばＭＣＵ［Ｎ］のＤＣ成分とＭＣＵ［Ｎ−１］のＤＣ成分との差が−３であれば変数ｔｅｍｐの値は３、変数ｔｅｍｐ２の値は−４、変数ｎｂｉｔの値は２、変数ｔｅｍｐ２の有効桁は２進数で００となる。
【００２８】
動作８１６で、変数ｎｂｉｔがハフマン符号化テーブルを用いて符号化ｎｂｉｔ値に変換される。動作８１８で、符号化ｎｂｉｔ値が変数ｃｏｍｂｉｎｅの左側に接続される。動作８２０で、変数ｎｂｉｔが０と比較される。変数ｎｂｉｔが０でなければ（動作８２０のＹｅｓ）、動作８２１で、変数ｔｅｍｐ２がハフマン符号化テーブルを用いて符号化ｔｅｍｐ２値に変換される。動作８２２で、符号化ｔｅｍｐ２値が変数ｃｏｍｂｉｎｅの左側に接続される。変数ｎｂｉｔが０であれば（動作８２０のＮｏ）、動作８２１と動作８２２とは実行されない。
【００２９】
図７の一番下の丸のなかの数字「１」は図８の一番上の同じ数字のところへ続く。図８はハフマン符号化の第１の実装形態に係るフローチャートの一部である。動作８２０と動作８２２との後、動作８２４で変数ｉｄｘに０が代入される。動作８２６で、変数ｉｄｘがハフマン符号化テーブルを用いてジグザグスキャンテーブルの変換順に変換されて変数ｎに代入される。ジグザグスキャンテーブルは、１から６３までの順序を表す数字をインデックスとし、インデックスに対して１から６３までの数字がジグザグスキャンの順に並べられた１次元配列である。動作８２８で、２次元配列であるＭＣＵ［Ｎ］のなかの［ｎ／８］列目［ｎ％８］行目の値が変数ｄａｔａへ代入される。［ｎ／８］はｎを８で割った整数商、［ｎ％８］はｎを８で割った余である。動作８３０で、変数ｄａｔａが１次元配列であるＭＣＵ１Ｄ［ｉｄｘ］に代入される。動作８３２で、変数ｉｄｘが１繰り上げられる。動作８３４で、変数ｉｄｘが６４と比較される。変数ｉｄｘが６４より大きくなければ（動作８３４のＮｏ）、動作８２６が再び実行される。変数ｉｄｘが６４より大きければ（動作８３４のＹｅｓ）、動作８２６から動作８３２までを含むループ処理が終了する。すなわち、２次元配列であるＭＣＵ［Ｎ］の６３個のＡＣ成分が１次元配列であるＭＣＵ１Ｄ［ｉｄｘ］にジグザグスキャンテーブルが示す順に写されることになる。
【００３０】
図８の一番下の丸のなかの数字「２」は図９の一番上の同じ数字のところへ続く。図９はハフマン符号化の第１の実装形態に係るフローチャートの一部である。動作８３４の後、動作８３８で、変数ｒに０が代入され、変数ｉｄｘに０が代入される。動作８４０で、変数ｉｄｘが６４と比較される。変数ｉｄｘが６４より小さければ（動作８４０のＹｅｓ）、動作８４２でＭＣＵ１Ｄ［ｉｄｘ］が０と比較される。ＭＣＵ１Ｄ［ｉｄｘ］が０であれば（動作８４２のＹｅｓ）、動作８４４で変数ｒが１繰り上げられ、変数ｉｄｘに１が代入され、動作８４０が再び実行される。ＭＣＵ１Ｄ［ｉｄｘ］が０でなければ（動作８４２のＮｏ）、動作８４４と動作８４０とを含むループ処理が終了し動作８４６で変数ｒが１５と比較される。変数ｒが１５より大きければ（動作８４６のＹｅｓ）、動作８４８でＺＲＬコードがハフマン符号化テーブルを用いて符号化ＺＲＬコードに変換される。動作８５０で符号化ＺＲＬコードが変数ｃｏｍｂｉｎｅの左側に接続される。動作８５２で、変数ｒから１６が引かれた値が改めて変数ｒに代入され、動作８４６が再び実行される。変数ｒが１５より大きくなければ（動作８４６のＮｏ）、動作８４８から動作８５２までを含むループ処理が終了する。すなわち、１６個の連続する０のデータがＺＲＬコードと置き換えられ、ＺＲＬコードがハフマン符号化されて変数ｃｏｍｂｉｎｅに接続されることになる。
【００３１】
図９の一番下の丸のなかの数字「３」から図１０の一番上の同じ数字のところへとハフマン符号化が続く。図１０はハフマン符号化の第１の実装形態に係るフローチャートの一部である。動作８４６の後、動作８５４で、ＭＣＵ１Ｄ［ｉｄｘ］が変数ｔｅｍｐと変数ｔｅｍｐ２とのそれぞれに代入される。動作８５６で変数ｔｅｍｐが０と比較される。変数ｔｅｍｐが０より小さければ（動作８５６のＹｅｓ）、動作８５８で変数ｔｅｍｐを０から引いた値が改めて変数ｔｅｍｐへ代入され、変数ｔｅｍｐ２が１繰り下げられる。変数ｔｅｍｐが０より小さくなければ（動作８５６のＮｏ）、動作８５８は実行されない。動作８６０で、変数ｎｂｉｔへ１が代入され、変数ｔｅｍｐが１ビット右へシフトされる。動作８６２で変数ｔｅｍｐが０と比較される。変数ｔｅｍｐが０より大きければ（動作８６２のＹｅｓ）、動作８６４で変数ｔｅｍｐは１ビット右へシフトされ、変数ｎｂｉｔが１繰り上げられ、動作８６２が再び実行される。変数ｔｅｍｐが０より小さくなければ（動作８６２のＮｏ）、動作８６２から動作８６４を含むループ処理が終了する。つまり、変数ｔｅｍｐが０に達するまで、変数ｎｂｉｔが１ずつ繰り上げられながら変数ｔｅｍｐの値は右シフトされてゆく。従って変数ｎｂｉｔの値はＭＣＵ１Ｄ［ｉｄｘ］の有効桁数を示すことになる。
【００３２】
動作８６６で変数ｒが４ビット左へシフトされた値と変数ｎｂｉｔとの和が変数ｉに代入される。つまり、変数ｉへ、変数ｒに十進数上で１６をかけた値に変数ｎｂｉｔが加算された値が代入される。動作８６８で変数ｉがハフマン符号化テーブルを用いて符号化ｉ値に変換される。動作８７０で符号化ｉ値が変数ｃｏｍｂｉｎｅの左側に接続される。動作８７２で変数ｔｅｍｐ２が変数ｃｏｍｂｉｎｅの左側に接続される。つまり、符号化ｉ値の左側に変数ｔｅｍｐ２が接続されることになる。動作８７４で、変数ｒに０が代入され変数ｉｄｘが１繰り上げられる。図１０の一番下の丸のなかの数字「４」は図９の動作８３８と動作８４０の間につながる同じ数字のところへと続く。変数ｉｄｘが６４より小さくなければ（動作８４０のＮｏ）、動作８４２から動作８４４を含むループ処理が終了し、ハフマン符号化は図９の動作８４０の右の丸のなかの数字「５」から図１１の一番上の同じ数字のところへと続く。
【００３３】
図１１はハフマン符号化の第１の実装形態に係るフローチャートの一部である。動作８４０で変数ｉｄｘが６４より小さいと判定された後、動作８７６で変数ｒが０と比較される。変数ｒが０より大きければ（動作８７６のＹｅｓ）、動作８７８でＥＯＢコードがハフマン符号化テーブルを用いて符号化ＥＯＢコードに変換される。動作８８０で符号化ＥＯＢコードが変数ｃｏｍｂｉｎｅの左側に接続されてハフマン符号化が終了する。変数ｒが０より大きくなければ（動作８７６のＮｏ）、動作８７８と動作８８０は実行されずにハフマン符号化が終了する。
【００３４】
（１−４）ハフマン符号化の第２の実装形態
（１−４−１）ＳＩＭＤ命令の例
以下、ハフマン符号化の第２の実装形態の説明に先駆けて、ＳＩＭＤ命令の例を説明する。ＳＩＭＤ命令はレジスタ単位のデータに対する処理を含むものとして説明するがこれに限るものではない。ＳＩＭＤ命令を利用することで、例えば複数のレジスタを有するプロセッサ単位で処理されるデータやネットワークを通じたやりとりによって計算機単位で処理されるデータなどといった大量のデータを、単位毎に操作しなければならないといった状況を避けられる。
【００３５】
（１−４−１−１）“Ｌｏａｄ”命令
“Ｌｏａｄ”命令は、メモリ空間からレジスタへデータを読み出す命令である。メモリ空間はアドレスで定義される。データは“Ｌｏａｄ”命令で指定されたアドレスから読み出される。読み出したデータを書き込むレジスタやデータの長さも“Ｌｏａｄ”命令で指定される。図１２はメモリ空間とレジスタとにおける“Ｌｏａｄ”命令の動作の概念図である。メモリ空間の０ｘＡ０００＿００１０から続くアドレスのデータがレジスタ２へ、レジスタ２の長さを単位として読み出される。メモリ空間はレジスタの長さで割り切れるアドレスにそろえてデータを記憶する。一般に、レジスタの長さはプロセッサの種類によってビット数で表しやすい長さ、例えば８，１６，３２，６４，１２８ビットとなる。
【００３６】
（１−４−１−２）“Ｓｈｕｆｆｌｅ”命令
“Ｓｈｕｆｆｌｅ”命令は、読出元のレジスタのデータを書込先のレジスタへ、参照レジスタに記憶された数字の順に並び替えて代入する命令である。読出元のレジスタ、書込先のレジスタ、参照レジスタはそれぞれ１つのレジスタでも複数のレジスタでもよい。“Ｓｈｕｆｆｌｅ”命令は、参照レジスタの各要素と書込先のレジスタの各要素とは要素の順番毎に関連付け、参照レジスタの各要素に記憶された数字が読出元のレジスタ各要素の順番に関連付ける。以下、参照レジスタの要素の順番を参照要素順、書込先のレジスタの要素の順番を書込先要素順、読出元のレジスタの要素の順番を読出元要素番号、と呼ぶ。各要素のサイズは、読出元のレジスタや参照レジスタに割り当てられた変数の型によってかわる。
【００３７】
図１３はレジスタにおける“Ｓｈｕｆｆｌｅ”命令の動作の概念図である。図１３では各レジスタの長さは１２８ｂｉｔであるが、この長さに限られるものではない。レジスタＡ、レジスタＢ、レジスタＣ、レジスタＤは、８ｂｉｔのｕｎｓｉｇｎｅｄ  ｃｈａｒ型の変数に関連付けられている。一方、レジスタＥ、レジスタＦ、レジスタＧ、レジスタＨは１６ｂｉｔのｓｈｏｒｔ型の変数に関連付けられている。
【００３８】
例えば、“Ｓｈｕｆｆｌｅ”命令でレジスタＡとレジスタＢとを読出元のレジスタとし、レジスタＣを参照レジスタとし、レジスタＤを書込先のレジスタとする。レジスタＣの要素番号が“０”の要素に値“１７”が記憶されている。ここで“０”は参照要素順でありかつ書込先要素順であり、“１７”が読出元要素番号である。レジスタＡとレジスタＢとのうち読出元要素番号“１７”に関連付けられた要素がデータＢ１を記憶している。この場合、レジスタＤのなかで要素番号“０”に関連付けられた要素はデータＢ１を記憶することになる。同様に、参照レジスタのなかで要素番号“９”に関連付けられた要素が、読出元要素番号として“７”を記憶しているので、書込先のレジスタのＤのなかで要素番号“９”に関連付けられた要素はデータＡ７を記憶する。また、参照レジスタのなかで要素番号“１５”に関連付けられた要素が、読出元要素番号として“１４”を記憶しているので、書込先のレジスタのＤのなかで要素番号“１５”に関連付けられた要素はデータＡ１４を記憶する。
【００３９】
例えば、“Ｓｈｕｆｆｌｅ”命令でレジスタＥとレジスタＦとを読出元のレジスタとし、レジスタＧを参照レジスタとし、レジスタＨを書込先のレジスタとする。レジスタＧの要素番号が“０”の要素に値“９”が記憶されている。ここで“０”は参照要素順でありかつ書込先要素順であり、“９”が読出元要素番号である。レジスタＥとレジスタＦとのうち読出元要素番号“９”に関連付けられた要素がデータＢ１を記憶している。この場合、レジスタＨのなかで要素番号“０”に関連付けられた要素はデータＢ１を記憶することになる。同様に、参照レジスタのなかで要素番号“４”に関連付けられた要素が、読出元要素番号として“１１”を記憶しているので、書込先のレジスタのＤのなかで要素番号“４”に関連付けられた要素はデータＢ３を記憶する。
【００４０】
（１−４−１−３）“Ｃｍｐｇｔ”命令
“Ｃｍｐｇｔ”命令は、読出元のレジスタに記憶されている複数のデータと参照レジスタに記憶されている複数のデータとの比較結果を書込先のレジスタへ書き込む命令である。読出元のレジスタの各要素（以下、読出元要素）と参照レジスタのなかで読出元要素と同じ位置にある要素（以下、参照要素）とを比較する。読出元要素と参照要素との比較結果を、書込先のレジスタのなかで読出元要素と同じ位置にある要素（以下、書込先要素）が記憶する。“Ｃｍｐｇｔ”命令によって全ての読出元要素と参照要素との比較結果が一度に行える。読出元要素が記憶している値が、参照要素が記憶している値よりも大きければ、値“０ｘＦＦ”を書込先要素が記憶する。読出元要素が記憶している値が、参照要素が記憶している値よりも大きくなければ、値“０ｘ００”を書込先要素が記憶する。読出元要素と参照要素と書込先要素とのサイズは読出元要素に関連付けられている変数の型によって決まる。
【００４１】
図１４はレジスタにおける“Ｃｍｐｇｔ”命令の動作の概念図である。図１３では、読出元のレジスタであるレジスタＡの左から１番目の要素は値“０ｘ１７”を記憶している。参照レジスタであるレジスタＢの左から１番目の要素は値“０ｘ１７”を記憶している。この場合読出元要素が参照要素よりも大きいかどうかの比較結果は偽であるから、書込先のレジスタであるレジスタＣの左から１番目の要素は値“０ｘ００”を記憶する。同様に、読出元のレジスタであるレジスタＡの左から４番目の要素は値“０ｘ２１”を記憶しており、参照レジスタであるレジスタＢの左から４番目の要素は値“０ｘ１８”を記憶しているので、この場合読出元要素が参照要素よりも大きいかどうかの比較結果は真であるから、書込先のレジスタであるレジスタＣの左から４番目の要素は値“０ｘＦＦ”を記憶する。読出元のレジスタであるレジスタＡの左から９番目の要素は値“０ｘ２５”を記憶しており、参照レジスタであるレジスタＢの左から９番目の要素は値“０ｘ２８”を記憶しているので、この場合読出元要素が参照要素よりも大きいかどうかの比較結果は偽であるから、書込先のレジスタであるレジスタＣの左から９番目の要素は値“０ｘ００”を記憶する。
【００４２】
（１−４−１−４）“Ｃｍｐｅｑ”命令
“Ｃｍｐｅｑ”命令は、読出元のレジスタに記憶されている複数のデータと参照レジスタに記憶されている複数のデータとの比較結果を書込先のレジスタへ書き込む命令である。読出元のレジスタの各要素（以下、読出元要素）と参照レジスタのなかで読出元要素と同じ位置にある要素（以下、参照要素）とを比較する。読出元要素と参照要素との比較結果を、書込先のレジスタのなかで読出元要素と同じ位置にある要素（以下、書込先要素）が記憶する。“Ｃｍｐｅｑ”命令によって全ての読出元要素と参照要素との比較結果が一度に行える。読出元要素が記憶している値が、参照要素が記憶している値と等しければ、値“０ｘＦＦ”を書込先要素が記憶する。読出元要素が記憶している値が、参照要素が記憶している値と等しくなければ、値“０ｘ００”を書込先要素が記憶する。読出元要素と参照要素と書込先要素とはバイト単位である。図１５はレジスタにおける“Ｃｍｐｅｑ”命令の動作の概念図である。図１５では、読出元のレジスタであるレジスタＡの左から１番目の要素は値“０ｘ１７”を記憶している。参照レジスタであるレジスタＢの左から１番目の要素も値“０ｘ１７”を記憶している。この場合読出元要素が参照要素と等しいかどうかの比較結果は真であるから、書込先のレジスタであるレジスタＣの左から１番目の要素は値“０ｘＦＦ”を記憶する。同様に、読出元のレジスタであるレジスタＡの左から４番目の要素は値“０ｘ２１”を記憶しており、参照レジスタであるレジスタＢの左から４番目の要素は値“０ｘ１８”を記憶しているので、この場合読出元要素が参照要素と等しいかどうかの比較結果は偽であるから、書込先のレジスタであるレジスタＣの左から４番目の要素は値“０ｘ００”を記憶する。読出元のレジスタであるレジスタＡの左から１５番目の要素は値“０ｘ２９”を記憶しており、参照レジスタであるレジスタＢの左から１５番目の要素は値“０ｘ１９”を記憶しているので、この場合読出元要素が参照要素よりも大きいかどうかの比較結果は偽であるから、書込先のレジスタであるレジスタＣの左から１５番目の要素は値“０ｘ００”を記憶する。
【００４３】
（１−４−１−５）“Ｓｅｌｅｃｔ”命令
“Ｓｅｌｅｃｔ”命令は、第１読出元のレジスタのデータか第２読出元のレジスタのデータかを書込先のレジスタに記憶する命令である。参照レジスタに記憶された値が、第１読出元のレジスタのデータか第２読出元のレジスタのデータかを指定する。参照レジスタの各要素（以下、参照要素）が、第１読出元のレジスタのなかで参照要素と同じ位置にある要素（以下、第１読出元要素）か、第２読出元のレジスタのなかで参照要素と同じ位置にある要素（以下、第２読出元要素）かを指定する。第１読出元要素と第２読出元要素とのうち指定された要素に記憶されていた値を、書込先のレジスタのなかで指定した参照要素と同じ位置にある要素（以下、書込先要素）が記憶する。“Ｓｅｌｅｃｔ”命令によって、このような選択や記憶の動作が全ての要素に対して一度に行える。参照要素が記憶している値が“０ｘＦＦ”であれば第１読出元要素の値を書込先要素が記憶する。参照要素が記憶している値が“０ｘ００”であれば第２読出元要素の値を書込先要素が記憶する。第１読出元要素と第２読出元要素と参照要素と書込先要素とはバイト単位である。
【００４４】
図１６はレジスタにおける“Ｓｅｌｅｃｔ”命令の動作の概念図である。図１６では、第１読出元のレジスタであるレジスタＡの左から１番目の要素は値Ａ０を記憶している。第２読出元のレジスタであるレジスタＢの左から１番目の要素は値Ｂ０を記憶している。参照レジスタであるレジスタＣの左から１番目の要素は値“０ｘ００”を記憶している。この場合第２読出元要素が選択されるので、書込先のレジスタであるレジスタＤの左から１番目の要素は値Ｂ０を記憶する。同様に、第１読出元のレジスタであるレジスタＡの左から６番目の要素は値Ａ６を記憶しており、第２読出元のレジスタであるレジスタＢの左から６番目の要素は値Ｂ６を記憶しており、参照レジスタであるレジスタＣの左から６番目の要素は値“０ｘＦＦ”を記憶しているので、この場合第１読出元要素が選択されるので、書込先のレジスタであるレジスタＤの左から６番目の要素は値Ａ６を記憶する。
【００４５】
（１−４−１−６）“Ａｄｄ”命令
“Ａｄｄ”命令は、２つの読出元のレジスタに記憶されている値の和を書込先のレジスタへ記憶させる命令である。書込先のレジスタの各要素（以下、書込先要素）へ、２つの読出元のレジスタそれぞれのなかで書込先要素と同じ位置にある要素（以下、読出元要素）それぞれの値の和を記憶する。読出元要素と書込先要素とはバイト単位である。図１７はレジスタにおける“Ａｄｄ”命令の動作の概念図である。図１７では、読出元のレジスタの一方であるレジスタＡの左から１番目の要素が読出元要素の一方であり値“０ｘ１７”を記憶している。読出元のレジスタの他方であるレジスタＢの左から１番目の要素が読出元要素の他方であり値“０ｘ１７”を記憶している。この場合、書込先のレジスタであるレジスタＣの左から１番目の要素が書込先要素であり両読出元要素の値の和である“０ｘ２Ｅ”を記憶する。同様に、読出元のレジスタの一方であるレジスタＡの左から１０番目の要素が読出元要素の一方であって値“０ｘ０７”を記憶しており。読出元のレジスタの他方であるレジスタＢの左から１０番目の要素が読出元要素の他方であって値“０ｘ１９”を記憶しているので、書込先のレジスタであるレジスタＣの左から１０番目の要素が書込先要素であり両読出元要素の値の和である“０ｘ２０”を記憶する。
【００４６】
（１−４−１−７）“Ｓｕｂ”命令
“Ｓｕｂ”命令は、被減数レジスタと減数レジスタとの差を書込先のレジスタに記憶する命令である。書込先のレジスタの各要素（以下、書込先要素）へ、被減数レジスタのなかで書込先要素と同じ位置にある要素（以下、被減数要素）の値から、減数レジスタのなかで書込先要素と同じ位置にある要素（以下、減数要素）の値を引いた値を記憶する。被減数要素と減数要素と書込先要素とはバイト単位である。図１８はレジスタにおける“Ｓｕｂ”命令の動作の概念図である。図１８では、被減数レジスタであるレジスタＡの左から１番目の要素が値“０ｘ１７”を記憶している。減数レジスタであるレジスタＢの左から１番目の要素が値“０ｘ１７”を記憶している。この場合、書込先のレジスタであるレジスタＣの左から１番目の要素が書込先要素であり非減数要素と減数要素との値の差である“０ｘ００”を記憶する。同様に、被減数レジスタであるレジスタＡの左から１０番目の要素が被減数要素であって値“０ｘ０７”を記憶しており。減数レジスタであるレジスタＢの左から１０番目の要素が減数要素であって値“０ｘ１９”を記憶しているので、書込先のレジスタであるレジスタＣの左から１０番目の要素が書込先要素であり被減数要素と減数要素との差である“０ｘＥＥ”を記憶する。
【００４７】
（１−４−１−８）“Ｓｈｉｆｔ”命令
“Ｓｈｉｆｔ”命令は、読出元のレジスタのビット列を、参照レジスタに指定された数だけ左へシフトして書込先のレジスタへ記憶する命令である。シフトされて左へはみ出たビットは破棄される。シフトされてできた右の欠落ビットは０で埋められる。シフトは例えば８ビット単位で行われる。参照レジスタが指定する数は例えば単位数である。例えば、参照レジスタの有効ビットとして、シフトする数を指定する。参照レジスタの有効ビットの長さをＸｂｉｔとする。有効ビットは右端から（Ｙ＋１）番目のビットから左へ数えられる。ＸとＹは整数である。Ｘが３でありＹが３である場合、整数型の変数であれば２４ビット目から２８ビット目である。ＸやＹを含めて、本実施の形態に記載している命令はいずれもプロセッサの実装によって異なる。
【００４８】
図１９はレジスタにおける“Ｓｈｉｆｔ”命令の動作の概念図である。図１９では、読出元のレジスタであるレジスタＡが１２８ｂｉｔの値“０ｘ１２８０＿３１１７＿００１０＿１１１９＿９９３１＿２１２５＿９１３９＿００２８”を記憶している。理解しやすいよう、８ｂｉｔ毎に“＿”で区切って示す。参照レジスタであるレジスタＢは有効ビットとして“０ｘ４”を記憶している。この場合、書込先のレジスタであるレジスタＣへ、１２８ｂｉｔの値“０ｘ３１１７＿００１０＿１１１９＿９９３１＿２１２５＿９１３９＿００２８＿００００”が記憶される。レジスタＡに記憶されていたビット列の左端の“０ｘ１２８０＿３１１７”を示していた４ｂｉｔが破棄され、５ｂｉｔ目から１６ｂｉｔ目がシフトされて１ｂｉｔ目から１２ｂｉｔ目となり、欠落した右端から４ｂｉｔは０で埋められたビット列が、レジスタＣへ記憶される。
【００４９】
（１−４−１−９）“Ｇａｔｈｅｒ”命令
“Ｇａｔｈｅｒ”命令は、書込先のレジスタへ、複数の読出元のレジスタの単位毎のＬＳＢ（Ｌｅａｓｔ  Ｓｉｇｎｉｆｉｃａｎｔ  Ｂｉｔｓ）の値を集める命令である。複数の読出元のレジスタの単位毎のＬＳＢが、書込先のレジスタの右端から並べられて収集値ができあがる。書込先のレジスタの残りのビットは０で埋められる。複数の読出元のレジスタの単位はスロットと呼ばれる。スロットのサイズは読出元のレジスタに関連付けられた変数の型によって異なる。書込先のレジスタへ集められるＬＳＢの数も読出元のレジスタに関連付けられた変数の型によって異なる。
【００５０】
図２０はレジスタにおける“Ｇａｔｈｅｒ”命令の動作の概念図である。図２０では全てのレジスタの長さは１２８ｂｉｔである。レジスタＡは、６ｂｉｔの長さであるｕｎｓｉｇｎｅｄ  ｃｈａｒ型の変数に関連付けられている。レジスタＣは、１６ｂｉｔの長さであるｓｈｏｒｔ型の変数に関連付けられている。レジスタＢとレジスタＤとは、３２ｂｉｔの長さであるｕｎｓｉｇｎｅｄ  ｉｎｔｅｇｅｒ型の変数に関連付けられている。
【００５１】
例えば、“Ｇａｔｈｅｒ”命令でレジスタＡを読出元のレジスタとし、レジスタＢを書込先のレジスタとし、バイト単位の１６個の値を読出元のレジスタが記憶しているとする。読出元のレジスタの左から１バイト目の値が“０ｘ００”あり、“０ｘ００”の右端のビットは“０”なので、収集値の１ビット目として“０”が採用される。読出元のレジスタの左から２バイト目の値が“０ｘＦＦ”あり、“０ｘＦＦ”の右端のビットは“１”なので。収集値の２ビット目として“１”が採用される。同様に、読出元のレジスタの１６スロットそれぞれの右端のビットが、読出元のレジスタのスロットの並び順に沿って並べられて収集値ができあがる。図２０のレジスタＡを読出元のレジスタとすれば、収集値は“０１１１０１０００１０１１１００Ｂ”（つまり“０ｘ００００７４５Ｃ”）となる。収集値は書込先のレジスタの右端に記憶される。収集値以外の書込先のレジスタのビットは“０”とされる。その結果、レジスタＢの左から１番目、２番目および３番目の３２ｂｉｔの値は“０ｘ００００＿００００”となり、４番目の３２ｂｉｔの値は“０ｘ００００７４５Ｃ”となる。
【００５２】
例えば、“Ｇａｔｈｅｒ”命令でレジスタＣを読出元のレジスタとし、レジスタＤを書込先のレジスタとし、スロット単位の８個の値を読出元のレジスタが記憶しているとする。読出元のレジスタの左から１スロット目の値が“０ｘ００００”あり、“０ｘ００００”の右端のビットは“０”なので、収集値の１ビット目として“０”が採用される。読出元のレジスタの左から２スロット目の値が“０ｘ１２６Ｄ”あり、“０ｘ１２６Ｄ”の右端のビットは“１”なので。収集値の２ビット目として“１”が採用される。同様に、読出元のレジスタの８スロットそれぞれの右端のビットが、読出元のレジスタのスロットの並び順に沿って並べられて収集値ができあがる。図２０のレジスタＣを読出元のレジスタとすれば、収集値は“０１１１１０１１Ｂ”（つまり“０ｘ００００００７Ｂ”）となる。収集値は書込先のレジスタの右端に記憶される。収集値以外の書込先のレジスタのビットは“０”とされる。その結果、レジスタＢの左から１番目、２番目および３番目の３２ｂｉｔの値は“０ｘ００００＿００００”となり、４番目の３２ｂｉｔの値は“０ｘ００００００７Ｂ”となる。
【００５３】
（１−４−１−１０）“Ｃｎｔｌｚ”命令
“Ｃｎｔｌｚ”命令は、読出元のレジスタのなかの各計数単位において、左端のビットから数えて最初に“１Ｂ”であるビットが現れるまでの“０Ｂ”であるビット数を、書込先のレジスタへ計数単位毎に記憶する命令である。各計数単位の左端のビットはＭＳＢ（Ｍｏｓｔ  Ｓｉｇｎｉｆｉｃａｎｔ  Ｂｉｔ）と呼ばれる。各計数単位は例えばｉｎｔｅｇｅｒ型の３２ｂｉｔのスロットである。
【００５４】
図２１はレジスタにおける“Ｃｎｔｌｚ”命令の動作の概念図である。図２１では、読出元のレジスタであるレジスタＡが１６バイトの値を記憶している。読出元のレジスタの左から数えて最初の４バイトは“０ｘ０８２１５３８２”（つまり“００００１０００００１００００１０１０１００１１１０００００１０Ｂ”）を示す。この４バイトのなかでは“０Ｂ”の値を示すビットが左端から４つ並び５つめで“１Ｂ”の値を示すビットが現れる。したがって書込先のレジスタであるレジスタＢの最初の４バイトの値として“４”が割り当てられる。読出元のレジスタの左から数えて４番目の４バイトは“０ｘＣ００１００００”（つまり“１１０００００００００００００００００１００００００００００００Ｂ”）を示す。この４バイトのなかでは“０Ｂ”の値を示すビットが“１Ｂ”の値を示すビットの左にない。したがって書込先のレジスタであるレジスタＢの４つ目のバイトの値として“０”が割り当てられる。その結果、レジスタＢの各４バイト（各１６ｂｉｔ）はそれぞれ、の４バイトから順に“４”，“１１”，“７”，“０”を記憶することになる。
【００５５】
（１−４−１−１１）“Ａｎｄ”命令
“Ａｎｄ”命令は、２つの読出元のレジスタに対してＡＮＤ演算を行った結果を書込先のレジスタへ記憶する命令である。書込先のレジスタの各要素（以下、書込先要素）へ、２つの読出元のレジスタそれぞれのなかで書込先要素と同じ位置にある要素（以下、読出元要素）それぞれの値のＡＮＤ演算の結果を記憶する。読出元要素と書込先要素とはバイト単位である。
【００５６】
図２２はレジスタにおける“Ａｎｄ”命令の動作の概念図である。図２２では、読出元のレジスタの一方であるレジスタＡの左から１番目の要素が読出元要素の一方であり値“０ｘ１７”を記憶している。読出元のレジスタの他方であるレジスタＢの左から１番目の要素が読出元要素の他方であり、レジスタＡの左から１番目の要素と同じく、値“０ｘ１７”を記憶している。この場合、書込先のレジスタであるレジスタＣの左から１番目の要素が書込先要素であり両読出元要素の値のＡＮＤ演算の結果である“０ｘ１７”を記憶する。同様に、読出元のレジスタの一方であるレジスタＡの左から１０番目の要素が読出元要素の一方であって値“０ｘ０７”を記憶しており。読出元のレジスタの他方であるレジスタＢの左から１０番目の要素が読出元要素の他方であって値“０ｘ１９”を記憶しているので、書込先のレジスタであるレジスタＣの左から１０番目の要素が書込先要素であり両読出元要素の値のＡＮＤ演算の結果である“０ｘ０１”を記憶する。
【００５７】
（１−４−１−１２）“Ｎｏｔ”命令
“Ｎｏｔ”命令は、読出元のレジスタに対してＮＯＴ演算を行った結果を書込先のレジスタへ記憶する命令である。書込先のレジスタの各要素（以下、書込先要素）へ、読出元のレジスタのなかで書込先要素と同じ位置にある要素（以下、読出元要素）の値のＮＯＴ演算の結果を記憶する。読出元要素と書込先要素とはバイト単位である。図２３はレジスタにおける“Ｎｏｔ”命令の動作の概念図である。図２３では、読出元のレジスタの一方であるレジスタＡの左から１番目の要素が読出元要素の一方であり値“０ｘ１７”を記憶している。この場合、書込先のレジスタであるレジスタＣの左から１番目の要素が書込先要素であり読出元要素の値のＮＯＴ演算の結果である“０ｘＥ８”を記憶する。
【００５８】
（１−４−１−１３）“Ｎａｎｄ”命令
“Ｎａｎｄ”命令は、２つの読出元のレジスタに対してＮＡＮＤ演算を行った結果を書込先のレジスタへ記憶する命令である。書込先のレジスタの各要素（以下、書込先要素）へ、２つの読出元のレジスタそれぞれのなかで書込先要素と同じ位置にある要素（以下、読出元要素）それぞれの値のＮＡＮＤ演算の結果を記憶する。読出元要素と書込先要素とはバイト単位である。
【００５９】
図２４はレジスタにおける“Ｎａｎｄ”命令の動作の概念図である。図２４では、読出元のレジスタの一方であるレジスタＡの左から１番目の要素が読出元要素の一方であり値“０ｘ１７”を記憶している。読出元のレジスタの他方であるレジスタＢの左から１番目の要素が読出元要素の他方であり値“０ｘ１７”を記憶している。この場合、書込先のレジスタであるレジスタＣの左から１番目の要素が書込先要素であり両読出元要素の値のＮＡＮＤ演算の結果である“０ｘＥ８”を記憶する。同様に、読出元のレジスタの一方であるレジスタＡの左から１０番目の要素が読出元要素の一方であって値“０ｘ０７”を記憶しており。読出元のレジスタの他方であるレジスタＢの左から１０番目の要素が読出元要素の他方であって値“０ｘ１９”を記憶しているので、書込先のレジスタであるレジスタＣの左から１０番目の要素が書込先要素であり両読出元要素の値のＮＡＮＤ演算の結果である“０ｘＦＥ  ”を記憶する。
【００６０】
以下、図２５乃至図３６と以上のＳＩＭＤ命令例とを用いて、動作７０４，７１４，７２４と置換可能であるハフマン符号化の第２の実装形態について説明する。
【００６１】
（１−４−２）ハフマン符号化の第２の実装形態
図２５はハフマン符号化の第２の実装形態に係るフローチャートの一部である。動作１００２で前処理が実行される。前処理によって配列ｎｂｉｔ［  ］と配列ｔｅｍｐＮ２［  ］が得られる。また前処理によってレジスタｚｅｌｏｒｅｎが、ＭＣＵ［Ｎ］のどの成分が０でどの成分が０より大きいのかを示すよう設定される。動作１００４で変数ｉｄｘに０が代入される。動作１００６で変数ｎｂｉｔ［ｉｄｘ］がハフマン符号化テーブルを用いて符号化ｎｂｉｔ値に変換される。動作１００８で符号化ｎｂｉｔ値が変数ｃｏｍｂｉｎｅの左側に接続される。動作１０１０で変数ｎｂｉｔ［ｉｄｘ］が０と比較される。変数ｎｂｉｔ［ｉｄｘ］が０でなければ（動作１０１０のＹｅｓ）、動作１０１２で変数ｔｅｍｐＮ２がハフマン符号化テーブルを用いて符号化ｔｅｍｐＮ２値に変換される。動作１０１４で符号化ｔｅｍｐＮ２値が変数ｃｏｍｂｉｎｅの左側に接続される。変数ｎｂｉｔ［ｉｄｘ］が０であれば（動作１０１０のＮｏ）、動作１０１２と動作１０１４とは実行されない。
【００６２】
図２５の一番下の丸のなかの数字「６」は図２６の一番上の同じ数字のところへ続く。図２６はハフマン符号化の第２の実装形態に係るフローチャートの一部である。動作１０１０と動作１０１４との後、動作１０１６で変数ｒに０が代入され、変数ｉｄｘに１が代入される。動作１０１８で変数ｉｄｘが６４と比較される。変数ｉｄｘが６４より小さければ（動作１０１８のＹｅｓ）、動作１０２０でレジスタｚｅｒｏｌｅｎの左端から連続する０の数が数えられる。動作１０２０でレジスタｚｅｒｏｌｅｎの左端から連続する０の数を数えるために“Ｃｎｔｌｚ”命令が使える。レジスタｚｅｒｏｌｅｎの左端から連続する０の数は、変数ｒに関連付けられたレジスタｒに記憶される。つまり、レジスタｚｅｒｏｌｅｎの左端から連続する０の数は変数ｒへ代入される。動作１０２２で、レジスタｚｅｒｏｌｅｎに記憶されているビット列が（ｒ＋１）ビットだけ左へシフトされたビット列を改めてレジスタｚｅｒｏｌｅｎへ記憶する。動作１０２４で変数ｉｄｘが変数ｒの値だけ増やされる。動作１０２６で変数ｒが１５と比較される。変数ｒが１５より大きければ（動作１０２６のＹｅｓ）、動作１０２８でＺＲＬ（Ｚｅｒｏ  Ｒｕｎ  Ｌｅｎｇｔｈ）コードをハフマン符号化する。動作１０３０でハフマン符号化されたＺＲＬコードが変数ｃｏｍｂｉｎｅに接続される。動作１０３２で変数ｒから１６が引かれ、動作１０２６が再び実行される。変数ｒが１５より大きくなければ（動作１０２６のＮｏ）、動作１０２８から動作１０３２までを含むループ処理が終了し、ハフマン符号化は図２６の一番下の丸のなかの数字「７」から図２７の一番上の同じ数字のところへ続く。図２７はハフマン符号化の第２の実装形態に係るフローチャートの一部である。
【００６３】
動作１０３２の後、動作１０３４で変数ｒの値が４ｂｉｔだけ左へシフトされた値に変数ｎｂｉｔ［ｉｄｘ］の値が足された値が、変数ｉに代入される。つまり十進法で言えば、変数ｒに１６かけた値に変数ｎｂｉｔ［ｉｄｘ］が足された結果が変数ｉに代入されることになる。動作１０３６で変数ｉがハフマン符号化テーブルを用いて符号化ｉ値に変換される。動作１０３８で符号化ｉ値が変数ｃｏｍｂｉｎｅの左側に接続される。変数ｃｏｍｂｉｎｅの左側に接続された符号化ｉ値のさらに左側に、動作１０４０で変数ｔｅｍｐＮ２［ｉｄｘ］の値が接続される。動作１０４２で変数ｒに０が代入され、変数ｉｄｘが１繰り上げられる。図２７の一番下の丸のなかの数字「８」は図２６の動作１０１６と動作１０１８との間につながる同じ数字のところへ続く。
【００６４】
変数ｉｄｘが６４より小さくなければ（動作１０１８のＮｏ）、動作１０２０から動作１０４２までを含むループ処理が終了し、ハフマン符号化は図２６の動作１０１８の右の丸のなかの数字「９」から図２８の一番上の同じ数字のところへ続く。図２８はハフマン符号化の第２の実装形態に係るフローチャートの一部である。
【００６５】
動作１０１８の後、動作１０４４で変数ｒの値が０と比較される。変数ｒが０より大きければ（動作１０４４のＹｅｓ）、動作１０４６でＥＯＢコードがハフマン符号化テーブルを用いて符号化ＥＯＢコードに変換される。動作１０４８で符号化ＥＯＢコードが変数ｃｏｍｂｉｎｅの左側に接続されてハフマン符号化が終了する。変数ｒが０より大きくなければ（動作１０４４のＮｏ）、動作１０４６と動作１０４８は実行されずにハフマン符号化が終了する。
【００６６】
以下、前処理の実装形態の一例について説明する。図２９は前処理の実装形態に係るフローチャートの一部である。動作１１０２でＭＣＵ［Ｎ］の全ての要素がメモリからレジスタセットＡへ読み出される。レジスタセットＡとは配列Ａに関連付けられたレジスタ群である。以下、レジスタとは変数や配列に関連付けられたレジスタ群を指すものとする。例えば、ＭＣＵ［Ｎ］が６４個の要素を持てば、配列Ａは６４個の要素を有する。配列Ａが６４個の要素を持ち要素ひとつのビット長が１６ｂｉｔでありレジスタ１つのビット長が１２８ｂｉｔであれば、レジスタセットＡは４つのレジスタを含む。レジスタの数と同じ数の“Ｌｏａｄ”命令が、ＭＣＵ［Ｎ］の全ての要素をメモリからレジスタセットＡへ読み出すのに用いられる。
【００６７】
動作１１０４でＭＣＵ［Ｎ−１］のＤＣ成分がメモリからレジスタセットＢへ読み出される。ＭＣＵ［Ｎ−１］のＤＣ成分は、ＭＣＵ［Ｎ−１］自体のハフマン符号化のときからレジスタに保持されていてもよい。ＭＣＵ［Ｎ−１］自体のハフマン符号化が終わればＭＣＵ［Ｎ−１］のＡＣ成分はレジスタセットＢから破棄されてもよい。ＭＣＵ［Ｎ−１］のＤＣ成分をメモリからレジスタセットＢへ読み出すために“Ｌｏａｄ”命令が用いられてもよい。動作１１０６で、レジスタセットＡに記憶されていたＭＣＵ［Ｎ］のＤＣ成分が、ＭＣＵ［Ｎ−１］のＤＣ成分とＭＣＵ［Ｎ］のＤＣ成分との差へ置き換えられる。Ｎが０から６３までの各状態におけるＭＣＵ［Ｎ−１］のＤＣ成分とＭＣＵ［Ｎ］のＤＣ成分との差が、前処理やハフマン符号化やＶＬＣの前に求められていてもよい。Ｎが０から６３までの全状態あるいは一部の状態におけるＭＣＵ［Ｎ−１］のＤＣ成分とＭＣＵ［Ｎ］のＤＣ成分との差を求めるのに“Ｓｕｂ”命令を用いてもよい。動作１１０８で、メモリに記憶されているジグザグスキャンテーブルの値がレジスタセットｚｉｇｚａｇへ読み出される。メモリに記憶されているジグザグスキャンテーブルの値がレジスタセットｚｉｇｚａｇへ、前処理やハフマン符号化やＶＬＣの前に読み出されていてもよい。レジスタセットｚｉｇｚａｇに含まれるレジスタの数と同じ数の“Ｌｏａｄ”命令が、メモリに記憶されているジグザグスキャンテーブルの値をレジスタセットｚｉｇｚａｇへ読み出すために用いられる。
【００６８】
動作１１０９で、レジスタセットＡに記憶されているデータが、レジスタセットＭＣＵ１ＤＡへ、レジスタセットｚｉｇｚａｇに記憶されているデータの順に割り当てられる。レジスタセットＡに記憶されているデータをレジスタセットＭＣＵ１ＤＡへレジスタセットｚｉｇｚａｇに記憶されているデータの順に割り当てるために、レジスタセットＡの各レジスタを読出元のレジスタとし、レジスタセットＭＣＵ１ＤＡ  の各レジスタを書込先レジスタとし、レジスタセットｚｉｇｚａｇを参照レジスタとして“Ｓｈｕｆｆｌｅ”命令を用いてもよい。一般に、このような命令のレイテンシは、メモリと通信する命令のレイテンシに比べて短いといわれるが、同等あるいはむしろ長くなってしまうこともある。“Ｓｈｕｆｆｌｅ”命令によるジグザグスキャンは、ＭＣＵ［  ］の各要素を読み出すためにメモリを読む命令を６４回実行せねばならなかった従来のジグザグスキャンよりも、少ない命令で実現することができる。したがって、レジスタセットＡのデータをレジスタセットＭＣＵ１ＤＡへ割り当てるために“Ｓｈｕｆｆｌｅ”命令を複数回繰り返したとしても、“Ｓｈｕｆｆｌｅ”命令によるジグザグスキャンはメモリを都度読む従来のジグザグスキャンよりも速いといえる。
【００６９】
動作１１１０で、レジスタセットＭＣＵ１ＤＡのデータがレジスタセットｔｅｍｐ１へコピーされる。動作１１０８から動作１１１０までをまとめてジグザグスキャンと呼ぶ。図２９の一番下の丸のなかの数字「１０」は図３０の一番上の同じ数字のところへ続く。図３０は前処理の実装形態に係るフローチャートの一部である。
【００７０】
動作１１１０の後、動作１１１２で０／非０判定が行われる。０／非０判定では、レジスタセットｃｏｍｐａｒｅ１へ、レジスタセットｔｅｍｐ１の各要素のデータが０か否かを示すビット列が割り当てられる。動作１１１３で正負判定が行われる。正負判定では、レジスタセットｃｏｍｐａｒｅ２へ、レジスタセットｔｅｍｐ１の各要素のデータが０以上か否かを示すビット列が割り当てられる。動作１１１２と動作１１１３とは順序が逆であってもよい。動作１１１０の後、動作１１１４でｔｅｍｐ１推定が行われる。ｔｅｍｐ１推定では、０−ｔｅｍｐ１が求められてレジスタセットｔｅｍｐＭ１へ割り当てられる。０−ｔｅｍｐ１はレジスタセットｔｅｍｐ１のデータの逆加数である。例えば、配列ｔｅｍｐＭ１が６４個の要素を持ち要素ひとつのビット長が１６ｂｉｔでありレジスタ１つのビット長が１２８ｂｉｔであれば、レジスタセットｔｅｍｐＭ１は４つのレジスタを含む。しかしレジスタの数や配列の要素の数やレジスタ１つのビット長さはこれに限るものではない。動作１１１６でレジスタセットＭＣＵ１ＤＡのデータがレジスタセットｔｅｍｐ２へコピーされる。レジスタセットＭＣＵ１ＤＡのデータは動作１１１６においてでなく動作１１１０と並行してレジスタセットｔｅｍｐ２へコピーされてもよい。動作１１１８でｔｅｍｐ２推定が行われる。ｔｅｍｐ２推定では、１＋ｔｅｍｐ２が求められてレジスタセットｔｅｍｐＭ２へ割り当てられる。例えば、配列ｔｅｍｐＭ１が６４個の要素を持ち要素ひとつのビット長が１６ｂｉｔでありレジスタ１つのビット長が１２８ｂｉｔであれば、レジスタセットｔｅｍｐＭ２は４つのレジスタを含む。動作１１１２から動作１１１３の分岐枝と動作１１１４から動作１１１８の分岐枝とは依存しないので、両分岐枝を直列アルゴリズムとして実装してもよいが、両方の分岐枝を実行するに十分なリソースがあれば並列アルゴリズムとしてでも実装してよい。
【００７１】
動作１１１３と動作１１１８の後、動作１１２０で合成が実行される。合成においては、レジスタセットｔｅｍｐ１とレジスタセットｔｅｍｐＭ１とから正の値が集められる。正の値は、レジスタセットｃｏｍｐａｒｅ２が記憶している値に応じてレジスタセットＭＣＵ１Ｄへ割り当てられる。さらに、代替値レジスタセットｔｅｍｐ２とレジスタセットｔｅｍｐＭ２とから代替値が選択される。代替値は、レジスタセットｃｏｍｐａｒｅ２が記憶している値に応じてレジスタセットｔｅｍｐＮ２へ割り当てられる。動作１１２２で有効ビット数処理が実行される。有効ビット数処理においては、レジスタセットＭＣＵ１Ｄが記憶している値の有効ビット数がレジスタセットｎｂｉｔへ割り当てられる。動作１１１３と動作１１１８の後、動作１１２４で比較結果合成が実行される。比較結果合成においては、レジスタセットｃｏｍｐａｒｅ１の各データのＬＳＢがレジスタｚｅｒｏｌｅｎへ集められる。動作１１２４の分岐枝と動作１１２０から動作１１２４の分岐枝とは依存しないので、両分岐枝を直列アルゴリズムとして実装してもよいが、両方の分岐枝を実行するに十分なリソースがあれば並列アルゴリズムとしてでも実装してよい。動作１１１２と動作１１２４との後、前処理が終了する。
【００７２】
図３１は、０／非０判定、ｔｅｍｐ１推定、ｔｅｍｐ２推定に係るフローチャートである。０／非０判定では、動作１１３６でレジスタセットｒｅｆ１が０に初期化される。動作１１３８で、レジスタセットｔｅｍｐ１のデータとレジスタセットｒｅｆ１のデータとの比較結果がレジスタセットｃｏｍｐａｒｅ１へ割り当てられる。レジスタセットｒｅｆ１のデータとの比較には、レジスタセットｔｅｍｐ１の各レジスタをｓｉｇｎｅｄ型からｕｎｓｉｇｎｅｄ型へ型変換して読出元のレジスタとし、レジスタセットｒｅｆ１の各レジスタを参照レジスタとし、レジスタセットｃｏｍｐａｒｅ１の各レジスタを書込先レジスタとして“Ｃｍｐｇｔ”命令を用いてもよい。
【００７３】
上記手法に限らず、“Ｃｍｐｅｑ”命令と“Ｎｏｔ”命令との組み合わせや、“Ａｎｄ”命令と“Ｎｏｔ”命令との組み合わせによって０／非０判定を行ってもよい。“Ｃｍｐｅｑ”命令あるいは“Ａｎｄ”命令はレジスタセットｔｅｍｐ１の各データとレジスタセットｒｅｆ１の各データとの比較のため、レジスタセットｔｅｍｐ１の各レジスタを読出元のレジスタとし、レジスタセットｒｅｆ１の各レジスタを参照レジスタとして用いられる。“Ｎｏｔ”命令は“Ｃｍｐｅｑ”命令の結果の負の値をレジスタセットｃｏｍｐａｒｅ１へ割り当てるために用いられる。また、動作１１３８を実行するために、レジスタセットｔｅｍｐ１の各レジスタを読出元のレジスタとし、レジスタセットｒｅｆ１の各レジスタを参照レジスタとし、レジスタセットｃｏｍｐａｒｅ１の各レジスタを書込先レジスタとして“Ｎａｎｄ”命令を用いてもよい。動作１１３６の後、０／非０判定が終了する。
【００７４】
ｔｅｍｐ１推定では、動作１１３２でレジスタセットｒｅｆ２が０に初期化される。動作１１３４で、レジスタセットｔｅｍｐＭ１へレジスタセットｒｅｆ２のデータとレジスタセットｔｅｍｐ１のデータとの差が割り当てられる。レジスタセットｔｅｍｐＭ１へ、レジスタセットｒｅｆ２のデータとレジスタセットｔｅｍｐ１のデータとの差をレジスタセットｔｅｍｐＭ１へ割り当てるに、レジスタセットｒｅｆ２の各レジスタを被減数レジスタとし、レジスタセットｔｅｍｐ１の各レジスタを減数レジスタとし、レジスタセットｔｅｍｐＭ１の各レジスタを書込先レジスタとして“Ｓｕｂ”命令を用いてもよい。動作１１３４の後、ｔｅｍｐ１推定が終了する。
【００７５】
ｔｅｍｐ２推定では、動作１１４０でレジスタセットｒｅｆ３の各要素が１に初期化される。動作１１４２で、レジスタセットｔｅｍｐＭ２へ、レジスタセットｔｅｍｐ２のデータとレジスタセットｒｅｆ２のデータとの差が割り当てられる。レジスタセットｔｅｍｐＭ２へレジスタセットｔｅｍｐ２のデータとレジスタセットｒｅｆ２のデータとの差を割り当てるために、レジスタセットｔｅｍｐ２の各レジスタを被減数レジスタとし、レジスタセットｒｅｆ３の各レジスタを減数レジスタとし、レジスタセットｔｅｍｐＭ２の各レジスタを書込先レジスタとして“Ｓｕｂ”命令を用いてもよい。動作１１４２の後、ｔｅｍｐ２推定が終了する。
【００７６】
図３２は正負判定と合成とに係るフローチャートである。正負判定では、動作１２３６でレジスタセットｒｅｆ５が０に初期化される。レジスタセットｒｅｆ１が動作１１３６の時点で既に０に初期化されていれば、レジスタセットｒｅｆ５の代わりに、レジスタセットｒｅｆ１を動作１２３６の実行なしで用いてもよい。動作１２３８でレジスタセットｔｅｍｐ１のデータとレジスタセットｒｅｆ５のデータと比較結果がレジスタセットｃｏｍｐａｒｅ２へ割り当てられる。レジスタセットｔｅｍｐ１のデータとレジスタセットｒｅｆ５のデータと比較結果をレジスタセットｃｏｍｐａｒｅ２へ割り当てるために、レジスタセットｔｅｍｐ１の各レジスタを変数型変換せず読出元レジスタとし、レジスタセットｒｅｆ５の各レジスタを参照レジスタとし、レジスタセットｃｏｍｐａｒｅ２の各レジスタを書込先レジスタとして“Ｃｍｐｇｔ”命令を用いてもよい。動作１２３８の後、正負判定が終了する。
【００７７】
合成では、動作１１４４でレジスタセットＭＣＵ１Ｄへ、レジスタセットｃｏｍｐａｒｅ２の値に応じてレジスタセットｔｅｍｐ１とレジスタセットｔｅｍｐＭ１とから選択された値が割り当てられる。レジスタセットＭＣＵ１Ｄへレジスタセットｃｏｍｐａｒｅ２の値に応じてレジスタセットｔｅｍｐ１とレジスタセットｔｅｍｐＭ１とから選択した値を割り当てるために、レジスタセットｔｅｍｐ１の各レジスタを第１読出元レジスタとし、レジスタセットｔｅｍｐＭ１の各レジスタを第２読出元レジスタとし、レジスタセットｃｏｍｐａｒｅ２の各レジスタを参照レジスタとし、レジスタセットＭＣＵ１Ｄの各レジスタを書込先レジスタとして“Ｓｅｌｅｃｔ”命令を用いてもよい。さらに動作１１４６で、レジスタセットｔｅｍｐＮ２へ、レジスタセットｃｏｍｐａｒｅ２の値に応じてレジスタセットｔｅｍｐ２とレジスタセットｔｅｍｐＭ２とから選択された値が割り当てられる。レジスタセットｔｅｍｐＮ２へレジスタセットｃｏｍｐａｒｅ２の値に応じてレジスタセットｔｅｍｐ２とレジスタセットｔｅｍｐＭ２とから選択した値を割り当てるために、レジスタセットｔｅｍｐ２の各レジスタを第１読出元レジスタとし、レジスタセットｔｅｍｐＭ２の各レジスタを第２読出元レジスタとし、レジスタセットｃｏｍｐａｒｅ２の各レジスタを参照レジスタとし、レジスタセットｔｅｍｐＮ２の各レジスタを書込先レジスタとして“Ｓｅｌｅｃｔ”命令を用いてもよい。動作１１４４と動作１１４６とは依存しないので、両分岐枝を直列アルゴリズムとして実装してもよいが、両方の分岐枝を実行するに十分なリソースがあれば並列アルゴリズムとしてでも実装してよい。動作１１４４と動作１１４６との後、合成が終了する。
【００７８】
図３３は有効ビット数処理に係るフローチャートである。動作１１４８で分配処理が実行される。分配処理では、レジスタセットＭＣＵ１Ｄの各レジスタのデータがレジスタｔｅｍｐＮ１とｔｅｍｐＮ２とに分配される。動作１１５０でレジスタセットｃｏｕｎｔ１へ、レジスタｔｅｍｐＮ１とｔｅｍｐＮ２それぞれで左端から連続する０の数が割り当てられる。レジスタセットｃｏｕｎｔ１へレジスタｔｅｍｐＮ１とｔｅｍｐＮ２それぞれで左端から連続する０の数を割り当てるために、レジスタｔｅｍｐＮ１とレジスタｔｅｍｐＮ２とを読出元レジスタとし、レジスタセットｃｏｕｎｔ１の各レジスタを書込先レジスタとして“Ｃｎｔｌｚ”命令を用いてもよい。動作１１５２で有効ビット数計算が実行される。有効ビット数計算では、レジスタセットｎｂｉｔへ３２からレジスタセットｃｏｕｎｔ１の値を引いた値が割り当てられる。動作１１５２の後、有効ビット数処理が終了する。
【００７９】
図３４は分配処理と有効ビット数計算とに係るフローチャートである。分配処理では、動作１１５４でレジスタセットｔｅｍｐＮ１へレジスタセットＭＣＵ１Ｄの左半分のレジスタの値が割り当てられる。動作１１５８でレジスタセットｔｅｍｐＮ２へレジスタセットＭＣＵ１Ｄの右半分のレジスタの値が割り当てられる。動作１１５８の後、分配処理が終了する。有効ビット数計算では、動作１１６０でレジスタセットｒｅｆ４の各計数単位へ３２が割り当てられる。動作１１６２でレジスタセットｎｂｉｔへレジスタセットｒｅｆ４のデータとレジスタセットｃｏｕｎｔ１のデータとの差が割り当てられる。レジスタセットｎｂｉｔへレジスタセットｒｅｆ４のデータとレジスタセットｃｏｕｎｔ１のデータとの差を割り当てるために、レジスタセットｒｅｆ４の各レジスタを被減数レジスタとし、レジスタセットｃｏｕｎｔ１を減数レジスタとし、レジスタセットｎｂｉｔを書込先レジスタとして“Ｓｕｂ”命令を用いてもよい。動作１１６２の後、有効ビット数計算が終了する。
【００８０】
図３５は比較結果合成に係るフローチャートである。動作１１７２で、レジスタｇａｔｈｅｒ１へ、レジスタセットｃｏｍｐａｒｅ１の１つ目のレジスタの各単位のＬＳＢが集められる。レジスタｇａｔｈｅｒ１へレジスタセットｃｏｍｐａｒｅ１の１つ目のレジスタの各単位のＬＳＢを集めるために、レジスタセットｃｏｍｐａｒｅ１の１つ目のレジスタを読出元のレジスタとし、レジスタｇａｔｈｅｒ１を書込先のレジスタとして“Ｇａｔｈｅｒ”命令を用いてもよい。動作１１７４で、レジスタｓｈｉｆｔ２へ１が割り当てられ、レジスタｓｈｉｆｔ３へ９が割り当てられる。比較結果合成や前処理やハフマン符号化やＶＬＣのいずれかの前に、レジスタｓｈｉｆｔ２へ１が割り当てられレジスタｓｈｉｆｔ３へ９が割り当てられてあってもよい。レジスタｓｈｉｆｔ２が記憶する１は“Ｓｈｉｆｔ”命令の有効ビット数として用いられる。また、レジスタｓｈｉｆｔ３が記憶する９は“Ｓｈｉｆｔ”命令の有効ビット数として用いられる。動作１１７６で、レジスタｔｅｍｐ１１へ、レジスタｇａｔｈｅｒ１に記憶されていたビット列がレジスタｓｈｉｆｔ２に記憶された値だけ左へシフトされたビット列が割り当てられる。レジスタｔｅｍｐ１１へレジスタｇａｔｈｅｒ１に記憶されていたビット列がレジスタｓｈｉｆｔ２に記憶された値だけ左へシフトされたビット列を割り当てるために、レジスタｇａｔｈｅｒ１を読出元レジスタとし、レジスタｓｈｉｆｔ２を参照レジスタとし、レジスタｔｅｍｐ１１を書込先レジスタとして”Ｓｈｉｆｔ”命令を用いてもよい。
【００８１】
動作１１７８で、レジスタｇａｔｈｅｒ２へ、レジスタセットｃｏｍｐａｒｅ１の２つ目のレジスタの各単位のＬＳＢが集められる。レジスタｇａｔｈｅｒ２へレジスタセットｃｏｍｐａｒｅ１の２つ目のレジスタの各単位のＬＳＢを集めるために、レジスタセットｃｏｍｐａｒｅ１の２つ目のレジスタを読出元のレジスタとし、レジスタｇａｔｈｅｒ１を書込先のレジスタとして“Ｇａｔｈｅｒ”命令を用いてもよい。動作１１８０で、レジスタｃｎｔｌｚ１へレジスタｔｅｍｐ１１の値とレジスタｇａｔｈｅｒ２の値との和が割り当てられる。レジスタｃｎｔｌｚ１へレジスタｔｅｍｐ１１の値とレジスタｇａｔｈｅｒ２の値との和を割り当てるために、レジスタｔｅｍｐ１１とレジスタｇａｔｈｅｒ２を読出元のレジスタとし、レジスタｃｎｔｌｚ１を書込先のレジスタとして“Ａｄｄ”命令を用いてもよい。動作１１８２で、レジスタｔｅｍｐ１２へ、レジスタｃｎｔｌｚ１に記憶されていたビット列がレジスタｓｈｉｆｔ２に記憶された値だけ左へシフトされたビット列が割り当てられる。レジスタｔｅｍｐ１２へレジスタｃｎｔｌｚ１に記憶されていたビット列がレジスタｓｈｉｆｔ２に記憶された値だけ左へシフトされたビット列を割り当てるために、レジスタｃｎｔｌｚ１を読出元レジスタとし、レジスタｓｈｉｆｔ２を参照レジスタとし、レジスタｔｅｍｐ１２を書込先レジスタとして“Ｓｈｉｆｔ”命令を用いてもよい。
【００８２】
動作１１８４で、レジスタｇａｔｈｅｒ３へ、レジスタセットｃｏｍｐａｒｅ１の３つ目のレジスタの各単位のＬＳＢが集められる。レジスタｇａｔｈｅｒ３へレジスタセットｃｏｍｐａｒｅ１の３つ目のレジスタの各単位のＬＳＢを集めるために、レジスタセットｃｏｍｐａｒｅ１の３つ目のレジスタを読出元のレジスタとし、レジスタｇａｔｈｅｒ３を書込先のレジスタとして“Ｇａｔｈｅｒ”命令を用いてもよい。動作１１８６で、レジスタｃｎｔｌｚ２へレジスタｔｅｍｐ１２の値とレジスタｇａｔｈｅｒ３の値との和が割り当てられる。レジスタｃｎｔｌｚ２へレジスタｔｅｍｐ１２の値とレジスタｇａｔｈｅｒ３の値との和を割り当てるために、レジスタｔｅｍｐ１２とレジスタｇａｔｈｅｒ３を読出元のレジスタとし、レジスタｃｎｔｌｚ２を書込先のレジスタとして“Ａｄｄ”命令を用いてもよい。動作１１８８で、レジスタｔｅｍｐ１３へ、レジスタｃｎｔｌｚ２に記憶されていたビット列がレジスタｓｈｉｆｔ２に記憶された値だけ左へシフトされたビット列が割り当てられる。レジスタｔｅｍｐ１３へレジスタｃｎｔｌｚ２に記憶されていたビット列がレジスタｓｈｉｆｔ２に記憶された値だけ左へシフトされたビット列を割り当てるために、レジスタｃｎｔｌｚ２を読出元レジスタとし、レジスタｓｈｉｆｔ２を参照レジスタとし、レジスタｔｅｍｐ１３を書込先レジスタとして“Ｓｈｉｆｔ”命令を用いてもよい。
【００８３】
動作１１９０で、レジスタｇａｔｈｅｒ４へ、レジスタセットｃｏｍｐａｒｅ１の４つ目のレジスタの各単位のＬＳＢが集められる。レジスタｇａｔｈｅｒ４へレジスタセットｃｏｍｐａｒｅ１の４つ目のレジスタの各単位のＬＳＢを集めるために、レジスタセットｃｏｍｐａｒｅ１の４つ目のレジスタを読出元のレジスタとし、レジスタｇａｔｈｅｒ４を書込先のレジスタとして“Ｇａｔｈｅｒ”命令を用いてもよい。動作１１９２で、レジスタｃｎｔｌｚ３へレジスタｔｅｍｐ１３の値とレジスタｇａｔｈｅｒ４の値との和が割り当てられる。レジスタｃｎｔｌｚ３へレジスタｔｅｍｐ１３の値とレジスタｇａｔｈｅｒ４の値との和を割り当てるために、レジスタｔｅｍｐ１３とレジスタｇａｔｈｅｒ４を読出元のレジスタとし、レジスタｃｎｔｌｚ３を書込先のレジスタとして“Ａｄｄ”命令を用いてもよい。動作１１９４で、レジスタｔｅｍｐ１４へ、レジスタｃｎｔｌｚ３に記憶されていたビット列がレジスタｓｈｉｆｔ２に記憶された値だけ左へシフトされたビット列が割り当てられる。レジスタｔｅｍｐ１４へレジスタｃｎｔｌｚ３に記憶されていたビット列がレジスタｓｈｉｆｔ２に記憶された値だけ左へシフトされたビット列を割り当てるために、レジスタｃｎｔｌｚ３を読出元レジスタとし、レジスタｓｈｉｆｔ２を参照レジスタとし、レジスタｔｅｍｐ１４を書込先レジスタとして“Ｓｈｉｆｔ”命令を用いてもよい。
【００８４】
図３５の一番下の丸のなかの数字「１１」は図３６の一番上の同じ数字のところへ続く。図３６は比較結果合成に係るフローチャートである。動作１１９４の後、動作１１９６で、レジスタｇａｔｈｅｒ５へ、レジスタセットｃｏｍｐａｒｅ１の５つ目のレジスタの各単位のＬＳＢが集められる。レジスタｇａｔｈｅｒ５へレジスタセットｃｏｍｐａｒｅ１の５つ目のレジスタの各単位のＬＳＢを集めるために、レジスタセットｃｏｍｐａｒｅ１の５つ目のレジスタを読出元のレジスタとし、レジスタｇａｔｈｅｒ５を書込先のレジスタとして“Ｇａｔｈｅｒ”命令を用いてもよい。動作１１９８で、レジスタｃｎｔｌｚ４へレジスタｔｅｍｐ１４の値とレジスタｇａｔｈｅｒ５の値との和が割り当てられる。レジスタｃｎｔｌｚ４へレジスタｔｅｍｐ１４の値とレジスタｇａｔｈｅｒ５の値との和を割り当てるために、レジスタｔｅｍｐ１４とレジスタｇａｔｈｅｒ５を読出元のレジスタとし、レジスタｃｎｔｌｚ４を書込先のレジスタとして“Ａｄｄ”命令を用いてもよい。動作１２００で、レジスタｔｅｍｐ１５へ、レジスタｃｎｔｌｚ４に記憶されていたビット列がレジスタｓｈｉｆｔ２に記憶された値だけ左へシフトされたビット列が割り当てられる。レジスタｔｅｍｐ１５へレジスタｃｎｔｌｚ４に記憶されていたビット列がレジスタｓｈｉｆｔ２に記憶された値だけ左へシフトされたビット列を割り当てるために、レジスタｃｎｔｌｚ４を読出元レジスタとし、レジスタｓｈｉｆｔ２を参照レジスタとし、レジスタｔｅｍｐ１５を書込先レジスタとして“Ｓｈｉｆｔ”命令を用いてもよい。
【００８５】
動作１２０２で、レジスタｇａｔｈｅｒ６へ、レジスタセットｃｏｍｐａｒｅ１の６つ目のレジスタの各単位のＬＳＢが集められる。レジスタｇａｔｈｅｒ６へレジスタセットｃｏｍｐａｒｅ１の６つ目のレジスタの各単位のＬＳＢを集めるために、レジスタセットｃｏｍｐａｒｅ１の６つ目のレジスタを読出元のレジスタとし、レジスタｇａｔｈｅｒ６を書込先のレジスタとして“Ｇａｔｈｅｒ”命令を用いてもよい。動作１２０４で、レジスタｃｎｔｌｚ５へレジスタｔｅｍｐ１５の値とレジスタｇａｔｈｅｒ６の値との和が割り当てられる。レジスタｃｎｔｌｚ５へレジスタｔｅｍｐ１５の値とレジスタｇａｔｈｅｒ６の値との和を割り当てるために、レジスタｔｅｍｐ１５とレジスタｇａｔｈｅｒ６を読出元のレジスタとし、レジスタｃｎｔｌｚ５を書込先のレジスタとして”Ａｄｄ”命令を用いてもよい。動作１２０６で、レジスタｔｅｍｐ１６へ、レジスタｃｎｔｌｚ５に記憶されていたビット列がレジスタｓｈｉｆｔ２に記憶された値だけ左へシフトされたビット列が割り当てられる。レジスタｔｅｍｐ１６へレジスタｃｎｔｌｚ５に記憶されていたビット列がレジスタｓｈｉｆｔ２に記憶された値だけ左へシフトされたビット列を割り当てるために、レジスタｃｎｔｌｚ５を読出元レジスタとし、レジスタｓｈｉｆｔ２を参照レジスタとし、レジスタｔｅｍｐ１６を書込先レジスタとして“Ｓｈｉｆｔ”命令を用いてもよい。
【００８６】
動作１２０８で、レジスタｇａｔｈｅｒ７へ、レジスタセットｃｏｍｐａｒｅ１の７つ目のレジスタの各単位のＬＳＢが集められる。レジスタｇａｔｈｅｒ７へレジスタセットｃｏｍｐａｒｅ１の７つ目のレジスタの各単位のＬＳＢを集めるために、レジスタセットｃｏｍｐａｒｅ１の７つ目のレジスタを読出元のレジスタとし、レジスタｇａｔｈｅｒ７を書込先のレジスタとして“Ｇａｔｈｅｒ”命令を用いてもよい。動作１２１０で、レジスタｃｎｔｌｚ６へレジスタｔｅｍｐ１６の値とレジスタｇａｔｈｅｒ７の値との和が割り当てられる。レジスタｃｎｔｌｚ６へレジスタｔｅｍｐ１６の値とレジスタｇａｔｈｅｒ７の値との和を割り当てるために、レジスタｔｅｍｐ１６とレジスタｇａｔｈｅｒ７を読出元のレジスタとし、レジスタｃｎｔｌｚ６を書込先のレジスタとして“Ａｄｄ”命令を用いてもよい。動作１２１２で、レジスタｔｅｍｐ１７へ、レジスタｃｎｔｌｚ６に記憶されていたビット列がレジスタｓｈｉｆｔ２に記憶された値だけ左へシフトされたビット列が割り当てられる。レジスタｔｅｍｐ１７へレジスタｃｎｔｌｚ６に記憶されていたビット列がレジスタｓｈｉｆｔ２に記憶された値だけ左へシフトされたビット列を割り当てるために、レジスタｃｎｔｌｚ６を読出元レジスタとし、レジスタｓｈｉｆｔ２を参照レジスタとし、レジスタｔｅｍｐ１７を書込先レジスタとして”Ｓｈｉｆｔ”命令を用いてもよい。
【００８７】
動作１２１４で、レジスタｇａｔｈｅｒ８へ、レジスタセットｃｏｍｐａｒｅ１の８つ目のレジスタの各単位のＬＳＢが集められる。レジスタｇａｔｈｅｒ８へレジスタセットｃｏｍｐａｒｅ１の８つ目のレジスタの各単位のＬＳＢを集めるために、レジスタセットｃｏｍｐａｒｅ１の８つ目のレジスタを読出元のレジスタとし、レジスタｇａｔｈｅｒ８を書込先のレジスタとして”Ｇａｔｈｅｒ”命令を用いてもよい。動作１２１６で、レジスタｃｎｔｌｚ７へレジスタｔｅｍｐ１７の値とレジスタｇａｔｈｅｒ８の値との和が割り当てられる。レジスタｃｎｔｌｚ７へレジスタｔｅｍｐ１７の値とレジスタｇａｔｈｅｒ８の値との和を割り当てるために、レジスタｔｅｍｐ１７とレジスタｇａｔｈｅｒ８を読出元のレジスタとし、レジスタｃｎｔｌｚ７を書込先のレジスタとして“Ａｄｄ”命令を用いてもよい。動作１２１８で、レジスタｚｅｒｏｌｅｎへ、レジスタｃｎｔｌｚ７に記憶されていたビット列がレジスタｓｈｉｆｔ３に記憶された値だけ左へシフトされたビット列が割り当てられる。レジスタｚｅｒｏｌｅｎへレジスタｃｎｔｌｚ７に記憶されていたビット列がレジスタｓｈｉｆｔ３に記憶された値だけ左へシフトされたビット列を割り当てるために、レジスタｃｎｔｌｚ７を読出元レジスタとし、レジスタｓｈｉｆｔ３を参照レジスタとし、レジスタｚｅｒｏｌｅｎを書込先レジスタとして”Ｓｈｉｆｔ”命令を用いてもよい。動作１２１８の後、比較結果合成が終了する。
【００８８】
（２）画像処理装置としての実施の形態
図３７は実施の形態としての画像形成装置４０００の斜視図である。画像形成装置４０００は、スキャナ３０００、プリンタ２０００、コントローラ４０００を備える。プリンタ２０００の上のスキャナ３０００は、コントローラ１０００に供給する読取り画像データを生成するために原稿の画像をスキャンする。コントローラ１０００は読取り画像データをラスタ画像データに変換する。プリンタ２０００は、コントローラ１０００から供給されるラスタ画像データから画像を形成する。プリンタ２０００は操作パネル１５００を備える。一般に、操作パネル１５００がセットされる側がフロント側と呼ばれる。また、その反対側がリア側と呼ばれる。コントローラ１０００はリア側に位置する。操作パネル１５００は、スキャンを始めるためのボタンと、複数個の選択肢のなかから画像処理のモードを選ぶためのボタンとを備える。コントローラ１０００は読取り画像データをラスタ画像データに変換したり、読取り画像データを圧縮画像データに変換する。コントローラ１０００は内部記憶装置に圧縮画像データを格納したり、ＰＯＰ３、ＦＴＰ、ＳＭＢ、ＮＦＳおよび他のプロトコルによってインターネットを介して他の計算装置へ圧縮画像データを送信したりする。
【００８９】
図３８は、コントローラ１０００のブロック図の一例である。コントローラ１０００はシステムプロセッサ１０２、システムＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）１０４、システムメモリ１０６、システムコントローラ１０８、バス１１０、画像処理プロセッサ１１２、ページメモリ１１４、ＨＤＤ（ハードディスク・ドライブ）１１６、ストレージインターフェース１１８およびネットワークアダプタ１２２を備える。
【００９０】
システムプロセッサ１０２は、操作パネル１５００から入力された指示とシステムＲＯＭ  １０４に格納されたプログラムとに応じて、他のコンポーネントへの指示を出す。システムプロセッサ１０２は作業領域としてシステムメモリ１０６を使用する。システムコントローラ１０８は、システムプロセッサ１０２とシステムＲＯＭ１０４とシステムメモリ１０６と、バス１１０によって接続している他のコンポーネントとの間の通信を制御する。ストレージインターフェース１１８は、ＨＤＤ１１６のような内部記憶装置や、ＵＳＢ（ユニバーサル・シリアル・バス）ストレージ１２０のような外部記憶装置へ、データの読み書きを行う機能を有する。ストレージインターフェース１１８は、システムプロセッサ１０２から出された命令に応じて、通信する記憶装置を選択する。ストレージインターフェース１１８は、システムバス１１０を介してプロセッサ１０２と、およびシステムコントローラ１０８と、データをやりとりする。ＨＤＤ１１６およびシステムメモリ１０６は動作の実行のためのプログラムを記憶する。システムプロセッサ１０２および画像処理プロセッサ１１２はプログラム従って動作を実行する。
【００９１】
システムプロセッサ１０２が操作パネル１５００から入力された複写動作指示を検知したら、システムプロセッサ１０２はスキャナ３０００、画像処理プロセッサ１１２およびプリンタ２０００へ指示を出す。指示に従って、スキャナ３０００は、読取り画像データを生成するために原稿の画像をスキャンする。画像処理プロセッサ１１２はスキャナ３０００から読取り画像データを受け取り、ページメモリ１１４に読取り画像データを記憶させる。画像処理プロセッサ１１２は、ページメモリ１１４上の読取り画像データをラスタ画像データに変換し、ページメモリ１１４にラスタ画像データを記憶させる。画像処理プロセッサ１１２は、プリンタ２０００にページメモリ１１４上のラスタ画像データを供給する。プリンタ２０００はラスタ画像データによって画像を形成する。
【００９２】
原稿が複数ページ含むことをシステムプロセッサ１０２が検知すると、画像処理プロセッサ１１２は、ページメモリ１１４上の読取り画像データを、ＨＤＤ１１６へ格納するための圧縮画像データに変換する。また画像処理プロセッサ１１２は、原稿の複数ページ全てがＨＤＤ１１６に格納された後に、ＨＤＤ１１６から読み出されてページメモリ１１４に展開された圧縮画像データをラスタ画像データへ変換する。
【００９３】
システムプロセッサ１０２が、操作パネル１５００からのスキャンｔｏＳｔｏｒｅの指示を検知したら、システムプロセッサ１０２はスキャナ３０００および画像処理プロセッサ１１２へ指示を出す。指示に応じて、スキャナ３０００は、読取り画像データを生成するために原稿の画像をスキャンする。画像処理プロセッサ１１２はスキャナ３０００から読取り画像データを受け取り、ページメモリ１１４に読取り画像データを記憶させる。画像処理プロセッサ１１２は、ページメモリ１１４上の読取り画像データを圧縮画像データに変換し、圧縮画像データをページメモリ１１４に格納する。
【００９４】
システムプロセッサ１０２は、スキャンｔｏＳｔｏｒｅの指示が格納先としてＨＤＤ１１６を指定していたら、画像処理プロセッサ１１２によってページメモリ１１４から転送される圧縮画像データをＨＤＤ１１６へ格納するようストレージインターフェース１１８へ指示する。システムプロセッサ１０２は、スキャンｔｏＳｔｏｒｅの指示がＵＳＢストレージ１２０として格納する目的地を含んでいる場合に、ＵＳＢ（ユニバーサル・シリアル・バス）ストレージ１２０へ圧縮画像データを格納するストレージインターフェース１１８のための命令を出す。システムプロセッサ１０２は、スキャンｔｏＳｔｏｒｅの指示が格納先としてＵＳＢストレージ１２０を指定していたら、圧縮画像データをＵＳＢストレージ１２０へ格納するようストレージインターフェース１１８へ指示する。
【００９５】
システムプロセッサ１０２が、操作パネル１５００からのスキャンｔｏＳｅｎｄの指示を検知したら、システムプロセッサ１０２はスキャナ３０００および画像処理プロセッサ１１２へ指示を出す。指示に応じて、スキャナ３０００は、読取り画像データを生成するために原稿の画像をスキャンする。画像処理プロセッサ１１２はスキャナ３０００から読取り画像データを受け取り、ページメモリ１１４に読取り画像データを記憶させる。画像処理プロセッサ１１２は、ページメモリ１１４上の読取り画像データを圧縮画像データに変換し、圧縮画像データをページメモリ１１４上に格納する。
【００９６】
システムプロセッサ１０２は、画像処理プロセッサ１１２によってページメモリ１１４から転送された圧縮画像データをＨＤＤ１１６へ格納するようストレージインターフェース１１８へ指示する。システムプロセッサ１０２は、ＰＯＰ３、ＦＴＰ、ＳＭＢ、ＮＦＳおよび他のプロトコルに従って、ＨＤＤ１１６に格納された圧縮画像データを格納した送信データセットを準備する。システムプロセッサ１０２は、送信データセットを送信するようネットワークアダプタ１２２へ指示する。送信データセットを準備するためのプロセッサがコントローラ１０００上であってもよい。
【００９７】
システムプロセッサ１０２がネットワークアダプタ１２２を通して受信した印刷指示を検知したら、システムプロセッサ１０２は画像処理プロセッサ１１２およびプリンタ２０００へ指示を出す。指示に応じて、画像処理プロセッサ１１２は、システムプロセッサ１０２に処理されたラスタ画像データを受け取り、ページメモリ１１４にラスタ画像データを記憶させる。画像処理プロセッサ１１２は、プリンタ２０００にページメモリ１１４上のラスタ画像データを供給する。プリンタ２０００はラスタ画像データに従って画像を形成する。
【００９８】
印刷指示のデータサイズがシステムメモリ１０６のサイズに対して大きすぎることをシステムプロセッサ１０２が検知すると、印刷指示は一旦ＨＤＤ１１６へ格納されてからシステムメモリ１０６へ読み出されて、システムプロセッサ１０２の処理に供される。画像処理プロセッサ１１２が印刷指示からラスタ画像データを生成する機能を有するのであれば、システムプロセッサ１０２の代わりに画像処理プロセッサ１１２がラスタ画像データを生成してもよい。画像処理プロセッサ１１２は、ＨＤＤ１１６から印刷指示を読み出すべく、システムプロセッサ１０２を介さずストレージインターフェース１１８と通信してもよい。
【００９９】
（１−１）から（１−４−２）までで説明した手順例を、複数のページを含む原稿の複写動作や、スキャンｔｏＳｔｏｒｅ、スキャンｔｏＳｅｎｄなどにおけるページメモリ１１４上の読取り画像データから圧縮画像データへの変換に用いることができる。画像処理装置４０００が読取り画像データから圧縮画像データへの変換を含む他の動作を実行することができるなら、他の動作に含まれる読取り画像データから圧縮画像データへの変換も、（１−１）から（１−４−２）までで説明した手順例を利用してよい
【０１００】
図６を用いて説明したＶＬＣについて、Ｙハフマン符号化７３０やＣｂハフマン符号化７３２やＣｒハフマン符号化７３４が、システムプロセッサ１０２のプロセスおよび画像処理プロセッサ１１２のプロセスとして分配されてもよい。
例えば、Ｙハフマン符号化７３０はシステムプロセッサ１０２のプロセスＡとして、Ｃｂハフマン符号化７３２およびＣｒハフマン符号化７３４はプロセスＡと並行して存在する画像処理プロセッサ１１２のプロセスＢとして処理されてもよい。
【０１０１】
画像処理プロセッサ１１２が、複数個の内部プロセッサや、メモリ空間を共有するコプロセッサを有するのであれば、Ｙハフマン符号化７３０、Ｃｂハフマン符号化７３２およびＣｒハフマン符号化７３４は複数個の内部プロセッサやコプロセッサへ分配されてもよい。例えば、Ｙハフマン符号化７３０は、画像処理プロセッサ１１２の１つ目のコアによってスレッドＡとして処理され、Ｃｂハフマン符号化７３２は画像処理プロセッサ１０２の２つ目のコアによってスレッドＢとして処理され、Ｃｒハフマン符号化７３４は画像処理プロセッサ１１２の３番めのコアによってスレッドＣとして処理され、スレッドＡとスレッドＢとスレッドＣとが互いに並行して存在するのであってもよい。
【０１０２】
Ｙハフマン符号化７３０やＣｂハフマン符号化７３２やＣｒハフマン符号化７３４はシステムプロセッサ１０２および画像処理プロセッサ１１２のどちらにでも、スレッドとしてでもプロセスとしてでもタスクとしてでも分配されてよい。もしシステムプロセッサ１０２および画像処理プロセッサ１１２が内部プロセッサを複数有するのであれば、Ｙハフマン符号化７３０やＣｂハフマン符号化７３２やＣｒハフマン符号化７３４はその内部プロセッサへスレッドとしてでもプロセスとしてでもタスクとしてでも分配されてよい。
【０１０３】
システムプロセッサ１０２がＳＩＭＤ命令をサポートしているならばシステムプロセッサ１０２に、（１−４−２）中で説明された第２の実施形態に係る動作を実行させてもよい。メモリ空間はシステムメモリ１０６上に定義されればよい。メモリ空間はシステムＲＯＭ  １０８もカバーするのでもよい。システムプロセッサ１０２は、マルチスレッディングをサポートしている内部制御装置１３２や、レジスタ１２４や、レジスタ１２４にＳＩＭＤ命令を適用することができるＡＬＵ（算術論理演算ユニット）１２６を有してもよい。
【０１０４】
画像処理プロセッサ１１２がＳＩＭＤ命令をサポートしているならば画像処理プロセッサ１１２に、（１−４−２）中で説明された第２の実施形態に係る動作を実行させてもよい。メモリ空間はシステムメモリ１０６上に定義されればよい。画像処理プロセッサ１１２は、レジスタ１２８や、レジスタ１２８にＳＩＭＤ命令を適用することができるＡＬＵ（算術論理演算ユニット）１３０を有してもよい。
【０１０５】
ハフマン符号化の第２の実装形態に含まれる動作はシステムプロセッサ１０２および画像処理プロセッサ１１２のどちらにでも、スレッドとしてでもプロセスとしてでもタスクとしてでも分配されてよい。もしシステムプロセッサ１０２および画像処理プロセッサ１１２が内部プロセッサを複数有するのであれば、ハフマン符号化の第２の実装形態に含まれる動作はその内部プロセッサへスレッドとしてでもプロセスとしてでもタスクとしてでも分配されてよい。すなわち、ハフマン符号化の第２の実装形態に含まれる動作は、マルチスレッディング、マルチプロセッシングあるいはマルチタスクとして実行することができる。システムプロセッサ１０２は他のタスクも実行する役割なので、画像処理プロセッサ１１２が前処理を行うのでもよい。
【０１０６】
画像処理プロセッサ１１２が複数個の内部プロセッサを有するのであれば、動作１１１２から動作１１１３までの分岐枝と動作１１１４から動作１１１８までの分岐枝とを、スレッドとしてでもプロセスとしてでも、並行して処理すべく複数個の内部プロセッサへ分配してよい。動作１１２４の分岐枝と動作１１２０から動作１１２２までの分岐枝とを、スレッドとしてでもプロセスとしてでも、並行して処理すべく複数個の内部プロセッサへ分配してよい。動作１１４４と動作１１４６とを、スレッドとしてでもプロセスとしてでも、並行して処理すべく複数個の内部プロセッサへ分配してよい。
【０１０７】
上述のように、動作を実行する主体は例えば、ハードウェア、ハードウェアとソフトウェアとの複合体、ソフトウェア、及び実行中のソフトウェアなどといった、コンピュータに係る主体である。動作を実行する主体は例えば、プロセッサ上で実行されるプロセス、プロセッサ、オブジェクト、実行ファイル、スレッド、プログラムおよびコンピュータであるがこれらに限るものではない。例えば、文書処理装置やそこで実行されるアプリケーションが動作を実行する主体であってもよい。プロセスやスレッドに、動作を実行する主体を複数演じさせてもよい。動作を実行する主体が１つの文書処理装置内にあってもよいし、複数の文書処理装置へ分配されたかたちであってもよい。
【０１０８】
なお、本発明は上記各実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記複数の構成要素の適宜な組み合わせにより、種々の実施形態の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。さらに、異なる実施形態にわたる構成要素を適宜組み合わせてもよい。上述のコンポーネントにより実現されるさまざまな機能については、上述のコンポーネントを説明するために用いた語句が上述の構造とは物理的に等価でなくとも、上述のコンポーネントの機能を実現できるいかなるものをも意図したものである。
【図面の簡単な説明】
【０１０９】
【図１】ＪＰＥＧ圧縮法のフローチャートの一例。
【図２】ＹＣｂＣｒ画像データと新たなＹ成分と新たなＣｂ成分と新たなＣｒ成分との関係を示す図。
【図３】４：１：１サブサンプリング比において生成された成分を示す図。
【図４】新たなＹ成分のＭＣＵの一例。
【図５】新たなＹ成分２次元ＭＣＵおよび１次元ＭＣＵの一例。
【図６】ＶＬＣの一例を示すフローチャート。
【図７】ハフマン符号化の第１の実装形態に係るフローチャートの一部。
【図８】ハフマン符号化の第１の実装形態に係るフローチャートの一部。
【図９】ハフマン符号化の第１の実装形態に係るフローチャートの一部。
【図１０】ハフマン符号化の第１の実装形態に係るフローチャートの一部。
【図１１】ハフマン符号化の第１の実装形態に係るフローチャートの一部。
【図１２】メモリ空間とレジスタとにおける“Ｌｏａｄ”命令の動作の概念図。
【図１３】レジスタにおける“Ｓｈｕｆｆｌｅ”命令の動作の概念図。
【図１４】レジスタにおける“Ｃｍｐｇｔ”命令の動作の概念図。
【図１５】レジスタにおける“Ｃｍｐｅｑ”命令の動作の概念図。
【図１６】レジスタにおける“Ｓｅｌｅｃｔ”命令の動作の概念図。
【図１７】レジスタにおける“Ａｄｄ”命令の動作の概念図。
【図１８】レジスタにおける“Ｓｕｂ”命令の動作の概念図。
【図１９】レジスタにおける“Ｓｈｉｆｔ”命令の動作の概念図。
【図２０】レジスタにおける“Ｇａｔｈｅｒ”命令の動作の概念図。
【図２１】レジスタにおける“Ｃｎｔｌｚ”命令の動作の概念図。
【図２２】レジスタにおける“Ａｎｄ”命令の動作の概念図。
【図２３】レジスタにおける“Ｎｏｔ”命令の動作の概念図。
【図２４】レジスタにおける“Ｎａｎｄ”命令の動作の概念図。
【図２５】ハフマン符号化の第２の実装形態に係るフローチャートの一部。
【図２６】ハフマン符号化の第２の実装形態に係るフローチャートの一部。
【図２７】ハフマン符号化の第２の実装形態に係るフローチャートの一部。
【図２８】ハフマン符号化の第２の実装形態に係るフローチャートの一部。
【図２９】前処理の実装形態に係るフローチャートの一部。
【図３０】前処理の実装形態に係るフローチャートの一部。
【図３１】０／非０判定、ｔｅｍｐ１推定、ｔｅｍｐ２推定に係るフローチャート。
【図３２】正負判定と合成とに係るフローチャート。
【図３３】有効ビット数処理に係るフローチャート。
【図３４】分配処理と有効ビット数計算とに係るフローチャート。
【図３５】比較結果合成に係るフローチャート。
【図３６】比較結果合成に係るフローチャート。
【図３７】実施の形態としての画像形成装置の斜視図。
【図３８】コントローラのブロック図の一例。
【符号の説明】
【０１１０】
１０２・・・システムプロセッサ，１０４・・・システムＲＯＭ，１０６・・・システムメモリ，１０８・・・システムコントローラ，１１０・・・バス，１１２・・・画像処理プロセッサ，１１４・・・ページメモリ，１１６・・・ＨＤＤ，１１８・・・ストレージインターフェース，１２０・・・ＵＳＢストレージ，１２２・・・ネットワークアダプタ，１２４・・・レジスタ，１２６・・・ＡＬＵ，１２８・・・レジスタ，１３０・・・ＡＬＵ，１３２・・・内部制御装置，１０００・・・コントローラ，１５００・・・操作パネル，２０００・・・プリンタ，３０００・・・スキャナ，４０００・・・コントローラ。
【図１】
2009273107.tif 000003
【図２】
2009273107.tif 000004
【図３】
2009273107.tif 000005
【図４】
2009273107.tif 000006
【図５】
2009273107.tif 000007
【図６】
2009273107.tif 000008
【図７】
2009273107.tif 000009
【図８】
2009273107.tif 000010
【図９】
2009273107.tif 000011
【図１０】
2009273107.tif 000012
【図１１】
2009273107.tif 000013
【図１２】
2009273107.tif 000014
【図１３】
2009273107.tif 000015
【図１４】
2009273107.tif 000016
【図１５】
2009273107.tif 000017
【図１６】
2009273107.tif 000018
【図１７】
2009273107.tif 000019
【図１８】
2009273107.tif 000020
【図１９】
2009273107.tif 000021
【図２０】
2009273107.tif 000022
【図２１】
2009273107.tif 000023
【図２２】
2009273107.tif 000024
【図２３】
2009273107.tif 000025
【図２４】
2009273107.tif 000026
【図２５】
2009273107.tif 000027
【図２６】
2009273107.tif 000028
【図２７】
2009273107.tif 000029
【図２８】
2009273107.tif 000030
【図２９】
2009273107.tif 000031
【図３０】
2009273107.tif 000032
【図３１】
2009273107.tif 000033
【図３２】
2009273107.tif 000034
【図３３】
2009273107.tif 000035
【図３４】
2009273107.tif 000036
【図３５】
2009273107.tif 000037
【図３６】
2009273107.tif 000038
【図３７】
2009273107.tif 000039
【図３８】
2009273107.tif 000040