(57)【要約】データ処理回路は、新しいタイプの命令を有する命令セットをもつプログラム可能プロセッサ（１２ａ、ｂ）を有する。この命令は、ビット列を指す第一のオペランドと、そのビット列の中の位置を指す第二のオペランドとを有する。プログラム可能プロセッサ（１２ａ、ｂ）は、結果として前記ビット列中の前記位置から、前記位置からのビット列が所定のビットパターンから逸脱するまでに生起するビットの数のカウントを示すコードを返すことによって、このタイプの命令を実行するよう構成されている。この命令は、可変長復号および／または復号を実行するプログラムにおける使用のためにとりわけ有用である。
2008514095.tif 000002
【特許請求の範囲】
【請求項１】
ビット列を示す第一のオペランドと、そのビット列の中の位置を示す第二のオペランドとをもつ命令を有する命令セットをもったプログラム可能プロセッサを有するデータ処理回路であって、前記プログラム可能プロセッサは、前記命令の実行の結果として、前記ビット列中の前記位置から、前記位置からのビット列が所定のビットパターンから逸脱するまでに生起するビットの数のカウントを示すコードを返すよう構成されている、データ処理回路。
【請求項２】
前記命令が前記ビット列を延長するためのさらなるビット列を示す第三のオペランドをもち、前記位置からのビットが前記ビット列の終わりまで前記パターンから逸脱しない場合には、前記カウントに数えられるビットには、前記位置から始まって、前記ビット列の終わりから前記さらなるビット列の始めに続く諸ビットが含まれる、請求項１記載のデータ処理回路。
【請求項３】
前記プロセッサが、前記命令に反応して後続ビットを含む追加的な結果を返すよう構成されており、該後続ビットは、当該位置に続くビットが前記所定のパターンから逸脱する最初のビット位置に対するある所定の相対位置から始まるビット列からのビットである、請求項１記載のデータ処理回路。
【請求項４】
前記プロセッサが、カウントされるビットが始まる前記位置を制御するために前記第二のオペランドのうちからの所定数の下位ビットだけを使用するよう構成されている、請求項１記載のデータ処理回路。
【請求項５】
可変長の符号語の復号を実行するプログラムであって、前記命令の呼び出しに続いて、前記命令によって生成される長さコードから導出される添え字を使って符号語の長さを探索するさらなる命令を含んでいるプログラム、をプログラムされた請求項１記載のデータ処理回路。
【請求項６】
前記プログラムが、前記命令を複数回呼び出すよう諸命令を含んでおり、回ごとに第一のオペランドは同じであり、回ごとに第二のオペランドは前記ビット列中で逐次的な符号語が始まる逐次的な位置を示す逐次的な値をとる、請求項１記載のデータ処理回路。
【請求項７】
可変長の符号語の復号を実行するプログラムであって、可変長の符号語を含むビットストリームの逐次的な諸部分をそれぞれのレジスタにロードする予備命令を含んでおり、該それぞれのレジスタを第一のオペランドおよび第三のオペランドとして使っての前記命令の呼び出しに続いて、長さコードを使って符号語の長さを探索するさらなる命令を含んでいるプログラム、をプログラムされた、請求項２記載のデータ処理回路。
【請求項８】
可変長の符号語の復号を実行するプログラムであって、前記命令の呼び出しに続いて、長さコードおよび前記命令の前記追加的な結果から導出される添え字を使って符号語の長さを探索するさらなる命令を含んでいるプログラムをプログラムされた、請求項３記載のデータ処理回路。
【請求項９】
レジスタを含むプログラム可能プロセッサを使ってビットストリームからの可変長の符号語を復号する方法であって、
・前記ビットストリーム中の所定の位置からビット列を前記レジスタの第一のものにロードするための命令を実行し、
・前記ビット列の中の現在の符号語の先頭へのポインタを、前記レジスタの第二のものに保持し、
・前記レジスタのうちの第一および第二のものをオペランドとする命令を実行し、該命令は前記ビット列中の前記位置から、前記位置からのビット列の先頭部分が所定のビットパターンから逸脱するまでに生起するビットの数のカウントを示すコードを生成するような種類のものであり、
・長さコードを探索表の添え字として使って、現在の符号語の長さを探索する、
ことを含む方法。
【請求項１０】
実行されたときにプロセッサをして請求項９記載の方法を実行せしめるプログラムの命令を含む、コンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム可能プロセッサを有するデータ処理回路に関する。本発明はまた、そのようなプログラム可能プロセッサを使う可変長復号を実行する方法および可変長復号を実行するようプログラムされたプログラム可能プロセッサに関する。
【背景技術】
【０００２】
テキサス・インスツルメンツによって発表された“Application  report  SPRA805“（2002年6月）における“Variable  Length  Decoding  on  the  TMS320C6200  DSP  platform”との論題において、プログラム可能信号プロセッサ上での可変長復号の実装が開示されている。
【０００３】
可変長エンコードは典型的には、一般的なMPEGフォーマットにおけるビデオデータのような、データの圧縮されたエンコードのために使用される。可変長エンコードのよく知られた形態は、いわゆるハフマン符号化である。可変長符号においては、符号化される異なる数値は互いに異なるビット数の符号語を使って符号化されるので、最も頻繁に現れる数値が最も短い符号語を使って符号化される。これにより符号化されたデータの保存および／または伝送の際の必要な記憶および／または必要な伝送帯域が削減される。
【０００４】
数値のストリームをエンコードするとき、一連のそのような符号語が連結されてビット列をなす。可変長符号語のそれぞれは、その符号語より長い他のどんな符号語の先頭にも生じないビット値の系列からなる。結果として、符号語の長さは、符号語の先頭からのビット列におけるビットから決定できる。原理的には、復号は、表探索機構によって実装できる。符号語において生じうる最大数のビットを取り、そのビットを表におけるアドレスとして使って、その符号語の符号語長と復号された語とを探索する（実際の符号語が最大長より短かった場合には、表中でその符号語のビットで始まる諸アドレスにあるあらゆる項目が同じ符号語長および復号された符号語を含む）。
【０００５】
実際上の符号については、Application  report  SPRA805に記載されているように、より小さな探索表を使うことができる。この目的のため、符号語の始まりからの先頭の0または先頭の1の数のカウントを使って、探索表アドレスが形成される。これは、実際上の符号は一般に同じ長さの符号語については同じヘッダ部分を使うという事実に基づいている（ヘッダ部分は論理的な0または1からなる）。この場合、探索動作は、このカウントから構成される探索アドレスを、符号語中、ヘッダ部分から逸脱する最初のビットに続く位置におけるビット値の数と組み合わせて使う。カウントは、先頭の1または先頭の0の数よりも少ないビットで表せるので、これは探索アドレス空間を減らすことになる。
【０００６】
可変長復号にはさまざまな実装が存在する。もちろん、復号過程は、復号機能のみを実行するよう設計された回路を使って実装できるが、典型的には、可変長復号以外の他の機能（たとえばMPEG復号の他の部分）を実行するためのプログラムされた命令をも実行する、好適にプログラムされたプロセッサが使用される。プログラムされたプロセッサを使用することの利点は、こうした他の機能に加えて可変長復号を実行するために追加的な回路がほとんど、あるいは全く必要とされないことである。
【０００７】
Application  report  SPRA805は、可変長復号を加速するための「NORM」命令の使用を記載している。NORM命令は、浮動小数点演算の背景で知られている。そこでは、この命令は、ある数の先頭における冗長な符号ビット（一連の1または0）のカウントを決定するために使われる。可変長復号の背景では、この命令は、符号語長および復号された語を取得するための探索アドレスを形成するために使うことができる。
【０００８】
可変長復号プログラムは、TMS320C62000  DSPをして、各時に、一連の符号語を含むビット列の次の部分をオペランドレジスタに移させる。そうした部分は、それらが各時に次の符号語のビットで始まるように選択される。プログラムはNORM命令を使うことで、オペランドの先頭からの一連の0または1のカウントを取得し、そのカウントを使って該プログラムは探索表におけるアドレスを形成する。このアドレスを用いた探索により、該プログラムは符号語の長さを決定し、符号語の長さから、ビット列における次の符号語の先頭が決定される。次いで、次の符号語から始まる新たなオペランドがビット列から形成され、その後、前記処理が繰り返される。
【０００９】
TMS320C62000のようなDSP（Digital  Signal  Processor［デジタル信号プロセッサ］）では、プログラムからの命令は、実行を加速するために並列に実行できる。しかし、可変長エンコードの場合には、これは限られた程度までしか使えない。次の符号語が処理できる前にその都度符号語の長さを決定しなければならないからである。改良の余地があることが見出されている。
【発明の開示】
【発明が解決しようとする課題】
【００１０】
可変長復号の効率的なプログラミングをサポートするプロセッサを提供することが本発明の一つの目的である。
【００１１】
可変長復号を効率的に実行するようプログラムされたプロセッサを提供することが本発明の一つの目的である。
【００１２】
可変長復号の効率的な実行を行う方法を提供することが本発明の一つの目的である。
【課題を解決するための手段】
【００１３】
本発明に基づくプロセッサが請求項に述べられている。本発明によれば、プロセッサは、その命令セットに、SNORMという命令を含むよう構成される。このSNORM命令は、ビット列を含むビット列オペランドと、そのビット列内での位置を示す位置オペランドとを有する。本プロセッサは、ビット列において指示された位置から、当該ビット列がすべて論理的な1またはすべて論理的な0のパターンといった所定のパターンから逸脱するその後の最初のビット位置になるまでのビット数のカウントを表す長さコードを返す。
【００１４】
よく知られているように、プロセッサの命令セットは、どんなタイプの機能回路がプロセッサ内に含められる必要があるかを当業者に知らせる。命令セットは、プロセッサがプログラムから実行できる異なる命令種別の集合である。通常、命令セットの一部となるよく知られた汎用命令種別としては、ADD、SHIFT、LOAD、STOREなどのような命令が含まれる。本発明によれば、命令セットにSNORM命令を含むプロセッサが提供されるのである。
【００１５】
プロセッサが可変長復号を実行するようプログラムされるとき、SNORM命令を使うことで、符号語の先頭部分の長さコードを得る際に、まず次の符号語から始まるビット列の部分をもつオペランドを形成するための別個の命令を必要とすることなしにできる。その代わり、既存のビット列オペランドにおける符号語の開始を示す位置オペランドが使われ、そのビット列オペランドの選択可能な内部部分についての長さコードが取得される。一連の符号語について、更新される必要があるのは位置オペランドだけである。ビット列のほうは、符号語が、ビット列オペランドにおいてビット列の境界をまたぐまで更新される必要はない。
【００１６】
好ましくは、ビットを数え始める位置を決定するのは位置オペランドのうちある所定数のビットだけで、位置オペランドのそれより上位のビットは無視される。好ましくは、使用される下位ビットの数は、ビット列オペランドのビット長に対応する。このようにして、位置オペランドを提供するのに使われるレジスタは、連結された可変長符号語を含むビットストリーム内における異なる語を指すより上位のビットを含みうる。
【００１７】
好ましくは、SNORM命令は、ビット列の相続く部分を含むビット列オペランドを含む少なくとも二つの別個に選択可能なレジスタを参照する。この場合、プロセッサは好ましくは、符号語の先頭部分の、ビット列が所定のパターンから逸脱するその後の最初の位置までの長さコードを取得するよう構成され、前記パターンが前記ビット列オペランドの一つから別のビット列オペランドに続くときには二つ以上のビット列オペランドから先頭部分における位置を数える。
【００１８】
また、好ましくは、SNORM命令は、ビット列オペランドのうちからの、ビット列が所定のパターンから逸脱する前記最初の位置に対する所定の相対位置から（典型的には前記最初の位置から）始まるビットを含む追加的な結果を返す。可変長復号プログラムは、好ましくは、この追加的な結果を前記長さコードとともに使って探索表アドレスを形成する。あるさらなる実施形態では、プロセッサは、SNORM命令の実行によって、長さコードと追加的結果の所定のビット数との組み合わせが探索表アドレスとして返されるように構成される（この場合、プロセッサは、SNORM命令に反応して長さコードと追加的結果のための別個の結果を返す必要はない）。これは、可変長復号のために実行される必要のある命令数を減らすことになる。しかしながら、SNORM命令が長さコードと追加的結果とのために別個の結果出力を使うことは、復号できる異なる可変長符号に関して本プロセッサがより柔軟になるという利点がある。
【００１９】
これらのことを含む本発明のさまざまな目的および有利な側面について、図面を援用して記載される限定的でない例を使って解説する。
【発明を実施するための最良の形態】
【００２０】
図１は、プログラム可能なプロセッサ回路の例を示している。この回路は命令発行ユニット１０、機能ユニット１２ａ、ｂおよびレジスタファイル１４を含む。命令発行ユニットは、コマンドコードおよびレジスタ選択コードを発するための出力１２０をもつ。レジスタファイル１４は、レジスタ選択コードを受信するための入力、選択されたレジスタからのオペランドデータを出力するための出力１２２および選択されたレジスタに書き込まれる必要のある結果データを受信するための入力１２４をもつ。機能ユニット１２ａ、ｂはコマンドコードおよびオペランドデータを受信するための入力ならびに演算結果を出力するための出力をもつ。
【００２１】
動作においては、命令メモリおよびプログラムカウンタ（図示せず）を含んでいることのできる命令発行ユニット１０は、逐次に実行される必要のあるプログラムの諸命令を生成する。命令発行ユニットは命令から諸コマンドを導出し、該コマンドからの演算コードを機能ユニット１２ａ、ｂに、レジスタ選択コードをレジスタファイル１４に加える。レジスタ選択コードは、コマンドから導出されるオペランドレジスタ選択コードと、コマンドから導出される結果レジスタ選択コードとを含む。オペランドレジスタ選択コードに反応して、レジスタファイル１４は、該オペランドレジスタ選択コードによって選択されているレジスタからオペランドデータを取得し、このデータを機能ユニット１２ａ、ｂに加える。演算コードは、機能ユニット１２ａ、ｂによって実行される必要のある演算を選択する。機能ユニット１２ａ、ｂは、演算コードの制御のもとで、選択された演算を前記オペランドデータを使って実行し、結果データを生成する。レジスタファイル１４は機能ユニットから結果データを受信し、結果データを結果レジスタ選択コードによって同定されるレジスタに記憶する。
【００２２】
プログラム可能なプロセッサ回路の個別的な例が示されているが、本発明はこの例に限定されないことは理解しておくべきである。たとえば、レジスタファイル１４は、そこからオペランドデータを読み込むことのできる、あるいはそこに結果データを保存できる、複数のレジスタファイルであってもよい。さらに、機能ユニット１２ａ、ｂは、それぞれ三つ、二つのオペランド入力と、それぞれ二つ、一つの結果出力をもつものとして示されているが、オペランド入力および／または結果出力のこれ以外の数も可能であることは理解しておくべきである。さらに、タイミングについては何ら詳細を示していないが、典型的にはパイプライン処理が使われるであろうことは理解しておくべきである。それにより、ある命令からのオペランドレジスタ選択コードがレジスタファイル１４に加えられるのは、機能ユニット１２ａ、ｂが前の命令によって選択された演算を実行している間になされ、結果レジスタ選択コードはのちになってはじめて加えられうるということになる。しかし、本発明から外れることなく、他の形のタイミングを使うこともできる。
【００２３】
さらに、使用する機能ユニット１２ａ、ｂはいくつでもよい。たとえば機能ユニット一つだけでもよいし、より多数でもよい。以下では、プログラム可能プロセッサのプログラムは一連の逐次的な命令として記述するが、好ましくは複数の機能ユニット１２ａ、ｂが使用され、逐次的命令のうちの異なるものが、命令間のデータ依存性によって許される限り、異なる処理ユニット１２ａ、ｂによって並列で実行できるようにされることは理解しておくべきである。プロセッサに含まれる必要のある機能回路は、プロセッサ回路の命令セットによって決まる。命令セットは、プロセッサがプログラムからのコマンドとして実行できる命令（ここでは「コマンド」とも呼ばれる）の異なる種別の集合である。（ここでの用法では、命令（あるいは同じことだがコマンド）は、機械実行可能なプログラムの不可分な「原子」であり、この意味での命令（あるいはコマンド）は、実行のためにプロセッサに発することのできる下位の命令部分に分割することはできない）。プログラムにおける各命令の命令種別は通例、命令の演算コードフィールドの内容によって表される。これはプロセッサがその演算を制御するために使用するものである。通常、命令セットの一部となるよく知られた汎用命令種別としては、ADD、SHIFT、LOAD、STOREなどのような命令が含まれる。プログラム可能プロセッサにおいては、プログラム中の任意の点において、命令セットからの諸命令は互いに代替として使うことができる。本発明によれば、命令セットにSNORM命令を含むプロセッサが提供される。この命令に対するプロセッサの応答は以下に述べる。
【００２４】
本発明のある側面によれば、機能ユニットの少なくとも一つ１２ａが、記号的に
SNORM  R1,  R2,  R3,  R4,  R5
と記されるコマンドをサポートするよう設計される。
【００２５】
このコマンドは、符号R1、R2、R3によって同定される３つのオペランドをもつ。R1、R2、R3はその３つのオペランドが記憶されているレジスタを参照している。このコマンドは、二つの結果を生じる。レジスタ参照R4、R5は、結果が記憶されるべきレジスタへの参照を表している。典型的には、命令メモリに記憶されるコマンドは、命令（SNORM）、オペランドレジスタアドレス（R1〜3）および結果レジスタアドレス（R4〜5）を同定するビットからなる各フィールドを含む。
【００２６】
SNORMコマンドを含むプログラムが実行されると、命令発行ユニット１０は、このコマンドを表す命令を取得し（これは並列に取得された複数の命令の一つであることもできる）、応答としてSNORM命令を同定する演算コードを機能ユニット１２ａに加える。また、命令発行ユニット１０は、命令において同定されているレジスタR1〜5に対応するコードをレジスタファイル１４に加える。
【００２７】
機能ユニット１２ａの回路は、機能ユニット１２ａがSNORM演算コードに反応して長さコードを生成するよう構成されている。長さコードとは、最初の２つのオペランド中のビット列の連結において、第三のオペランドによって指示される位置から始まって互いに同じビット値をもつ一連のビットの数のカウントを表すものである。さらに、命令機能ユニット１２ａは前記連結のシフトされたバージョンを生じる。シフトとは、前記第三のオペランドに前記一連のビット数のカウントを加えたものに等しい数のビット位置だけシフトしたことを表す。
【００２８】
解説の目的のため、ある例では、オペランドは8ビットの長さをもつことができる。この場合、最初の２つのオペランド（R1、R2で示される）はたとえばビット列
0010  1011  および  1110  0101
を含みうる。
【００２９】
実際上は、各オペランド中にはずっと多数のビットが使われることが好ましいことは理解しておくべきである。たとえば各オペランドに16もしくは32ビットまたは64ビットである。8ビットのオペランドを使ったのは単に解説のためである。上記の例のオペランドを用いると、連結されたビット列は
0010101111100101
となる。
【００３０】
ここで、もし第三のオペランド（R3によって示される）が値6を有していれば、数5という長さコードが（レジスタR4に）返されるであろう。これがこの連結において6番目のビット位置から始まる論理的な1の数である（位置番号は連結における左端の位置における0から始まり、左から右に向けて増加する）。上記の例では、ビット位置は左から始めて、すなわち最上位ビットから数えられることになるが、ビット位置はその代わりに右から、すなわち最下位ビット位置から数えてもよいことは理解しておくべきである。シフトされた出力（レジスタR5中）は値
0010  1000
をもつ。
【００３１】
これらは前記の連結されたビット列の最後の５つのビット値で、右端に３つの０のビット値を代入したものである。
【００３２】
好ましくは、前記の位置が１オペランドの長さを超えることがないよう、この演算の実行に際して、第三のオペランドの上位ビットは無視される。これは、この第三のオペランドを第一のオペランドの長さで割った余りを使うことと同等である（今の例では、第三のオペランドを8で割った余り）。
【００３３】
SNORM命令のオペランドと効果の機能的な記述から、当業者は命令セットにこの命令をもつプロセッサを実装するために使用しうる回路を決定できるであろう。そのようなプロセッサの例について述べる。
【００３４】
図２は、SNORM命令を実行するための演算コードが機能ユニット１２ａに加えられるときに作動させられる機能ユニット１２ａの部分の実施例を示している。この部分は第一のバレルシフタ２０、符号長計算ユニット２２および第二のバレルシフタ２４を含んでいる。第一のバレルシフタ２０は、機能ユニット１２ａの２つのオペランドデータ入力に結合されたシフトデータ入力をもつ。これにより、レジスタ参照のうちの二つR1、R2によって参照されているオペランドデータを受け取る。第一のバレルシフタ２０は、レジスタ参照のうちの第三R3によって参照されているレジスタファイル１４の第三のオペランドデータ入力に結合されたシフト制御入力をもつ。第一のバレルシフタ２０は、符号長計算ユニット２２の入力に結合された出力をもつ。符号長計算ユニット２２は、機能ユニット１２ａの結果のための第一の出力と、第二のバレルシフタ２４のシフト制御入力とに結合された出力をもつ。第二のバレルシフタ２４は、第一のバレルシフタ２０の出力に結合されたシフトデータ入力と、機能ユニット１２ａの結果のための第二の出力に結合された出力とをもつ。
【００３５】
示されているのが機能ユニット１２ａの一部だけであることは理解しておくべきである。実際上は、機能ユニットは他の演算コードに反応して他の演算を実行するためのさらなる回路を含みうるし、あるいはバレルシフタ２０、２４および／または符号長計算ユニット２２は他の演算も実行できるより大きな諸回路の一部であってもよい。さらに、さまざまなデータの供給元および／または供給先を選択するために多重化回路が存在していてもよい。さらに、受け取られたコマンドに依存して、機能ユニットの選択された部分を作動させ、多重化回路を制御するために、復号回路が存在していてもよい。明確のため、SNORM命令の実行に関わる回路部分しか示していない。
【００３６】
第一のバレルシフタ２０は、第一および第二のオペランドデータR1、R2を連結したもののビットをシフトさせたバージョンを含んでいる出力ビット列を生成するよう構築されている。上で述べた8ビットオペランドの例では、バレルシフタ２０のシフトデータ入力は次のオペランドデータビット列を受け取ることになる。
【００３７】
0010  1011  および  1110  0101
シフトの量は第三のオペランドデータR3によって選択される。今の例では、シフト制御入力は値6を受け取り、第一のバレルシフタ２０は出力列
1111  1001  0100  0000
を生成する。
【００３８】
ここで、第一のバレルシフタは連結を左に6位置シフトさせており、右端に6つの0が加えられている。バレルシフタ回路そのものは既知なので、詳細な回路実装は示さない。使用される特定の実装は本発明には重要ではない。
【００３９】
好ましくは、シフトの量が１オペランドの長さを超えることがないよう、この演算の実行に際しては、第三のオペランドの上位ビットは無視される。これは、この第三のオペランドを第一のオペランドの長さで（たとえば16、32または64で）割った余りを使うことと同等である。
【００４０】
符号長計算ユニット２２は、その入力列におけるビット列の連結において、入力における最初の位置から始まって互いに同じビット値をもつ一連のビットの数のカウントを決定する。今の例ではこれは５というカウントを与える。入力には5つの相続く論理的な１のビットがあるからである。
【００４１】
使用される符号長計算ユニット２２の特定の実装は本発明には重要ではない。実装例は、浮動小数点演算回路に見出すことができる。そこでは、長さ計算を使うことで、算術演算の結果が規格化される（すなわち、符号のビットの最後から始まる結果の一部が所定の位置にシフトされる）。
【００４２】
第二のバレルシフタ２４は第一のバレルシフタ２０の出力ビット列を、ある追加的なビット位置の数だけ左にシフトさせる。追加的な位置の数は、符号長計算ユニット２２によって出力されるカウントによって制御される。この演算の結果の左端の語だけが、機能ユニット１２ａの出力においてレジスタファイル１４に出力される。今の例では、結果は次のようになる。
【００４３】
0010  1000
この例では、語長は8ビットであるが、もちろん、16、32または64といったより大きな語長のオペランドおよび結果が使われる場合には、より多くのビットが出力されうる。
【００４４】
もちろん、同じ効果を実現するために機能ユニット１２ａの他の実装を使うこともできる。たとえば、第二のバレルシフタ２４および符号長計算ユニット２２の機能は、組み合わされた回路によって実行されてもよいし、および／または第三のオペランドの制御のもとで機能ユニット１２ａのオペランドデータに対して直接的に符号長計算ユニット２２の機能を実行する回路を使用してもよい。
【００４５】
SNORM命令は、一連の可変長符号語の復号ができる速さを向上させるために使用できる。次は、復号を実行するために使うことのできるプログラムの例である。
bptr=0;
wptr=0;
word0=buf[wptr];
word1=buf[wptr+1];
while(wptr<end)
{    nrm,sucbits=OP_SNORM(word0,word1,bptr);
index=getIndex(nrm,sucbits);
len=lenTable[index];
dec=codeTable[index];
bptr=bptr+len;
wptr=bptr>>5;
word0=buf[wptr];
word1=buf[wptr+1];
}
このプログラムは、よく知られたＣ言語の文にほぼ一致する擬似コード文で表している（この言語では、[  ]が配列の添え字を表し、>>が右シフトを表す）。理解されるであろうように、Ｃ言語を選んだのは単に対応する一連の機械命令を記述する上での明確のためである。OP_SNORMの機能呼び出しをもつ文は、上記で説明したSNORM命令の実行を指している。
【００４６】
プログラム中、bufはメモリ位置の配列を表しており、ここに、可変長符号からの連結された諸符号語を含むあるビットストリームをなす一連の語（32ビット値）が保存されている。ポインタ変数bptrおよびwptrが使われている。wptrは、現在の符号語の始まりを含む、bufからの語の位置を示す。変数word0およびword1（これらの値はレジスタファイル１４においてそれぞれのレジスタ内に保持されている）はそれぞれ、bufからのこの語のコピーおよびbufからの次の語のコピーを含んでいる。bptrの下位ビットは変数word0における現在の符号語の最初のビットの位置を示す。bptrの上位ビットはwptrに対応する。
【００４７】
前記プログラムは明確のためにデータを保持する名前の付いた変数を使用しているが、これらの名前が典型的には、対応するデータが保存されているレジスタを表すことは理解しておくべきである。
【００４８】
前記プログラムは直列の命令として表現されているが、プロセッサが複数の機能ユニットおよび該複数に並列に命令を発することのできる命令発行ユニットを含んでいるときは、データの依存関係によって課される制約の範囲内で可能な限り、前記プログラムの命令のうち異なるものが異なる機能ユニットによって並列に実行されてもよいことは強調しておくべきであろう。また、命令の実行のシーケンスは、データの依存関係と矛盾しないならば、前記プログラムにおけるシーケンスとは異なっていてもよい。
【００４９】
whileループは可変長復号を実行する。しかし、明確のため、復号された語を使用する命令（復号された語を配列に保存する命令など）はループからは省かれている。ループの最初の命令において、SNORM命令が実行される。これは、word0とword1の連結においてbptrによって示される位置からの互いに等しいビット値の数を表す長さコードを決定することを含む。好ましい実施形態では、機能ユニットは、32ビットオペランドが使用される場合ならこの目的のためにbptrの５つの下位ビットだけを使用する（オペランドの長さがより長かったり短かったりする場合にはビット数も多くなったり少なかったりする）。もちろん、これらのビットを、機能ユニットがそうしていなければ、プログラム中の命令によってbptrからマスクで取り出してもよいし、あるいは値が決して31を超えない別個のポインタを使用してもよい。
【００５０】
結果として得られる長さコードは、変数nrmで表されるレジスタに記憶される。さらに、word0およびword1の連結は、nrm＋（bprtを32で割った余り）ビットだけシフトされ、その結果が変数sucbitsによって表されるレジスタに記憶される。
【００５１】
whileループの第二の命令では、長さコードおよび変数sucbitsの内容の始まりから添え字の値が形成される。この添え字の値は、長さ表lenTableから符号語の長さを取得し、符号表codeTableから復号された符号語を取得するための添え字として使用される。次に、変数bptrは取得された長さを足してインクリメントされる。また、bptrの新しい値のためのword0およびword1の値が取得される。その後、ループは反復される。
【００５２】
本プログラムは単にSNORM演算の使用を解説するはたらきをするものであることは強調しておくべきであろう。SNORM命令について多くの代替的なバージョンのプログラムが可能である。
【００５３】
記載されている好ましい実施形態では、機能ユニット１２ａによるSNORM命令の実行は、bptrによってポイントされるビット位置から異なるビット値に遭遇する最初の次のビット位置までの互いに同じビット値をもつ一連のビットの数のカウントを生じる。つまり、一続きの論理的な0または論理的な1のビット数がカウントされるのである。しかしながら、本発明はこの実施形態には限定されない。別の実施形態では、機能ユニット１２ａは一続きの論理的な1のみのカウントを生じる。さらに別の実施形態では、機能ユニット１２ａは一続きの論理的な0のみをカウントする。別の実施形態では、機能ユニット１２ａは、bptrによって選択された位置から、所定のシーケンスから逸脱する最初のビット値が見出されるまでのビット位置の数をカウントする。機能ユニットの好適な実装を用いれば、前記の所定のシーケンスは任意の所定のシーケンスであることができ、単に一連の論理的な1や一連の論理的な0でなくてもよい。そのような別の一連の値を使うことは、その符号語のうちあとに続くのが高々ある所定のビット数であることを示すためにそのようなシーケンスからの逸脱が使われる可変長符号が使用される場合に有用でありうる。したがって、本発明は、すべて1またはすべて0の所定のシーケンスについてのビット位置のカウントには限定されない。
【００５４】
好ましくは、長さコードnrmが返すことのできる最大長は、高々可変長符号語の最大長に限定される。所定数を超える前記所定のパターンに従った一連のビットに遭遇する場合には、所定の最大長符号が返される。
【００５５】
好ましくは、長さコードnrmは、プロセッサがあらゆる数について使う通常の数表現と同じ数表現によって長さを表す。しかし、これは必須ではない。コードを使うのは表lenTable、codeTableにおいて使用するための添え字を形成するためだけなので、前記プログラム例のためには、異なる長さを区別する任意のコードを使うことができる。前記の表の項目は、任意のコードを受け容れるために再配列されてもよい。
【００５６】
しかし、いかなるコードが使われるにしろ、長さコードnrmのビット数Nは、好ましくは長さコードが表す最大長Lよりも著しく短い。このようにして、長さコードnrmを、復号された語および符号語長の表探索のための添え字の一部として使用することは、必要とされる探索表の大きさを著しく縮小する。好ましくは、必要とされる探索表の大きさが最小になるよう、長さコードLは、Lが2のN乗に等しいようエンコードされる。たとえば最大16ビットの長さを表すためには、たった4ビットの長さコードで十分である。
【実施例】
【００５７】
本発明がここまでに述べてきたSNORM命令に限定されないことは理解しておくべきである。たとえば、長さコードnrmを生成するSNORM命令の代わりに、添え字の値を直接生成する命令を使ってもよい。あるいはまた、命令セットのうちに添え字の値を計算するための追加的な命令を含めてもよい。ある実施形態では、添え字の値は長さコードnrmのあとに結果変数sucbitsのある所定の第一のビット数を連結することによって形成されうる。例としては、sucbitsの前記所定数は4であり、添え字の値の計算は（Ｃのコードで）
index=(nrm<<4)|(sucbits>>(32-4))
に対応する。
【００５８】
もちろん、添え字の値を計算する他の方法を使用してもよい。この例は、異なる符号語を区別するために、所定のビット列からの最初の逸脱後の符号語からの高々4つの追加ビットで十分であるような可変長符号が使われていることを想定している。必要とされる追加ビットがより少なかったりより多かったりする場合、あるいはnrmおよびsucbitsからの情報が別の方法で組み合わされうる場合には、異なる添え字の値を使うこともありうる。
【００５９】
ある実施形態では、命令セットの中に、添え字の値を計算するための命令が含められる。この命令は記号的に
INDX  R1,  R2,  R3,  R4
と表すことができる。
【００６０】
ここで、R1〜3は、nrm、sucbitsおよび添え字の値に含められる必要のあるR2からのいくつか（たとえば4）のビットを含むオペランドレジスタを参照している。添え字の値はレジスタR4に書き込まれる。任意的に、第三のオペランドは省略してもよい（たとえば、デフォルト数を使う場合）。
【００６１】
図３は、SNORM命令の結果として出力される添え字の値を出力するよう構成された機能ユニットの例を示している。合成回路３０は、符号長計算ユニット２２および第二のバレルシフタ２４の出力からの長さコードからの添え字の結果を形成するために追加されている。合成回路３０が非常に単純であることは理解しておくべきであろう。これは単に、符号長計算ユニット２２と第二のバレルシフタ２４の出力の所定のビット線を結果出力に接続することに関わるものである。
【００６２】
この機能ユニットを使えば、レジスタファイル１４への結果出力接続は一つしか必要なく、命令発行ユニット１０からのコマンドは一つの結果レジスタをアドレス指定するだけでよい。合成回路３０は、当該機能ユニットの残りの部分のいかなる実装とも容易に組み合わせることができることは理解されるであろう。しかしながら、不都合な点は、当該機能ユニットが可変長符号の特定のクラスに固有になる（結果を形成するのに使用されるバレルシフタの出力の前記所定のビット数のため）ことである。
【００６３】
別の実施形態では、結果として生成されるのが長さ符号nrmだけであるという異なるSNORM命令が使用される。この実施形態の実装では、前記第二のバレルシフタおよびその結果出力は省略してもよい。この場合、前記プログラムは好ましくは、word0、word1、nrmおよびbptrから添え字の値を計算するための一つまたは複数の命令を含む。あるさらなる実施形態では、この目的のためのさらなる専用の命令をサポートする機能ユニットが配置される。第一の実施形態では、このさらなる命令に反応して実行される機能は、たとえば、第一のオペランドおよび第二のオペランド（word0およびword1）を連結したもの（concatenation）から、ある第三のオペランドによって示されるビット位置から始まるある所定の数の相続くビットを選択することを含む。そのような機能の結果は
concatenation(R1,R2)<<R3
に対応する。
【００６４】
この実施形態では、前記第三のオペランドは、bptrとnrmを足し合わせることによって計算される。結果は、先に述べたsucbitsの結果と同等である。
【００６５】
別の実施形態では、専用命令において、word0およびword1に加えてnrmとbptrの両方がオペランドとして使用される。この実施形態では、前記命令の実行は、nrmとbptrを足し合わせてシフト量を決定することに関わり、nrmを使うことでシフト結果と組み合わせた添え字を形成することができる。そのような機能の結果はたとえば（Ｃコードで）
index=(nrm<<4)|(concatenation(R1,R2)<<(28-(R3+R4)))
に対応する。
【００６６】
ここで、28という数は、語長（32）と添え字において使われている連結のビット数（4）との差に等しい。
【００６７】
ある実施形態では、前記プロセッサは、オペランドが二つだけのSNORM命令をサポートするよう設計される。可変長符号語を含むビット列を与えるのに使われるオペランドは一つだけである。第二のオペランドは、ビット列オペランドにおけるある位置をポイントする。好ましくは、第二のオペランドのうち、ビット列オペランドの半分の中のどこかをポイントする一部だけが使われる。この実施形態では、プロセッサはSNORM命令に反応して、ビット列オペランドの前半の中の、第二のオペランドによって指示される位置から始まる一連のビットの長さコードを返す。
【００６８】
図４は、オペランドが二つだけのSNORM命令のこの実施形態をサポートする機能ユニットの実施形態を示している。この実施形態では、単一長さの第一のバレルシフタ２０が使用される。第二のオペランドは、この第一のバレルシフタ２０のシフト制御入力に加えられ、好ましくはこのオペランドの値のうち、オペランド半分の中の位置を選択する下位の部分だけが第一のバレルシフタ２０を制御するために使用される。
【００６９】
次は、そのようなSNORM命令を利用するプログラムの例である。これは、可変長符号語が決してオペランド半分より長くならない場合についてである。
bptr=0;
wptr=0;
top0=buf[wptr];
word0=buf[wptr];
word1=buf[wptr+1];
while(wptr<end)
{    nrm,sucbits=OP_SNORM(top0,bptr);
aux=(word0<<16)|((word1>>16)&0xffff);
index=getIndex(nrm,sucbits);
len=lenTable[index];
dec=codeTable[index];
bptr=bptr+len;
wptr=bptr>>5;
word0=buf[wptr];
word1=buf[wptr+1];
if(bptr&31>16)  top0=aux;  else  top0=word0;
}
この場合には、SNORM命令のためのオペランドとしては、ビット列をもつ変数は単一のtop0しか使われていないことを注意しておくべきであろう。SNORM命令のオペランドとして使用されるかもしれない変数auxに、変数word1の半分をシフトさせて入れるシフト演算が加えられている。変数auxからの値は、変数bptrがビット列オペランドの後半をポイントするときに使用される。半語というあらかじめ決まったシフト距離（この例では16）を使っており、そのため必要とされるシフト演算は符号語の長さが知られるより前に（他の演算と並列に）実行できることを注意しておくべきであろう。長さがわかるまで延期する必要があるのは、ビット列オペランドの選択だけである。
【００７０】
これで明らかとなったであろうように、本発明は、可変長復号をサポートするための選択された命令をプロセッサの命令セットに追加することを提供する。該命令への応答の機能的な記述により、当業者は、プロセッサにおいて使う必要のある回路の機能について知るであろう。追加される命令は好ましくは、可変長復号を実行するために必要とされる一連の命令の数を減らし、その一方で好ましくは、追加された命令の追加によって必要になる、該命令を実行するために必要とされる可能性のある追加的ハードウェアは可能な限り少ない。可変長復号のために実行される必要のある一連の命令数が減らず、あるいはせめて必要とされる命令サイクル数が減らず、あるいは必要なレジスタ数が減らないのであれば、汎用の命令型しかもたないプロセッサに対して利点はない。他方、追加的命令が、完全に専用の可変長復号回路を実装するほうが安上がりになるほど多くの追加的ハードウェアを必要とするのであれば、そのような専用の可変長復号回路に対して利点はない。
【００７１】
本発明の可変長復号への応用について述べてきたが、SNORM命令の実施形態は可変長エンコードにも、たとえば、エンコードする必要のある数字の符号のビットの数を決定するために、使いうることは理解しておくべきである。この場合、符号のビットの数を使うことで、符号語の探索を簡略化できる。
【図面の簡単な説明】
【００７２】
【図１】プロセッサ回路を示す図である。
【図２】機能ユニットの部分を示す図である。
【図３】代替的な機能ユニットの部分を示す図である。
【図４】さらなる機能ユニットの部分を示す図である。
【図１】
2008514095.tif 000003
【図２】
2008514095.tif 000004
【図３】
2008514095.tif 000005
【図４】
2008514095.tif 000006
【国際調査報告】
2008514095.tif 000007
2008514095.tif 000008
2008514095.tif 000009