(57)【特許請求の範囲】
【請求項１】
整数除算を有するソースプログラムから変換されたオブジェクトコードを実行するシステムにおいて，
Ｎビットで表される整数ａを整数の定数ｂで除す整数除算ｑ＝int（ａ÷ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算する第１の手順と，当該ｍｂを第１のレジスタに格納し，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，除算値ｑをｒｘ＜ｂの時にｑ＝ｑｘとしｒｘ≧ｂの時にｑ＝ｑｘ＋１とするオブジェクトコードを生成する第２の手順とをコンピュータに実行させるプログラムコードを有するコンパイラと，
前記第１のレジスタと乗算器と加減器とを含み当該コンパイラにより生成されたオブジェクトコードを実行する演算回路を有するマイクロプロセッサとを有することを特徴とするシステム。
【請求項２】
整数除算を有するソースプログラムから変換されたオブジェクトコードを実行するシステムにおいて，
繰り返しループ文内に，Ｎビットで表される整数ａを整数ｂで除す整数除算ｑ＝int（ａ÷ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算して当該ｍｂを第１のレジスタに格納するオブジェクトコードを前記ループ文の外に生成する第１の手順と，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，除算値ｑをｒｘ＜ｂの時にｑ＝ｑｘとしｒｘ≧ｂの時にｑ＝ｑｘ＋１とするオブジェクトコードを前記ループ文の内に生成する第２の手順とをコンピュータに実行させるプログラムコードを有するコンパイラと，
前記第１のレジスタと乗算器と加減器と除算器を含み当該コンパイラにより生成されたオブジェクトコードを実行する演算回路を有するマイクロプロセッサとを有することを特徴とするシステム。
【請求項３】
請求項１または２において，
前記コンパイラの第２の手順におけるｑｘ＝int（ａ×ｍｂ÷ｍ）を演算するプログラムコードは，乗算値ａ×ｍｂが倍精度で上位及び下位のレジスタに格納された時の当該上位のレジスタ値を，ｑｘとすることを特徴とするシステム。
【請求項４】
請求項１または２において，
整数ａ，ｂが符号付整数であって，
前記コンパイラの第２の手順で，前記整数ａ，ｂ両方が負の場合は，ａ，ｂ両方の符号を正に変換するオブジェクトコードを更に生成し，前記整数ａ，ｂの一方が負の場合は，当該負の符号を正に変換し，除算結果に負の符号を付加するオブジェクトコードを更に生成することを特徴とするシステム。
【請求項５】
整数剰余算を有するソースプログラムから変換されたオブジェクトコードを実行するシステムにおいて，
Ｎビットで表される整数ａを整数の定数ｂで除した時の除数を求める整数剰余算ｑ＝int（ａ mod ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算する第１の手順と，当該ｍｂを第１のレジスタに格納し，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，剰余値ｒをｒｘ＜ｂの時にｒ＝ｒｘとしｒｘ≧ｂの時にｒ＝ｒｘ−ｂとするオブジェクトコードを生成する第２の手順とをコンピュータに実行させるプログラムコードを有するコンパイラと，
前記第１のレジスタと乗算器と加減器とを含み当該コンパイラにより生成されたオブジェクトコードを実行する演算回路を有するマイクロプロセッサとを有することを特徴とするシステム。
【請求項６】
整数剰余算を有するソースプログラムから変換されたオブジェクトコードを実行するシステムにおいて，
繰り返しループ文内に，Ｎビットで表される整数ａを整数の定数ｂで除した時の除数を求める整数剰余算ｑ＝int（ａ mod ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算して当該ｍｂを第１のレジスタに格納するオブジェクトコードを前記ループ文の外に生成する第１の手順と，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，剰余値ｒをｒｘ＜ｂの時にｒ＝ｒｘとしｒｘ≧ｂの時にｒ＝ｒｘ−ｂとするオブジェクトコードを前記ループ文の内に生成する第２の手順とをコンピュータに実行させるプログラムコードを有するコンパイラと，
前記第１のレジスタと乗算器と加減器と除算器を含み当該コンパイラにより生成されたオブジェクトコードを実行する演算回路を有するマイクロプロセッサとを有することを特徴とするシステム。
【請求項７】
請求項５または６において，
前記コンパイラの第２の手順におけるｑｘ＝int（ａ×ｍｂ÷ｍ）を演算するプログラムコードは，乗算値ａ×ｍｂが倍精度で上位及び下位のレジスタに格納された時の当該上位のレジスタ値を，ｑｘとすることを特徴とするシステム。
【請求項８】
請求項５または６において，
整数ａ，ｂが符号付整数であって，
前記コンパイラの第２の手順で，前記整数ａ，ｂ両方が負の場合は，ａ，ｂ両方の符号を正に変換するオブジェクトコードを更に生成し，前記整数ａ，ｂの一方が負の場合は，当該負の符号を正に変換し，剰余算結果に負の符号を付加するオブジェクトコードを更に生成することを特徴とするシステム。
【請求項９】
請求項１乃至６のいずれかにおいて，
前記マイクロプロセッサが評価用マイクロプロセッサであることを特徴とするマイクロプロセッサの評価システム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は，整数除算または整数剰余算を含むアプリケーションプログラム向けのマイクロプロセッサの開発システムに関し，特に，マイクロプロセッサの整数除算または整数剰余算に要する演算サイクル数を大幅に削減することができるコンパイラを有する開発システムに関する。
【０００２】
【従来の技術】
マイクロプロセッサにとって，四則演算のうち除算や除算を伴う剰余算は，多くの演算サイクルを必要とする。例えば，３２ビットの無符号演算の場合，一般的なプロセッサでは，足し算や引き算は１サイクル，乗算が２サイクルで実行可能であるのに対して，除算は１８〜３４サイクル程度を必要とする。
【０００３】
除算が遅い理由は，除算器向けのアルゴリズムに短い演算サイクルで実現できるものがなく，筆算と同様の引き戻し法が採用されることが多いからである。筆算の引き戻し法では，被除数のビット数分の演算サイクルを必要とする。
【０００４】
図１は，引き戻し法による除算の例を示す図である。６ビットの被除数「００１１１０」を２ビットの除数「１１」で割り算を行う場合，被除数から除数「１１」を引いてみて，引くことができれば「１」，引くことができなければ「０」として，この演算サイクルを被除算の桁数回繰り返すことで，除算を完了する。即ち，図１中のサイクルＳ１〜Ｓ６の合計６サイクルにより，６ビットの被除算の演算を終了することができる。この方法では，被除数が３２ビットの場合は，単純に３２サイクルを必要とすることになる。
【０００５】
別の除算例では，１サイクルに処理できるビット数を１ビットではなく，２ビット，３ビットに増やす方法がある。この場合は，被除数に対して一度に２ビット処理するためには，除数「１１」×１，除数「１１」×２，除数「１１」×３を被除数から引くことができるか否かを判断して，それぞれ答えを，「０１」「１０」「１１」とすることになる。従って，除算器のハードウエア構成がより複雑化し，それに伴い消費電力の増大を招く。
【０００６】
別の除算例として，被除数の上位ビットの「０」の有無をチェックし，最初に「１」が検出されたところから，前述の引き戻し法による除算を行う方法もある。このようなリードゼロ法は，上位ビットの「０」をチェックするハードウエアが必要となると共に，実行サイクルが被除数によって異なることになり，除算演算のスケジュール管理が困難になるという問題を招いている。
【０００７】
アプリケーションプログラムにおいて，除算演算を除数の逆数と被除数の乗算に置き換えてプログラムコードを作成することで，無駄な除算をなくすことが知られている。従って，アプリケーションプログラムを解析してアセンブリコード（オブジェクトコードに対応するコード）に変換するコンパイラが，この手法に従ってアプリケーションプログラム内の除算演算を除数の逆数と被除数の乗算に置き換えることが考えられる。
【０００８】
しかし，コンパイラは，アプリケーションプログラムを記述したプログラマが除算演算の有効桁をどのようにしようとしているかを知ることができないので，このような置き換えは，あまり好ましいとはいえない。
【０００９】
上記に加えて，マイクロプロセッサの高周波数化に伴い，除算器の構成を複雑にすることは余り好ましくない。高周波数化に伴い，１サイクルの周期が短くなり，複雑な構成の除算器ではサイクル内にその演算を終了することは困難になるからである。
【００１０】
【発明が解決しようとする課題】
そこで，本発明の目的は，マイクロプロセッサの整数除算または整数剰余算に要する演算サイクル数を大幅に減らすことができるコンパイラを有するシステムを提供することにある。
【００１１】
本発明の別の目的は，マイクロプロセッサの整数除算または整数剰余算に要する演算サイクル数を大幅に減らすことができるコンパイラを提供することにある。
【００１２】
本発明の別の目的は，マイクロプロセッサの整数除算または整数剰余算に要する演算サイクル数を大幅に減らしたアセンブリコードを有するマイクロプロセッサを提供することにある。
【００１３】
更に，本発明の別の目的は，マイクロプロセッサの整数除算または整数剰余算に要する演算サイクル数を大幅に減らしたアセンブリコードを有するマイクロプロセッサシステムを提供することにある。
【００１４】
【課題を解決するための手段】
上記の目的を達成するために，本発明の第１の側面は，
Ｎビットで表される整数ａを整数の定数ｂで除す整数除算ｑ＝int（ａ÷ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算する第１の手順と，当該ｍｂを第１のレジスタに格納し，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，除算値ｑをｒｘ＜ｂの時にｑ＝ｑｘとしｒｘ≧ｂの時にｑ＝ｑｘ＋１とするオブジェクトコードを生成する第２の手順とを有するコンパイラと，
前記第１のレジスタと乗算器と加減器とを含み当該コンパイラにより生成されたオブジェクトコードを実行する演算回路を有するマイクロプロセッサとを有するシステムである。
【００１５】
上記発明によれば，ソースコードを，プロセッサが実行可能なアセンブリコードなどのオブジェクトコードに変換するコンパイラが，整数除算ｑ＝int（ａ÷ｂ）に対して，
ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算し，
その定数ｍｂを所定のレジスタに格納するオブジェクトコードを埋め込んで，更に，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，除算値ｑをｒｘ＜ｂの時にｑ＝ｑｘとしｒｘ≧ｂの時にｑ＝ｑｘ＋１とするオブジェクトコードを生成する。
【００１６】
従って，コンパイラにより変換された整数除算ｑ＝int（ａ÷ｂ）に対するオブジェクトコードには，レジスタへの格納と，乗算と，引き算と，Ｎビットシフト算（÷ｍ）と，比較及び分岐とが含まれるのみである。かかるオブジェクトコードをプロセッサが実行すれば，通常の除算ステップがないので，大幅に演算サイクルを減らして整数除算ｑ＝int（ａ÷ｂ）を処理することができる。
【００１７】
上記の目的を達成するために，本発明の第２の側面は，
Ｎビットで表される整数ａを整数の定数ｂで除した時の除数を求める整数剰余算ｑ＝int（ａ mod ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算する第１の手順と，当該ｍｂを第１のレジスタに格納し，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，剰余値ｒをｒｘ＜ｂの時にｒ＝ｒｘとしｒｘ≧ｂの時にｒ＝ｒｘ−ｂとするオブジェクトコードを生成する第２の手順とを有するコンパイラと，
前記第１のレジスタと乗算器と加減器とを含み当該コンパイラにより生成されたオブジェクトコードを実行する演算回路を有するマイクロプロセッサとを有するシステムである。
【００１８】
上記発明によれば，ソースコードを，プロセッサが実行可能なアセンブリコードなどのオブジェクトコードに変換するコンパイラが，整数剰余算ｑ＝int（ａ mod ｂ）に対して，
ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算し，
その定数ｍｂを所定のレジスタに格納するオブジェクトコードを埋め込んで，更に，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，剰余値ｒをｒｘ＜ｂの時にｒ＝ｒｘとしｒｘ≧ｂの時にｒ＝ｒｘ−ｂとするオブジェクトコードを生成する。
【００１９】
従って，コンパイラにより変換された整数剰余算ｑ＝int（ａ mod ｂ）に対するオブジェクトコードには，レジスタへの格納と，乗算と，引き算と，Ｎビットシフト算（÷ｍ）と，比較及び分岐とが含まれるのみである。かかるオブジェクトコードをプロセッサが実行すれば，通常の除算ステップがないので，大幅に演算サイクルを減らして整数剰余算ｑ＝int（ａ mod ｂ）を処理することができる。
【００２０】
上記の第１及び第２の側面において，より好ましい実施例では，乗算値ａ×ｍｂが倍精度（ａ，ｍｂがＮビットの場合，乗算値が２Ｎビット）で上位及び下位のレジスタに格納された時の当該上位のレジスタ値を，ｑｘ＝int（ａ×ｍｂ÷ｍ）とすることで，前記Ｎビットシフト算（÷ｍ）の演算サイクルをなくすことができる。
【００２１】
上記の第１及び第２の側面において，より好ましい実施例では，コンパイラは，整数ａ，ｂが符号付整数であっても，同様に除算器を用いないオブジェクトコードに変換することができる。つまり，ａ，ｂ両方が負の場合は，ａ，ｂ両方の符号を正に変換して上記のオブジェクトコードを生成すれば良く，ａ，ｂの一方が負の場合は，負の符号を正に変換して上記演算を行いその後演算結果に負の符号を付加するオブジェクトコードにすれば良いからである。但し，整数ａの符号ビットを判定するオブジェクトコードが必要になる。尚，整数ｂは定数であれば，コンパイラはその符号を確認することができ，除数ｂの符号に応じてオブジェクトコードを生成することができる。
【００２２】
上記第１及び第２の側面の発明は，マイクロプロセッサの開発システムとして利用できる。マイクロプロセッサの開発段階では，評価用マイクロプロセッサと，それに命令コードであるオブジェクトコードを供給する命令コードメモリと，ソースプログラムをオブジェクトコードに変換するコンパイラとを有する開発システムにおいて，開発中のソースプログラムをオブジェクトコードに変換して評価用マイクロプロセッサに実行させ，所望の機能が達成されるか否かの評価を行う。このコンパイラにより変換されたオブジェクトコードであれば，整数除算または整数剰余算を，短い演算サイクルで実行することができる。
【００２３】
上記第１及び第２の側面の発明は，通常のマイクロプロセッサを有するシステムとしても利用できる。このシステムによれば，コンパイラがソースプログラム内の整数除算または整数剰余算を，短い演算サイクルで実行可能なオブジェクトコードに変換することができ，マイクロプロセッサによる実行時間を大幅に削減することができる。
【００２４】
【発明の実施の形態】
以下，図面を参照して本発明の実施の形態例を説明する。しかしながら，本発明の保護範囲は，以下の実施の形態例に限定されるものではなく，特許請求の範囲に記載された発明とその均等物にまで及ぶものである。
【００２５】
図２は，本実施の形態例におけるマイクロプロセッサを有するシステムの全体構成図である。マイクロプロセッサの開発段階では，評価用マイクロプロセッサ１０に外部のメモリ６に格納したアセンブリコードなどのオブジェクトコードを実行させて，所望の機能を達成することができるかの評価を行う。この評価用マイクロプロセッサは，量産用マイクロプロセッサと同等の機能回路と評価に必要な評価用回路とを有し，開発中のソースプログラム２をコンパイラ４で変換したオブジェクトコードを実行する。
【００２６】
図２において，評価用マイクロプロセッサ１０は，内部バス２０を介して接続される演算部１１と，汎用レジスタ２２と，データが一時的に格納されるロード・ストア回路３０とを有し，更に，プログラムカウンタ２６と，ロードした命令コードを解読して命令に対応する制御信号Ｓ２８を生成する命令解読器２８とを有する。
【００２７】
図２に示された評価用マイクロプロセッサ１０は，実質的に量産用マイクロプロセッサをも示している。或いは，量産用マイクロプロセッサには，図２に示された評価用マイクロプロセッサ１０に，オブジェクトコード（命令コード）を格納するメモリ６が内蔵される場合がある。いずれの場合も，評価用マイクロプロセッサ１０の演算部１１は，量産用マイクロプロセッサの演算部と同じ構成である。そして，その演算部１１は，例えば乗算器１４と，加減器１６と，シフター１８と，除算器１２とを有する。
【００２８】
本実施の形態例におけるマイクロプロセッサ１０の特徴的な点は，後述する整数定数ｍｂを格納するｍｂレジスタ２４が設けられていることにある。かかるｍｂレジスタ２４は，整数除算や整数剰余算を行う時に，オブジェクトコードの実行に伴って，コンパイラによりあらかじめ求められたｍｂ値がロードされるレジスタである。従って，ｍｂレジスタ２４は，ハードウエア上の所定のアドレスに固定的に設けられていても良く，或いは，汎用レジスタ２２内の特定のレジスタをｍｂレジスタに割り当てても良い。更に，ｍｂレジスタをメモリ３０内に割り当てても良い。そして，ｍｂレジスタの数は複数に及ぶ場合もある。後述するとおり，本実施の形態では，この整数定数ｍｂをコンパイラ４があらかじめ求めて，ｍｂレジスタ２４に格納することで，整数除算及び整数剰余算を，一般的な除算命令を実行して除算器が長い実行サイクルをかけて除算を行う場合よりも，短い実行サイクルで行うことができる。
【００２９】
本実施の形態のシステムは，評価用マイクロプロセッサ１０に加えて，開発中のソースプログラムファイル２と，そのソースプログラムを解釈してマイクロプロセッサが実行可能なアセンブリコードに変換するコンパイラ（一種のプログラム）４と，コンパイラ４により変換されたアセンブリコード（オブジェクトコード）を記憶する命令コードメモリ６とを有する。命令コードメモリ６は，マイクロプロセッサ１０内の命令解読器２８からアセンブリコードを読み出されるように，命令解読器２８に接続されている。ここでアセンブリコードとは，本明細書ではマイクロプロセッサが実行可能なプログラムコードであり，オブジェクトコードと実質的に同じものをさす。従って，本明細書内では，コンパイラ４により変換されて命令コードメモリ６に格納されたアセンブリコードは，しばしばオブジェクトコードとも称する。
【００３０】
マイクロプロセッサの開発段階では，Ｃ言語などの高級言語によるソースプログラム２にて，マイクロプロセッサが実行するプログラムを開発する。開発中のソースプログラム２は，コンパイラ４にてアセンブリコードに変換されて，命令コードメモリ６に格納される。そして，評価用マイクロプロセッサ１０が，その命令コードメモリ６に格納されたアセンブリコードを実行し，所望の機能が達成されるか否かの評価が行われる。
【００３１】
そして，ソースプログラムの開発が完了すると，コンパイラ４が変換したアセンブリコード（即ちオブジェクトコード）が量産用マイクロプロセッサの内蔵ＲＯＭ若しくは外付けＲＯＭに焼き付けられ，ＲＯＭ内蔵の量産用マイクロプロセッサ若しくは外付けＲＯＭを有するマイクロプロセッサシステムが生産される。
【００３２】
また，本実施の形態のシステムは，マイクロプロセッサ開発用システムとしてではなく，通常のマイクロプロセッサを有するシステムとしても利用できる。その場合，アプリケーションであるソースプログラム２に対して，コンパイラ４がアセンブリコードに変換し，それがマイクロプロセッサ１０により実行される。
【００３３】
［整数除算］
さて，本実施の形態では，コンパイラ４が，Ｎビットで表される無符号の整数ａを無符号の整数ｂで除す無符号整数除算ｑ＝int（ａ÷ｂ）（int（）は，括弧内の小数点以下を切り捨てる関数である）を，除算器による除算命令を含まないアセンブリコードに変換する。従って，ソースプログラム内の無符号整数除算命令が除算命令を伴わない一連のコードからなるアセンブリコードに変換されるので，そのアセンブリコードをマイクロプロセッサ１０が実行すると，無符号整数除算命令が，少ない演算サイクル数で実行可能になる。
【００３４】
具体的な原理は次の通りである。Ｎビットで表される無符号の整数ａを無符号の整数ｂで除す無符号整数除算ｑ＝int（ａ÷ｂ）を計算する時，整数ｂが定数であるならば，ｍ＝２Nを用いてｍｂ値を
ｍｂ＝int（ｍ÷ｂ）
として，
ｑｘ＝int（ａ×ｍｂ÷ｍ）
を導入すると，
求める除算値ｑは，
ｑ＝ｑｘ    （ａ／ｂ−ｑｘ＜１，即ちａ−ｑｘ×ｂ＜ｂの時）  （１）
ｑ＝ｑｘ＋１（ａ／ｂ−ｑｘ≧１，即ちａ−ｑｘ×ｂ≧ｂの時）  （２）
となる。つまり，除算値ｑは，ｑｘと等しいか，ｑｘに＋１の補正を加えたｑｘ＋１に等しいかのいずれかである。
【００３５】
除算値ｑがｑｘに等しい場合と，ｑｘ＋１に等しい場合とが発生する理由のは，次の通りである。除算値ｑは，関数intにより実数ａ／ｂの小数点以下が切り捨てられている。従って，次の関係が成り立つ。
【００３６】
０≦ａ／ｂ−ｑ＜１                        （３）
更に，ｑｘ値は，ｍｂ＝int（ｍ÷ｂ）に１未満の誤差が発生し，
ｑｘ＝int（（ａ／ｍ）×ｍｂ）
によりその１未満の誤差はｑｘに対してａ／ｍ倍の誤差になる。更に，ｑｘの関数intにより１未満の誤差を有するので，結局，次の関係が成り立つ。
【００３７】
０≦ａ／ｂ−ｑｘ＜１＋ａ／ｍ＜２          （４）
そこで，除算値ｑと値ｑｘとの間の誤差，ｑ−ｑｘは，
ｑ−ｑｘ＝（ａ／ｂ−ｑｘ）−（ａ／ｂ−ｑ）
であり，この式に上記（３）（４）を代入して，
−１＜ｑ−ｑｘ＜１＋ａ／ｍ＜２  （但しａ／ｍ＜１）
となる。即ち，ｑ，ｑｘは共に整数であるから，ｑ−ｑｘは０または１になり，従って，除算値ｑは，値ｑｘと等しいか，ｑｘ＋１に等しいかの２通りが存在することになる。
【００３８】
結論として，
ａ／ｂ−ｑｘ＜１，即ちａ−ｑｘ×ｂ＜ｂの時は，ｑ＝ｑｘ    （１）
ａ／ｂ−ｑｘ≧１，即ちａ−ｑｘ×ｂ≧ｂの時は，ｑ＝ｑｘ＋１（２）
となる。
【００３９】
そこで，コンパイラ４が，ソースプログラム２の中に整数除算ｑ＝int（ａ÷ｂ）を検出したら，コンパイラ４がｍｂ＝int（ｍ÷ｂ）を演算し，求めたｍｂ値をｍｂレジスタにセットするアセンブラコードを生成し，更に，コンパイラ４が，ｑｘ＝int（ａ×ｍｂ÷ｍ）を求めるアセンブラコードと，（ｒｘ＝ａ−ｑｘ×ｂ）を求めるアセンブラコードと，（ｒｘ＝ａ−ｑｘ×ｂ）とｂとを比較して，上記（１）（２）に従って除算結果ｑを求めるアセンブラコードとを生成する。
【００４０】
このようにして生成されたアセンブラコードには，（÷ｍ）を除いて除算命令が含まれておらず，乗算，加算，減算のみで実行可能である。そして，（÷ｍ）は１／２Nであるので，除算命令でなくシフト命令で実行可能である。更に付け加えれば，このシフト命令も，乗算命令（ａ×ｍｂ）を実行した結果が格納されるの上位ビットレジスタの値を採用することにより，省略することができる。
【００４１】
図３は，本実施の形態における整数除算のコンパイル例を示す図である。上記の原理に従って，コンパイラ４は，ソースプログラム２内に整数除算ｑ＝int（ａ÷ｂ）が検出されると，ｍｂ値を演算すると共に，図示されたアセンブリコードASMを生成する。
【００４２】
ここに示されたアセンブリコードASMは，順番に説明すると，ｍｂ値（#mb)をｍｂレジスタに格納するコード（set），乗算コード（mul），減算コード（sub），比較コード（cmp），より大きいか否かの判断コード（bgt），加算コード（addi），そしてラベル（end）を有する。アセンブリコード内のｒ１〜ｒ７は汎用レジスタを示し，ｍｂはｍｂレジスタを示し，；以下はコメントである。このアセンブリコードの説明は，後述する。
【００４３】
図４は，本実施の形態におけるコンパイラのフローチャート図である。コンパイラ４は，ソースコードの構文を解釈して，マイクロプロセッサが実行可能なアセンブリコードに変換する。図４に従って説明すると，ソースコードが終了するまで（S100），ソースコードの構文解析を行う（S102）。そして，整数除算が検出されるまでは（S104），構文解析したソースコードをアセンブリコードに変換を繰り返す（S106）。
【００４４】
コンパイラは，ソースコード内に整数除算であるｑ＝int（ａ÷ｂ）（ｂは定数）を検出すると，ｍｂ＝int（ｍ／ｂ）（ｍ＝２N）の演算を実行し（S108），更に，上記演算で求めたｍｂ値をｍｂレジスタに格納するセットコード（set）を生成して，初期化ブロックに記述する（S114）。このセットコードは，図３中のコードｃ１に対応する。更に，コンパイラは，整数除算のｑ＝int（ａ÷ｂ）に対する７行のアセンブリコード（図３中のコードｃ３〜ｃ９）を生成し，実行本体に記述する（S112）。
【００４５】
図５は，図３に示されたアセンブリコードASMのフローチャート図である。図３のアセンブリコードに沿ってそれぞれのコードの機能について説明する。コードｃ１は，コンパイラがコンパイル時に求めたｍｂ値＃ｍｂをｍｂレジスタに格納する命令コードである。このコードｃ１は，ソースプログラム内に複数の整数除算が存在する場合は，それぞれに対応したｍｂレジスタの設定を行うか，それぞれの整数除算のアセンブリコードの手前に埋め込まれる必要がある。
【００４６】
次に，アセンブリコードASMは，整数除算に対応する７行のコードｃ３〜ｃ９を有する。整数除算の実行時の前提として，整数ａは汎用レジスタｒ１に，整数ｂは汎用レジスタｒ２にそれぞれ格納されているものとする。コードｃ３は，レジスタｒ１の被除数ａとレジスタｍｂの定数＃ｍｂとを乗算して，その結果を汎用レジスタｒ４に格納させる命令コードである。レジスタｒ１の被除数ａが３２ビット，レジスタｍｂの定数＃ｍｂが３２ビットであると，それらの乗算値は，６４ビットが必要になる。従って，この命令コードｃ３を実行した結果，重算値（ａ×ｍｂ）は，汎用レジスタｒ４とｒ５の２つのレジスタに上位ビットと下位ビットに分かれて格納される。つまり，上位レジスタｒ４と下位レジスタｒ５に６４ビットの乗算値（ａ×ｍｂ）が格納される。
【００４７】
次のコードｃ４は，汎用レジスタｒ４のｑｘと同レジスタｒ２のｂとの乗算値（ｑｘ×ｂ）を汎用レジスタｒ６に格納する命令コードである。この場合，コードｃ３で求めたｑｘは，その上位ビットが汎用レジスタｒ４に下位ビットが同レジスタｒ５にそれぞれ格納されているが，汎用レジスタｒ４の上位ビットをｑｘとして利用することにより，（÷２32）の３２ビットシフト算を省略することができる。
【００４８】
そして，次のコードｃ５は，汎用レジスタｒ１のａから同レジスタｒ７の（ｑｘ×ｂ）を減算した値ｒｘを，汎用レジスタｒ３に格納する減算命令コードである。次のコードｃ６は，レジスタｒ２のｂとレジスタｒ３のｒｘ＝ａ−ｑｘ×ｂとの比較を行い，同時にｒｘ−（ａ−ｑｘ×ｂ）をインテジャー・コンディション・コードICCに設定する命令コードであり，コードｃ７でｂのほうがｒｘと比較して大きいか否か（bigger than: bgt)を判断するコードであり，判断がｙｅｓであれば，ラベルendに飛び，判断がｎｏであれば，次のコードｃ８を実行することになる。コードｃ８は，汎用レジスタｒ４のｑｘに整数「１」を加算して，同レジスタｒ４に格納する加算命令コードである。
【００４９】
以上のアセンブリコードを実行した結果，汎用レジスタｒ４には，整数除算値ｑ（＝ｑｘまたはｑｘ＋１）が格納されることになる。このように，アセンブリコードASM内には，除算演算コード（div）が存在しないことが理解される。通常，乗算命令mulは２サイクル，減算命令sub，比較命令cmp，分岐命令bgt，加算命令addiはそれぞれ１サイクルであるので，図３のアセンブリコードｃ３〜ｃ９までのマイクロプロセッサの演算サイクルは，合計で８サイクルになる。レジスタｒ４，ｒ５のように上位ビットと下位ビットに分かれていない場合に，３２ビットシフト命令を追加したとしても，合計で９サイクルになる。
【００５０】
従って，３２ビットの整数除算を１ビット単位の引き戻し演算で３２サイクルを必要とする従来の除算命令よりも，大幅に演算サイクル数を少なくすることができる。
【００５１】
図６は，本実施の形態におけるコンパイラの別のフローチャート図である。図４に示したコンパイラは，ソースコード内に整数除算を検出したらｍｂ値を演算して，それをレジスタｍｂに格納するセット命令をＣ言語の実行本体内に記述した。図７は，Ｃ言語の実行本体と初期化ブロックとで構成され，初期化ブロックにてグローバル変数の定義などを行い，実行本体で命令コードを実行する。
【００５２】
図６のコンパイラでは，ソースコード内に同じ整数ｂで除算する整数除算のみが存在する場合に有効であり，ステップS114にて，生成したsetコードを初期化ブロック内に記述することのみが，図４のステップS110と異なるだけである。それ以外は図４と同じである。
【００５３】
従って，図６のコンパイラにより変換されたアセンブリコードでは，命令コードｃ１が，初期化ブロック内で実行されるので，それ以降の実行本体にて除算演算毎に命令コードｃ１を実行する必要がない。その分，マイクロプロセッサの実行サイクル数を減らすことが可能になる。
【００５４】
［整数剰余算］
本実施の形態では，コンパイラ４が，Ｎビットで表される無符号の整数ａを無符号の整数定数ｂで除した時の余りを求める無符号整数剰余算ｒ＝int（ａ mod ｂ）（int（）は，括弧内の小数点以下を切り捨てる関数である）を，除算器による除算命令を含まないアセンブリコードに変換する。従って，ソースプログラム内の無符号整数剰余算命令が除算命令を伴わない一連のコードからなるアセンブリコードに変換されるので，そのアセンブリコードをマイクロプロセッサ１０が実行すると，無符号整数剰余算命令が，少ない演算サイクル数で実行可能になる。
【００５５】
具体的な原理は次の通りである。Ｎビットで表される無符号の整数ａを無符号の整数ｂで除した時の余りを求める無符号整数剰余算ｒ＝int（ａ mod ｂ）を計算する時，整数ｂが定数であるならば，ｍ＝２Nを用いてｍｂ値を
ｍｂ＝int（ｍ÷ｂ）
として，
ｑ＝int（ａ÷ｂ）
ｑｘ＝int（ａ×ｍｂ÷ｍ）
を導入すると，
求める剰余値ｒは，
ｒ＝ａ−ｑ×ｂ                  （５）
となる。そして，除数ｑはｑｘとの間に，式（１）（２）で示した関係を有するので，剰余値ｒは，式（５）に式（１）（２）を代入して，
ｒ＝ａ−ｑｘ×ｂ            （ａ−ｑｘ×ｂ＜ｂの時）  （６）
ｒ＝ａ−（ｑｘ＋１）×ｂ
＝ａ−ｑｘ×ｂ−ｂ        （ａ−ｑｘ×ｂ≧ｂの時）  （７）
となる。従って，ｒｘ＝ａ−ｑｘ×ｂとすれば，
ｒ＝ｒｘ        （ｒｘ＜ｂの時）                      （８）
ｒ＝ｒｘ−ｂ    （ｒｘ≧ｂの時）                      （９）
となる。
【００５６】
そこで，コンパイラ４が，ソースコード内に整数剰余算ｒ＝int（ａ mod ｂ）を検出したら，コンパイラがｍｂ＝int（ｍ÷ｂ）を演算し（但しｍ＝２N），その定数ｍｂを所定のレジスタに格納するオブジェクトコードを埋め込んで，更に，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，剰余値ｒをｒｘ＜ｂの時にｒ＝ｒｘとしｒｘ≧ｂの時にｒ＝ｒｘ−ｂとするオブジェクトコードを生成する。
【００５７】
上記のオブジェクトコード内には，（÷ｍ）以外は，乗算と除算しかないので，マイクロプロセッサは，乗算命令なしに整数剰余算を行うことができる。
【００５８】
剰余算を変換するコンパイラのフローチャートは，図４または図６と同じであり，ステップS112において，剰余算ｒ＝int（ａ mod ｂ）に対するアセンブリコードが生成する点で異なるのみである。
【００５９】
図８は，本実施の形態のコンパイラにより変換された剰余算のアセンブリコードのフローチャート図である。更に，図９は，本実施の形態のコンパイラにより変換された剰余算のアセンブリコードの例を示す図である。図８と図９のコード番号ｃ１〜ｃ８０とは，お互いに対応する。
【００６０】
図８に従って説明すると，コンパイラが演算したｍｂ値をレジスタｍｂに格納し（ｃ１），更に，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し（ｃ３），ｒｘ＝ａ−ｑｘ×ｂを演算し（ｃ４，ｃ５），ｒｘ＜ｂか否かを判断し（ｃ６），yesなら分岐してｒ＝ｒｘとし（ｃ７），noならｒ＝ｒｘ−ｂを演算する（ｃ８０）。図５と比較すると，図８のステップｃ１，ｃ３，ｃ４，ｃ５，ｃ６までが図５と同じであり，ステップｃ８０のみが図５と異なる。
【００６１】
それに応じて，図９のアセンブリコードASMの例は，コードｃ１〜ｃ７までが，図３の整数除算のアセンブリコードASMと同じであり，最後の減算命令コードｃ８０のみが異なる。つまり，減算命令コードｃ８０では，汎用レジスタｒ３内のｒｘから同レジスタｒ２内のｂを引いて，同レジスタｒ３に格納する命令コードになる。但し，剰余算結果は汎用レジスタｒ３に格納されることになる。図９のアセンブリコードASMにも，除算命令は含まれてなく，コードｃ２〜ｃ８０までに合計で８サイクルでマイクロプロセッサの実行が完了する。
【００６２】
図１０は，整数除算及び整数剰余算でｑ＝ｑｘ＋１になる例を示す図である。図１０に示した例は，ａ＝555101，ｂ＝7930の場合であり，この場合は，
ｑ＝int（555101÷7930）＝70
ｑｘ＝int（555101÷232×int（223÷7930））＝69
となり，ｑ＝ｑｘ＋１となる。図中に示したとおり，intを示す［］内での誤差により，ｑｘの切り捨てられる誤差が１を越えてしまい，その結果ｑ＝ｑｘ＋１となっています。
【００６３】
上記の実施の形態では，無符号整数ａ，ｂの整数除算や整数剰余算について説明したが，符号付整数ａ，ｂの符号付整数除算や符号付整数剰余算でも，ａ＜０，ｂ＜０の時にそれらを正に置き換えてから，上述した無符号整数除算，無符号整数剰余算を行い，最後に除算値または剰余値の符号を元に戻すようなアセンブリコードを生成すれば良い。
【００６４】
即ち，Ｎビットで表現できる符号付整数ａ，ｂに対する符号付整数除算ｑ＝int（ａ÷ｂ）の場合は，
ｑ＝  int（−ａ÷−ｂ）      （ａ＜０，ｂ＜０）        （１０）
ｑ＝−int（  ａ÷−ｂ）      （ａ≧０，ｂ＜０）        （１１）
ｑ＝−int（−ａ÷  ｂ）      （ａ＜０，ｂ≧０）        （１２）
ｑ＝  int（  ａ÷  ｂ）      （ａ≧０，ｂ≧０）        （１３）
として，図３のアセンブリコードに変換すれば良い。
【００６５】
図１１は，上記（１０）（１１）のｂ＜０の場合に，本実施の形態のコンパイラが変換した符号付整数除算に対するアセンブリコードの例を示す。コンパイラは，符号付整数除算をソースコードの中から検出すると，除数ｂが正か負かを符号ビットから検出することができる。従って，ｂ＜０はあらかじめ判明しているので，ａ≧０か否かを判断し（コードｃ２０，ｃ２１），ａ≧０が偽であれば（コードｃ２１の分岐がno），図中４０に示されたコードｃ３〜ｃ８を実行し，ラベルendに分岐し（コードｃ２３），ａ≧０が真であれば（コードｃ２１の分岐がyes），ラベルＬ１以下の図中４２に示されたコードｃ３〜ｃ８を実行し，その後除算結果の汎用レジスタｒ４にマイナス符号を付加し（コードｃ２４），符号付除算を終了する。
【００６６】
即ち，図中４２に記載された命令コードｃ３〜ｃ８は，図３のコードｃ３〜ｃ８と同じである。一方，ａ＜０の場合の図中４０に記載された命令コードｃ３〜ｃ８は，コードｃ２０で汎用レジスタｒ８に格納された−ａを利用して同じ命令が行われるコードである。図中下線で示したとおり，図中４２の命令コードとは，汎用レジスタｒ１の代わりにｒ８になっていることのみが異なる。
【００６７】
従って，図１１のアセンブリコードでは，図３の無符号整数除算と比較すると，最初の命令コードｃ２０，ｃ２１と，分岐命令ｃ２３が追加されるか，若しくは最初の命令コードｃ２０，ｃ２１と，最後のマイナス符号を付加する命令コードｃ２４が追加されるかのいずれかである。従って，符号付整数除算は，無符号整数除算の場合に比較すると，３サイクルだけ追加されることになる。即ち，図１１のアセンブリコードでは，８＋３＝１１サイクルになる。
【００６８】
尚，図１１のアセンブリコードでは，アセンブラが求めたｍｂ値が，コードｃ２の初期化ブロック内に記述されている。
【００６９】
除数ｂがｂ≧０の場合も，図１１と同じアセンブリコードが生成される。但し，汎用レジスタｒ２には−ｂではなく，ｂが格納されている。それ以外は，同じである。
【００７０】
符号付整数剰余算においても，上記と同様の考え方でアセンブリコードを生成することができる。即ち，Ｎビットで表現できる符号付整数ａ，ｂに対する符号付整数剰余算ｒ＝int（ａ mod ｂ）の場合は，
ｒ＝  int（−ａ mod −ｂ）      （ａ＜０，ｂ＜０）      （１４）
ｒ＝−int（  ａ mod −ｂ）      （ａ≧０，ｂ＜０）      （１５）
ｒ＝−int（−ａ mod ｂ）        （ａ＜０，ｂ≧０）      （１６）
ｒ＝  int（  ａ mod ｂ）        （ａ≧０，ｂ≧０）      （１７）
として，図９のアセンブリコードに変換すれば良い。
【００７１】
当業者であれば，図１１の命令コードｃ２０，ｃ２１，ｃ２３，ｃ２４を付加して，上記（１４）（１５）の符号付整数剰余算のアセンブリコードを展開することは容易である。従って，詳細なアセンブリコードは省略する。
【００７２】
図１２は，ループ内の整数除算のコンパイル例を示す図である。Ｃ言語におけるfor文など，ソースプログラムにおいて同じ除算演算が繰り返し行われる場合がある。例えば，図１２のソースコード５０がその一例である。このソースコード５０では，for文により，引数ｉが０から10000までｑ[i]＝ａ[i]／ｂの整数除算が繰り返される。その繰り返し除算では，除数ｂはループ内では一定であるが，ソースプログラム内では定数ではなく変数である。従って，除数ｂは，ソースコード５０のfor文を実行するまでに図示しないプログラムにより変動する値である。その為，コンパイラがソースコードをコンパイルするときは，その除数ｂは判明しておらず，コンパイラがコンパイル時にｍｂ＝ｍ／ｂを演算することはできない。
【００７３】
このような場合，本実施の形態のコンパイラは，図１２のソースコード５２のように，for文の手前で一旦ｍｂ＝int（２32／ｂ）を演算するコードを挿入されるように，アセンブリコード５４を作成する。ソースコード５２のfor文内のｑ[i]＝fast divide(a[i], b, mb)は，図３で示した除算命令を含まない整数除算を意味する。
【００７４】
上記のコンパイラにより生成されるアセンブリコード５４は，ｍｂ＝int（２32／ｂ）を演算する除算コードc30をfor文の初期ブロック内に埋め込み，for文内の整数除算ｑ[i]＝ａ[i]／ｂに対しては，図中５６に示すとおり，図３と同じ命令コードc2〜c9に変換される。つまり，除算コードc30はループ文の外に，整数除算に対するアセンブリコードはループ文の中に埋め込まれる。
【００７５】
従って，このように変換されたアセンブリコード５４は，マイクロプロセッサに実行されると，for文の実行前に，除算コードdivにより，定数ｍ＝２32と変数ｂの除数ｍｂの除算演算を１回のみ実行され，その後，命令コードｃ３〜ｃ９が１００００回実行される。１００００回実行されるループ内の整数除算には，除算コードが含まれていない。
【００７６】
このように，整数除算の除数ｂが変数の場合は，コンパイラがコンパイル時にｍｂを演算することはできないので，アセンブリコード内にそのｍｂを演算する除算コードを埋め込む必要がある。但し，その整数除算が複数回繰り返されるループ内にある場合は，ループ外でｍｂを演算する除算コードを埋め込めば，その除算コードが長いサイクル数を要する場合でも，１回の整数除算に対しては僅かなサイクル数とみなすことが可能になる。
【００７７】
上記のコンパイル例は，ループ内の整数除算に限られず，ループ内の整数剰余算に対しても同様に適用することができる。その場合は，図１２のアセンブリコード５４内のコードｃ２〜ｃ９が，図９のコードｃ２〜ｃ９に置き換えられる。つまり，ｍｂ＝２32／ｂを演算する除算コードがfor文の初期ブロック内に埋め込まれ，for文内に図９のコードｃ２〜ｃ９が埋め込まれる。
【００７８】
上記実施の形態では，マイクロプロセッサの開発段階でのシステムを中心にして説明した。このような開発システムでは，通常コンパイラは，図示しない汎用コンピュータで実行されて，ソースプログラムをアセンブリコードに変換して，命令コードメモリ内に格納する。そして，その変換されたアセンブリコードが，開発中のマイクロプロセッサ（通常評価用マイクロプロセッサ）により実行され，所望の機能を実現できるか否かが評価される。
【００７９】
そして，評価完了後は，アセンブリコードをソースコードとして記憶した内蔵メモリとそれを実行する演算回路とを有するマイクロプロセッサが量産される。或いは，評価完了後は，アセンブリコードをソースコードとして記憶した外付けメモリとそれを実行する演算回路を有するマイクロプロセッサとからなるシステムが量産される。
【００８０】
しかしながら，本発明は上記開発システムに限定されず，コンパイラとマイクロプロセッサを含む汎用コンピュータシステムにも適用できる。その場合は，アプリケーションプログラムなどのソースプログラムが，汎用コンピュータシステムにより実行され，その実行時に，コンパイラが，ソースプログラム内の整数除算や整数剰余算を，除算命令コードを含まないオブジェクトコードに変換し，そのオブジェクトコードがマイクロプロセッサにより実行される。従って，実行サイクルを短くすることができる。
【００８１】
以上，実施の形態例をまとめると以下の付記の通りである。
【００８２】
（付記１）整数除算を有するソースプログラムから変換されたオブジェクトコードを実行するシステムにおいて，
Ｎビットで表される整数ａを整数の定数ｂで除す整数除算ｑ＝int（ａ÷ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算する第１の手順と，当該ｍｂを第１のレジスタに格納し，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，除算値ｑをｒｘ＜ｂの時にｑ＝ｑｘとしｒｘ≧ｂの時にｑ＝ｑｘ＋１とするオブジェクトコードを生成する第２の手順とをコンピュータに実行させるプログラムコードを有するコンパイラと，
前記第１のレジスタと乗算器と加減器とを含み当該コンパイラにより生成されたオブジェクトコードを実行する演算回路を有するマイクロプロセッサとを有することを特徴とするシステム。
【００８３】
（付記２）整数除算を有するソースプログラムから変換されたオブジェクトコードを実行するシステムにおいて，
繰り返しループ文内に，Ｎビットで表される整数ａを整数ｂで除す整数除算ｑ＝int（ａ÷ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算して当該ｍｂを第１のレジスタに格納するオブジェクトコードを前記ループ文の外に生成する第１の手順と，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，除算値ｑをｒｘ＜ｂの時にｑ＝ｑｘとしｒｘ≧ｂの時にｑ＝ｑｘ＋１とするオブジェクトコードを前記ループ文の内に生成する第２の手順とをコンピュータに実行させるプログラムコードを有するコンパイラと，
前記第１のレジスタと乗算器と加減器と除算器を含み当該コンパイラにより生成されたオブジェクトコードを実行する演算回路を有するマイクロプロセッサとを有することを特徴とするシステム。
【００８４】
（付記３）付記１または２において，
前記コンパイラの第２の手順におけるｑｘ＝int（ａ×ｍｂ÷ｍ）を演算するプログラムコードは，乗算値ａ×ｍｂが倍精度で上位及び下位のレジスタに格納された時の当該上位のレジスタ値を，ｑｘとすることを特徴とするシステム。
【００８５】
（付記４）付記１または２において，
整数ａ，ｂが符号付整数であって，
前記コンパイラの第２の手順で，前記整数ａ，ｂ両方が負の場合は，ａ，ｂ両方の符号を正に変換するオブジェクトコードを更に生成し，前記整数ａ，ｂの一方が負の場合は，当該負の符号を正に変換し，除算結果に負の符号を付加するオブジェクトコードを更に生成することを特徴とするシステム。
【００８６】
（付記５）整数剰余算を有するソースプログラムから変換されたオブジェクトコードを実行するシステムにおいて，
Ｎビットで表される整数ａを整数の定数ｂで除した時の除数を求める整数剰余算ｑ＝int（ａ mod ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算する第１の手順と，当該ｍｂを第１のレジスタに格納し，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，剰余値ｒをｒｘ＜ｂの時にｒ＝ｒｘとしｒｘ≧ｂの時にｒ＝ｒｘ−ｂとするオブジェクトコードを生成する第２の手順とをコンピュータに実行させるプログラムコードを有するコンパイラと，
前記第１のレジスタと乗算器と加減器とを含み当該コンパイラにより生成されたオブジェクトコードを実行する演算回路を有するマイクロプロセッサとを有することを特徴とするシステム。
【００８７】
（付記６）整数剰余算を有するソースプログラムから変換されたオブジェクトコードを実行するシステムにおいて，
繰り返しループ文内に，Ｎビットで表される整数ａを整数の定数ｂで除した時の除数を求める整数剰余算ｑ＝int（ａ mod ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算して当該ｍｂを第１のレジスタに格納するオブジェクトコードを前記ループ文の外に生成する第１の手順と，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，剰余値ｒをｒｘ＜ｂの時にｒ＝ｒｘとしｒｘ≧ｂの時にｒ＝ｒｘ−ｂとするオブジェクトコードを前記ループ文の内に生成する第２の手順とをコンピュータに実行させるプログラムコードを有するコンパイラと，
前記第１のレジスタと乗算器と加減器と除算器を含み当該コンパイラにより生成されたオブジェクトコードを実行する演算回路を有するマイクロプロセッサとを有することを特徴とするシステム。
【００８８】
（付記７）付記５または６において，
前記コンパイラの第２の手順におけるｑｘ＝int（ａ×ｍｂ÷ｍ）を演算するプログラムコードは，乗算値ａ×ｍｂが倍精度で上位及び下位のレジスタに格納された時の当該上位のレジスタ値を，ｑｘとすることを特徴とするシステム。
【００８９】
（付記８）付記５または６において，
整数ａ，ｂが符号付整数であって，
前記コンパイラの第２の手順で，前記整数ａ，ｂ両方が負の場合は，ａ，ｂ両方の符号を正に変換するオブジェクトコードを更に生成し，前記整数ａ，ｂの一方が負の場合は，当該負の符号を正に変換し，剰余算結果に負の符号を付加するオブジェクトコードを更に生成することを特徴とするシステム。
【００９０】
（付記９）付記１乃至６のいずれかにおいて，
前記マイクロプロセッサが評価用マイクロプロセッサであることを特徴とするマイクロプロセッサの評価システム。
【００９１】
（付記１０）整数除算を有するソースプログラムをマイクロプロセッサが実行可能なオブジェクトコードに変換するコンパイラにおいて，
Ｎビットで表される整数ａを整数の定数ｂで除す整数除算ｑ＝int（ａ÷ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，
ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算する第１の手順と，
当該ｍｂを前記マイクロプロセッサ内の第１のレジスタに格納し，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，除算値ｑをｒｘ＜ｂの時にｑ＝ｑｘとしｒｘ≧ｂの時にｑ＝ｑｘ＋１とするオブジェクトコードを生成する第２の手順と
をコンピュータに実行させるプログラムコードを有するコンパイラ。
【００９２】
（付記１１）整数除算を有するソースプログラムをマイクロプロセッサが実行可能なオブジェクトコードに変換するコンパイラにおいて，
繰り返しループ文内に，Ｎビットで表される整数ａを整数ｂで除す整数除算ｑ＝int（ａ÷ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，
ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算して当該ｍｂを第１のレジスタに格納するオブジェクトコードを前記ループ文の外に生成する第１の手順と，
ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，除算値ｑをｒｘ＜ｂの時にｑ＝ｑｘとしｒｘ≧ｂの時にｑ＝ｑｘ＋１とするオブジェクトコードを前記ループ文の内に生成する第２の手順と
をコンピュータに実行させるプログラムコードを有するコンパイラ。
【００９３】
（付記１２）整数剰余算を有するソースプログラムをマイクロプロセッサが実行可能なオブジェクトコードに変換するコンパイラにおいて，
Ｎビットで表される整数ａを整数の定数ｂで除した時の除数を求める整数剰余算ｑ＝int（ａ mod ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，
ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算する第１の手順と，
当該ｍｂを第１のレジスタに格納し，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，剰余値ｒをｒｘ＜ｂの時にｒ＝ｒｘとしｒｘ≧ｂの時にｒ＝ｒｘ−ｂとするオブジェクトコードを生成する第２の手順と
をコンピュータに実行させるプログラムコードを有するコンパイラ。
【００９４】
（付記１３）整数剰余算を有するソースプログラムをマイクロプロセッサが実行可能なオブジェクトコードに変換するコンパイラにおいて，
繰り返しループ文内に，Ｎビットで表される整数ａを整数の定数ｂで除した時の除数を求める整数剰余算ｑ＝int（ａ mod ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，
ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算して当該ｍｂを第１のレジスタに格納するオブジェクトコードを前記ループ文の外に生成する第１の手順と，
ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，剰余値ｒをｒｘ＜ｂの時にｒ＝ｒｘとしｒｘ≧ｂの時にｒ＝ｒｘ−ｂとするオブジェクトコードを前記ループ文の内に生成する第２の手順と
をコンピュータに実行させるプログラムコードを有するコンパイラ。
【００９５】
（付記１４）整数除算を有するソースプログラムからコンパイラにより変換されたオブジェクトコードを実行するマイクロプロセッサにおいて，
Ｎビットで表される整数ａを整数の定数ｂで除す整数除算ｑ＝int（ａ÷ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を第１のレジスタに格納し，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，除算値ｑをｒｘ＜ｂの時にｑ＝ｑｘとしｒｘ≧ｂの時にｑ＝ｑｘ＋１とするオブジェクトコードを記憶するメモリと
前記第１のレジスタと乗算器と加減器とを含み前記メモリ内の前記オブジェクトコードを実行する演算回路と
を有することを特徴とするマイクロプロセッサ。
【００９６】
（付記１５）整数除算を有するソースプログラムからコンパイラにより変換されたオブジェクトコードを実行するマイクロプロセッサにおいて，
繰り返しループ文内に，Ｎビットで表される整数ａを整数ｂで除す整数除算ｑ＝int（ａ÷ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，
前記ループ文の外に埋め込まれ，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算して当該ｍｂを第１のレジスタに格納するオブジェクトコードと，
前記ループ文の中に埋め込まれ，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，除算値ｑをｒｘ＜ｂの時にｑ＝ｑｘとしｒｘ≧ｂの時にｑ＝ｑｘ＋１とするオブジェクトコードとを記憶するメモリと，
前記第１のレジスタと乗算器と加減器と除算器を含み前記メモリ内の前記オブジェクトコードを実行する演算回路と
を有することを特徴とするマイクロプロセッサ。
【００９７】
（付記１６）整数剰余算を有するソースプログラムからコンパイラにより変換されたオブジェクトコードを実行するマイクロプロセッサにおいて，
Ｎビットで表される整数ａを整数の定数ｂで除した時の除数を求める整数剰余算ｑ＝int（ａ mod ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を第１のレジスタに格納し，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，剰余値ｒをｒｘ＜ｂの時にｒ＝ｒｘとしｒｘ≧ｂの時にｒ＝ｒｘ−ｂとするオブジェクトコードを記憶するメモリと，
前記第１のレジスタと乗算器と加減器とを含み前記メモリ内の前記オブジェクトコードを実行する演算回路と
を有することを特徴とするマイクロプロセッサ。
【００９８】
（付記１７）整数剰余算を有するソースプログラムからコンパイラにより変換されたオブジェクトコードを実行するマイクロプロセッサにおいて，
繰り返しループ文内に，Ｎビットで表される整数ａを整数の定数ｂで除した時の除数を求める整数剰余算ｑ＝int（ａ mod ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，
前記ループ文の外に埋め込まれ，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算して当該ｍｂを第１のレジスタに格納するオブジェクトコードと，
前記ループ文の中に埋め込まれ，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，剰余値ｒをｒｘ＜ｂの時にｒ＝ｒｘとしｒｘ≧ｂの時にｒ＝ｒｘ−ｂとするオブジェクトコードとを記憶するメモリと，
前記第１のレジスタと乗算器と加減器と除算器を含み前記メモリ内の前記オブジェクトコードを実行する演算回路と
を有することを特徴とするマイクロプロセッサ。
【００９９】
（付記１８）整数除算を有するソースプログラムからコンパイラにより変換されたオブジェクトコードを実行するマイクロプロセッサシステムにおいて，
Ｎビットで表される整数ａを整数の定数ｂで除す整数除算ｑ＝int（ａ÷ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を第１のレジスタに格納し，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，除算値ｑをｒｘ＜ｂの時にｑ＝ｑｘとしｒｘ≧ｂの時にｑ＝ｑｘ＋１とするオブジェクトコードを記憶するメモリと
前記第１のレジスタと乗算器と加減器とを含み前記メモリ内の前記オブジェクトコードを実行する演算回路を有するマイクロプロセッサと
を有することを特徴とするマイクロプロセッサシステム。
【０１００】
（付記１９）整数除算を有するソースプログラムからコンパイラにより変換されたオブジェクトコードを実行するマイクロプロセッサシステムにおいて，
繰り返しループ文内に，Ｎビットで表される整数ａを整数ｂで除す整数除算ｑ＝int（ａ÷ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，
前記ループ文の外に埋め込まれ，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算して当該ｍｂを第１のレジスタに格納するオブジェクトコードと，
前記ループ文の中に埋め込まれ，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，除算値ｑをｒｘ＜ｂの時にｑ＝ｑｘとしｒｘ≧ｂの時にｑ＝ｑｘ＋１とするオブジェクトコードとを記憶するメモリと，
前記第１のレジスタと乗算器と加減器と除算器を含み前記メモリ内の前記オブジェクトコードを実行する演算回路を有するマイクロプロセッサと
を有することを特徴とするマイクロプロセッサシステム。
【０１０１】
（付記２０）整数剰余算を有するソースプログラムからコンパイラにより変換されたオブジェクトコードを実行するマイクロプロセッサシステムにおいて，
Ｎビットで表される整数ａを整数の定数ｂで除した時の除数を求める整数剰余算ｑ＝int（ａ mod ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を第１のレジスタに格納し，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，剰余値ｒをｒｘ＜ｂの時にｒ＝ｒｘとしｒｘ≧ｂの時にｒ＝ｒｘ−ｂとするオブジェクトコードを記憶するメモリと，
前記第１のレジスタと乗算器と加減器とを含み前記メモリ内の前記オブジェクトコードを実行する演算回路を有するマイクロプロセッサと
を有することを特徴とするマイクロプロセッサシステム。
【０１０２】
（付記２１）整数剰余算を有するソースプログラムからコンパイラにより変換されたオブジェクトコードを実行するマイクロプロセッサシステムにおいて，
繰り返しループ文内に，Ｎビットで表される整数ａを整数の定数ｂで除した時の除数を求める整数剰余算ｑ＝int（ａ mod ｂ）（int（）は括弧内の小数点以下を切り捨てる関数）を含むソースプログラムに対して，
前記ループ文の外に埋め込まれ，ｍｂ＝int（ｍ÷ｂ）（但しｍ＝２N）を演算して当該ｍｂを第１のレジスタに格納するオブジェクトコードと，
前記ループ文の中に埋め込まれ，ｑｘ＝int（ａ×ｍｂ÷ｍ）を演算し，ｒｘ＝ａ−ｑｘ×ｂを演算し，剰余値ｒをｒｘ＜ｂの時にｒ＝ｒｘとしｒｘ≧ｂの時にｒ＝ｒｘ−ｂとするオブジェクトコードとを記憶するメモリと，
前記第１のレジスタと乗算器と加減器と除算器を含み前記メモリ内の前記オブジェクトコードを実行する演算回路を有するマイクロプロセッサと
を有することを特徴とするマイクロプロセッサシステム。
【０１０３】
【発明の効果】
以上，本発明によれば，コンパイラが整数除算または整数剰余算を除算命令を含まないオブジェクトコードに変換することができるので，そのオブジェクトコードを実行するマイクロプロセッサの実行サイクルを大幅に削減することができる。
【図面の簡単な説明】
【図１】従来の引き戻し法による除算の例を示す図である。
【図２】本実施の形態例におけるマイクロプロセッサの開発システムの全体構成図である。
【図３】本実施の形態における整数除算のコンパイル例を示す図である。
【図４】本実施の形態におけるコンパイラのフローチャート図である。
【図５】図３に示されたアセンブリコードASMのフローチャート図である。
【図６】本実施の形態におけるコンパイラの別のフローチャート図である。
【図７】Ｃ言語の初期化ブロックと実行本体を示す図である。
【図８】本実施の形態のコンパイラにより変換された剰余算のアセンブリコードのフローチャート図である。
【図９】本実施の形態のコンパイラにより変換された剰余算のアセンブリコードの例を示す図である。
【図１０】整数除算及び整数剰余算でｑ＝ｑｘ＋１になる例を示す図である。
【図１１】本実施の形態のコンパイラにより除数ｂ＜０の符号付整数除算が変換されたアセンブリコードの例を示す。
【図１２】ループ内の整数除算のコンパイル例を示す図である。
【符号の説明】
２      ソースコード，ソースプログラム
４      コンパイラ
６      命令コードメモリ，オブジェクトコードメモリ
１０    マイクロプロセッサ
１１    演算回路
２４    第１のレジスタ
ASM    アセンブリコード，オブジェクトコード
【図１】
0004712247.tif 000002
【図２】
0004712247.tif 000003
【図３】
0004712247.tif 000004
【図４】
0004712247.tif 000005
【図５】
0004712247.tif 000006
【図６】
0004712247.tif 000007
【図７】
0004712247.tif 000008
【図８】
0004712247.tif 000009
【図９】
0004712247.tif 000010
【図１０】
0004712247.tif 000011
【図１１】
0004712247.tif 000012
【図１２】
0004712247.tif 000013