(57)【要約】【課題】本発明は、複数バイトデータを高速にエンディアン変換する高速エンディアン変換方法に関し、変換対象の複数バイトデータのマスクを生成して入れ替え対象のデータをそれぞれ抽出し、抽出したデータをシフトして入れ替え位置を調整して論理演算してエンディアン変換を行い、少ないステップで高速にエンディアン変換を実現することを目的とする。【解決手段】変換対象の複数バイトデータから、相互に変換する２組のデータを取り出すマスクを生成する第１、第２のステップと、変換対象の複数バイトデータを第１のバレルシフトした当該複数バイトデータから、マスクでデータを抽出し、変換した第１の２組のデータを生成する第３のステップと、変換対象の複数バイトデータを第２のバレルシフトした当該複数バイトデータから、マスクでデータを抽出し、変換した第２の２組のデータを生成する第４のステップと、それぞれ生成した第１の２組のデータと、第２の２組のデータとの一方あるいは両方をシフトして位置合わせして一緒にし、変換した複数バイトデータを生成する第５のステップとを有する。【選択図】  図１
2004318251.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
変換対象の複数バイトデータから、相互に変換する２組のデータを取り出すマスクを生成する第１のステップと、
前記変換対象の複数バイトデータを第１のバレルシフトした当該複数バイトデータから、前記マスクでデータを抽出し、変換した第１の２組のデータを生成する第２のステップと、
前記変換対象の複数バイトデータを第２のバレルシフトした当該複数バイトデータから、前記マスクでデータを抽出し、変換した第２の２組のデータを生成する第３のステップと、
前記それぞれ生成した第１の２組のデータと、第２の２組のデータとの一方あるいは両方をシフトして位置合わせして一緒にし、変換した複数バイトデータを生成する第４のステップと
を実行させるエンディアンプログラム。
【請求項２】
前記複数バイトデータを４バイトデータとしたことを特徴とする請求項１記載のエンディアン変換プログラム。
【請求項３】
前記第３のステップと前記第４のステップを繰り返した後、その結果をシフトして位置合わせして一緒にし、変換したバイトデータを生成することを特徴とする請求項１記載のエンディアン変換プログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、複数バイトデータのエンディアン変換を行うプログラムに関するものである。
【０００２】
【従来の技術】
４バイト（３２ビット）の数列を扱うプロセッサやプログラムなどで、４バイト長のバイト１，２，３，４の並びが、「１，２，３，４」のものと、「４，３，２，１」のものとがあり（バイト内は同一）、両者でデータの授受を行なう場合には、変換（エンディアン変換という）を行なう必要がある。
【０００３】
従来、エンディアン変換として、４バイト（３２ビット）数列の変換を、下記のように行っていた。
【０００４】
図５は、従来技術の説明図を示す。これは、４バイトのデータ（０ｘ４４３３２２１１）をエンディアン変換してデータ（０ｘ１１２２３３４４）を生成する手順を示す。
【０００５】
図５において、初期は、初期状態であって、第１レジスタ（ｒ１）に４バイトのデータ（０ｘ４４３３２２１１）（１６進表現の４バイトデータ）が代入され、▲１▼’’以下の処理を開始する。
【０００６】
▲１▼’’と▲２▼’’で、マスク０ｘ００ｆｆ００ｆｆを作成する。
▲３▼’’と▲４▼’’と▲５▼’’で、元の４バイトデータ”０ｘ４４３３２２１１”の前段の２バイト”４４３３”を入れ替えて”３３４４”とすると同時に、後段の２バイトの”２２１１”を入替えて”１１２２”とする。
【０００７】
▲６▼’’と▲７▼’’で、”３３４４１１２２”の前段の”３３４４”と”１１２２”を入替えて”１１２２３３４４”とする。
【０００８】
以上のように、７ステップによって、元の４バイトデータ”０ｘ４４３３２２１１”を”０ｘ１１２２３３４４”に変換していた。
【０００９】
図６は、命令の説明図（図５）を示す。ここでは、図５のｍｏｖ，ａｄｄ，ａｎｄは、図示の命令によって実行される。
【００１０】
また、エンディアン（ｅｎｄｉａｎ、データ配列）の変換を行うことなく、高速に循環シフトする技術がある（特許文献１）。
【００１１】
【特許文献１】
特開２００２−２３６３１号公報の〔０００４〕などを参照。
【００１２】
【発明が解決しようとする課題】
上述したように、従来のエンディアン変換は、例えば４バイト（３２ビット）の順番を”０ｘ４４４３３２２１１”から”０ｘ１１２２３３４４”に変換するのに７ステップを要し、多くの時間が必要となってしまう問題があった。
【００１３】
また、前述した後者の特許文献１では、エンディアン変換を行うことなく、循環シフトして処理を行なうものであり、エンディアン変換しないと処理できないプロセッサやプログラムには適用できないという問題があった。
【００１４】
本発明は、これらの問題を解決するため、変換対象の複数バイトデータのマスクを生成して入れ替え対象のデータをそれぞれ抽出し、抽出したデータをシフトして入れ替え位置を調整して一緒にしてエンディアン変換を行い、少ないステップで高速にエンディアン変換を実現することを目的としている。
【００１５】
【課題を解決するための手段】
図１を参照して課題を解決するための手段を説明する。右側の例は、後述する４バイトデータをエンディアン変換するときの例を示す（８バイトデータの場合は、図３と図４に示す）。
【００１６】
図１において、▲１▼のステップは、マスクを生成する。
▲２▼のステップは、マスクを生成する。これら▲１▼と▲２▼のマスク生成により、複数バイトデータから変換対象の２バイトのデータを抽出するマスクを生成する。
【００１７】
▲３▼のステップは、変換対象の複数バイトデータを第１のバレルシフトした当該複数バイトデータから、マスクでデータを抽出し、変換した第１の２組のデータを抽出する。
【００１８】
▲４▼のステップは、変換対象の複数バイトデータを第２のバレルシフトした当該複数バイトデータから、マスクでデータを抽出し、変換した第２の２組のデータを抽出する。
【００１９】
▲５▼のステップは、抽出した第１の２組のデータと、第２の２組のデータとの一方あるいは両方をシフトして位置合わせして一緒にし（加算）（論理加算（ｏｒ）あるいは算術加算））し、変換した複数バイトデータを生成する。
【００２０】
この際、複数バイトデータを４バイトデータとするようにしている。
また、第４（▲４▼）のステップと第５（▲５▼）のステップを繰り返した後、その結果をシフトして位置合わせして一緒にし、変換した複数バイトデータを生成するようにしている。ここで、複数バイトデータを８バイトデータとし、第４（▲４▼）のステップと第５（▲５▼）のステップを２回繰り返した後、その結果をシフトして位置合わせして一緒にし、変換した８バイトデータを生成するようにしている。
【００２１】
従って、変換対象の複数バイトデータのマスクを生成して入れ替え対象のデータをそれぞれ抽出し、抽出したデータをシフトして入れ替え位置を調整し一緒にしてエンディアン変換を行うことにより、少ないステップで高速にエンディアン変換を実現することが可能となる。
【００２２】
【発明の実施の形態】
次に、図１から図４を用いて本発明の実施の形態および動作を順次詳細に説明する。尚、図１および図２は、４バイト（３２ビット）長のレジスタを有するコンピュータにおける４バイトデータのエンディアン変換の処理プログラムの動作を説明するものである。また、図３および図４は、８バイト（６４ビット）長のレジスタを有するコンピュータにおける８バイトデータのエンディアン変換の処理プログラムの動作を説明するものである。
【００２３】
図１は、本発明のシステム構成図を示す。右側の例は、４バイトデータをエンディアン変換するときの例を示す（８バイトデータについては図３、図４を用いて後述する）。尚、図１および図２は、４バイト（３２ビット）長のレジスタを有するコンピュータにおける４バイトデータのエンディアン変換処理プログラムの動作を説明するものである。また、図３および図４は、８バイト（６４ビット）長のレジスタを有するコンピュータにおける８バイトデータのエンディアン変換の処理プログラムの動作を説明するものである。
【００２４】
図１において、初期は、Ｒ１に４バイトデータ０ｘ４４３３２２１１が代入された状態である。
【００２５】
▲１▼のステップは、マスクを生成する。４バイトデータのときは、図示のように、Ｒ３（レジスタ３）に０ｘ００００００ｆｆを代入する。
【００２６】
▲２▼のステップは、マスクを生成する。４バイトデータのときは、図示のように、Ｒ３＝０ｘ００００００ｆｆと、Ｒ３を１６ビット左シフトしたもの０ｘ００ｆｆ００００を加算してＲ３に代入し、Ｒ３＝０ｘ００ｆｆ００ｆｆとする。これら▲１▼と▲２▼のマスク生成により、複数バイトデータから変換対象の２バイトのデータを抽出するマスクを生成する。
【００２７】
▲３▼のステップは、論理積演算する。４バイトデータのときは、図示のように、Ｒ３＝０ｘ００ｆｆ００ｆｆと、Ｒ１＝０ｘ４４３３２２１１を２４ビット右バレルシフトしたもの０ｘ３３２２１１４４との論理積演算を、Ｒ２に代入し、Ｒ２＝０ｘ００２２００４４とする。
【００２８】
▲４▼のステップは、論理積演算する。４バイトデータのときは、図示のように、Ｒ３＝０ｘ００ｆｆ００ｆｆと、Ｒ１＝０ｘ４４３３２２１１を１６ビット右バレルシフトしたもの０ｘ２２１１４４３３との論理積演算を、Ｒ２に代入し、Ｒ２＝０ｘ００１１００３３とする。
【００２９】
▲５▼のステップは、Ｒ２＝０ｘ００２２００４４と、Ｒ１＝０ｘ００１１００３３を８ビット左シフトしたもの０ｘ１１００３３００とを加算してＲ１に代入し、Ｒ１＝０ｘ１１２２３３４４とする。
【００３０】
以上によって、変換対象の４バイトデータ０ｘ４４３３２２１１をエンディアン変換した４バイトデータ０ｘ１１２２３３４４を、５ステップという高速で生成することが可能となる。
【００３１】
尚、▲５▼のステップの加算として、論理加算（ｏｒ）あるいは算術加算のいずれでもよい。
【００３２】
図２は、本発明の説明図（図１、４バイトの例）を示す。ここで、初期、▲１▼、▲２▼、▲３▼、▲４▼、▲５▼は、図１の初期、▲１▼，▲２▼、▲３▼、▲４▼、▲５▼にそれぞれ対応し、実際に使用する命令の例を示す。Ｒ１、Ｒ２、Ｒ３は、第１レジスタ、第２レジスタ，第３レジスタをそれぞれ表す。
【００３３】
初期：Ｒ１に０ｘ００００００ｆｆを代入した状態を示す。
▲１▼：Ｍｏｖ  ｒ３，＃２５５命令によりＲ３に２５５（＝０ｘ００００００ｆｆ）を代入する。
【００３４】
▲２▼：Ａｄｄ  ｒ２、ｒ３，ｒ３、ｌｓｌ  ＃１６命令によりＲ３の１６ビット左論理シフトした値を加算し、Ｒ３＝０ｘ００ｆｆ００ｆｆとする。
【００３５】
▲３▼：Ａｎｄ  ｒ２，ｒ３，ｒ１，ｒｏｒ  ＃２４命令によりＲ１を２４ビット右バレルシフトした値と、Ｒ３との論理積をＲ２に代入し、Ｒ２＝０ｘ００２２００４４とする。
【００３６】
▲４▼：Ａｎｄ  ｒ２，ｒ３，ｒ１，ｒｏｒ  ＃１６命令によりＲ１を１６ビット右バレルシフトした値と、Ｒ３との論理積をＲ２に代入し、Ｒ２＝０ｘ００１１００３３とする。
【００３７】
▲５▼：Ａｄｄ  ｒ１，ｒ２，ｒ１，ｌｓｌ  ＃８命令によりＲ１を８ビット左論理シフトした値０ｘ１１００３３００と、Ｒ２＝ｏｘ００２２００４４とを加算してＲ１に代入し、Ｒ１＝０ｘ１１２２３３４４とする。
【００３８】
図３および図４は、本発明の他の説明図（８バイトの例）を示す。
図３および図４において、初期は、Ｒ１に８バイトデータ０ｘ８８７７６６５５  ４４３３２２１１が代入された状態である。
【００３９】
▲１▼’のステップは、マスクを生成する。８バイトデータのときは、図示のように、Ｒ４（レジスタ４）に０ｘ００００００００  ００００００ｆｆを代入する。
【００４０】
▲２▼’のステップは、マスクを生成する。８バイトデータのときは、図示のように、Ｒ４＝０ｘ００００００００  ００００００ｆｆと、Ｒ４を３２ビット左シフトしたもの０ｘ００００００ｆｆ  ００００００００を加算してＲ４に代入し、Ｒ４＝０ｘ００００００ｆｆ  ００００００ｆｆとする。これら▲１▼と▲２▼のマスク生成により、８バイトデータから変換対象の２バイトのデータを抽出するマスクを生成する。
【００４１】
▲３▼’のステップは、論理積演算する。８バイトデータのときは、図示のように、Ｒ４＝０ｘ００００００ｆｆ  ００００００ｆｆと、Ｒ１＝０ｘ８８７７６６５５  ４４３３２２１１を５６ビット右バレルシフトしたもの０ｘ７７６６５５４４  ３３２２１１８８との論理積演算を、Ｒ２に代入し、Ｒ２＝０ｘ００００００４４  ００００００８８とする。
【００４２】
▲４▼’のステップは、論理積演算する。８バイトデータのときは、図示のように、Ｒ４＝０ｘ００００００ｆｆ  ００００００ｆｆと、Ｒ１＝０ｘ８８７７６６５５  ４４３３２２１１を４８ビット右バレルシフトしたもの０ｘ６６５５４４３３  ２２１１８８７７との論理積演算を、Ｒ３に代入し、Ｒ３＝０ｘ００００００３３  ００００００７７とする。
【００４３】
▲５▼’のステップは、加算する。８バイトデータのときは、図示のように、Ｒ２＝０ｘ００００００４４  ００００００８８と、Ｒ３＝０ｘ００００００３３  ００００００７７を８ビット左シフトしたものを加算し、Ｒ２に代入し、Ｒ２＝０ｘ００００３３４４  ００００７７８８とする。
【００４４】
▲６▼’のステップは、論理積演算する。８バイトデータのときは、図示のように、Ｒ４＝０ｘ００００００ｆｆ  ００００００ｆｆと、Ｒ１＝０ｘ８８７７６６５５  ４４３３２２１１を４０ビット右バレルシフトしたもの０ｘ５５４４３３２２  １１８８７７６６との論理積演算を、Ｒ３に代入し、Ｒ３＝０ｘ００００００２２  ００００００６６とする。
【００４５】
▲７▼’のステップは、論理積演算する。８バイトデータのときは、図示のように、Ｒ４＝０ｘ００００００ｆｆ  ００００００ｆｆと、Ｒ１＝０ｘ８８７７６６５５  ４４３３２２１１を３２ビット右バレルシフトしたもの０ｘ４４３３２２１１  ８８７７６６５５との論理積演算を、Ｒ４に代入し、Ｒ４＝０ｘ００００００１１  ００００００５５とする。
【００４６】
▲８▼’のステップは、加算する。８バイトデータのときは、図示のように、Ｒ３＝０ｘ００００００２２  ００００００６６と、Ｒ４＝０ｘ００００００１１  ００００００５５を８ビット左シフトしたものを加算し、Ｒ３に代入し、Ｒ３＝０ｘ００００１１２２  ００００５５６６とする。
【００４７】
▲９▼’のステップは、加算する。８バイトデータのときは、図示のように、Ｒ２と、Ｒ３を１６ビット左シフトしたものを加算し、Ｒ０に代入し、Ｒ０＝０ｘ１１２２３３４４  ５５６６７７８８とする。
【００４８】
以上によって、変換対象の８バイトデータ０ｘ８８７７６６５５  ４４３３２２１１をエンディアン変換した８バイトデータ０ｘ１１２２３３４４  ５５６６７７８８を、９ステップという高速で生成することが可能となる。
【００４９】
（付記１）
コンピュータに、
変換対象の複数バイトデータから、相互に変換する２組のデータを取り出すマスクを生成する第１のステップと、
前記変換対象の複数バイトデータを第１のバレルシフトした当該複数バイトデータから、前記マスクでデータを抽出し、変換した第１の２組のデータを生成する第２のステップと、
前記変換対象の複数バイトデータを第２のバレルシフトした当該複数バイトデータから、前記マスクでデータを抽出し、変換した第２の２組のデータを生成する第３のステップと、
前記それぞれ生成した第１の２組のデータと、第２の２組のデータとの一方あるいは両方をシフトして位置合わせして一緒にし、変換した複数バイトデータを生成する第４のステップと
を実行させるエンディアン変換プログラム。
【００５０】
（付記２）
前記複数バイトデータを４バイトデータとしたことを特徴とする付記１記載のエンディアン変換プログラム。
【００５１】
（付記３）
前記第３のステップと前記第４のステップを繰り返した後、その結果をシフトして位置合わせして一緒にし、変換したバイトデータを生成することを特徴とする付記１記載のエンディアン変換プログラム。
【００５２】
（付記４）
前記複数バイトデータを８バイトデータとし、前記第３のステップと前記第４のステップを２回繰り返した後、その結果をシフトして位置合わせして一緒にし、変換した８バイトデータを生成することを特徴とする付記のエンディアン変換プログラム。
【００５３】
【発明の効果】
以上説明したように、本発明によれば、変換対象の複数バイトデータのマスクを生成して入れ替え対象のデータをそれぞれ抽出し、抽出したデータをシフトして入れ替え位置を調整し一緒にしてエンディアン変換を行う構成を採用しているため、少ないステップで高速にエンディアン変換を実現することが可能となる。
【図面の簡単な説明】
【図１】本発明の説明図（４バイトの例）である。
【図２】本発明の説明図（「図１、４バイトの例）である。
【図３】本発明の説明図（８バイトの例、その１）である。
【図４】本発明の説明図（８バイトの例、その２）である。
【図５】従来技術の説明図である。
【図６】命令の説明図（図５）である。
【符号の説明】
▲１▼、▲２▼：マスク作成
▲３▼、▲４▼：論理積
▲５▼：加算
【図１】
2004318251.tif 000003
【図２】
2004318251.tif 000004
【図３】
2004318251.tif 000005
【図４】
2004318251.tif 000006
【図５】
2004318251.tif 000007
【図６】
2004318251.tif 000008